HTML锚点标签的onclick属性未调用JavaScript函数

7
我们在运行DotNetNuke 5.4.4实例的DotNetNuke模块中,安装在“Server A”上,这是一台带有IIS 6.1和Internet Explorer 11的Windows Server 2008 R2标准机器。我们从“Server B”访问我们的DotNetNuke模块,该服务器运行Windows Server 2008标准版,使用Internet Explorer 9。
当我们在从Server B访问模块时单击具有onclick属性的锚html元素时,会出现问题。
带有onclick的anchor类似于:
<a onclick='OpenWindow("/DotNetNuke/DesktopModules/Module/View.aspx?dt=%c2%b2%c2");return false;' 
   href="http://000.00.0.0/DotNetNuke/DesktopModules/Module/View.aspx?dt=%c2%b2%c2"
   target='_blank'
   jQuery1431968126278="42">Doc name (SSN-SS-SSNN)</a>

而OpenWindow函数的定义如下

function OpenWindow(url) {
  window.open(url, '', 'top=15,scrollbars=yes,menubar=no,height=800,width=800,resizable=yes,toolbar=no,location=no,status=no');
}

正如您所看到的,我们有一个锚元素,其中包含一个onclick属性,它应该调用OpenWindow javascript函数,然后返回false,以便不发生单击锚(浏览到href)的默认操作。
然而,当我们单击此链接(仅在B服务器上)时,我们没有弹出窗口,OpenWindow函数中断点也没有被命中,并且浏览器通过打开一个新标签页(View.aspx)导航到href。这表明我引用的onclick属性的OpenWindow函数由于某种原因甚至都没有运行,尽管它在锚元素上,并且在任何其他服务器上都可以工作。
我已经尝试过的内容:
我比较了Server A DotNetNuke和我的本地开发者DotNetNuke实例之间的安全设置、web.config文件和DotNetNuke设置,并没有发现设置上的任何差异。
我比较了服务器B的Internet Explorer安全设置和我的安全设置,没有发现设置上的任何差异。
根据这个问题的评论建议,我试图将锚标记更改为span标记(删除了href和target属性),并且我看到了相同的行为。它在Server A和Dev上工作,但现在在Server B上什么也不做。我认为核心问题是onclick属性要么无法被识别,要么被阻止了。
我现在更进一步地将大多数...标记更改为具有特定类的...标记,然后使用jQuery 1.4.2将它们附加到jQuery(...).live('click', ...)处理程序上。这使得点击可以工作,但我仍然没有解决onclick属性被忽略的原因。
奇怪的是...
如果我打开开发人员工具(IE9),然后单击“编辑”按钮以打开和关闭编辑模式,所有锚标记和img标记上的onclick属性都会开始正常工作,直到重新加载页面。
如果我手动通过开发人员工具编辑onclick处理程序,例如删除onclick处理程序中的return false;,它将起作用,但如果我将return false;放回去,使其像我从未更改过一样,它就再次停止工作。
我试图弄清楚的问题:
我在检查这个问题时遇到了困难。我无法在我的开发者机器上复制它,并且在Server A上也可以工作,所以代码完全正常。我认为必须有一个设置我忽略了,但是在哪里?我不知道还要检查什么,我正在寻找想法。

你真的在使用IE9加载服务器B,而使用IE11加载其他服务器吗?这可能是IE9的问题。 - dandavis
它同样会发生在Firefox和Chrome中吗?他们会触发错误信息吗? - loli
你的锚点是动态创建的吗? - loli
是的,我认为它被视为动态创建的。我们有一个名为DocumentRowTemplate的ascx控件,在Details页面上进行注册,然后在<script>标签中以type="text/html"的形式包含,并且我们使用parseTemplate.js解析该HTML(在我开始工作之前就已经存在,所以不知道它来自哪里),parseTemplate.js会将JSON对象数据插入到我们放置代码块的位置,例如<#= ViewLink #>,这将成为上述整个锚点标签。 - Zack
我在另一个stackoverflow的问题中阅读到,当元素的onclick属性动态更改时,IE不会自动绑定click事件处理程序,因为它们不是DOM属性。 - loli
显示剩余15条评论
5个回答

1

我没有确切的答案,但我可以给你一个大致的想法,告诉你正在发生什么以及为什么会这样。

两个服务器没有获取到相同的内容——可能它们指向不同的CDN,也可能其中一个有一个旧的JavaScript文件——你需要逐一检查它们。

某个地方正在将一个onclick处理程序应用于所有锚标记。

起初我认为它是附加到body元素并针对您的链接的某些东西,但我排除了这种可能性。事实上,您可以编辑HTML并保存它,然后链接就会起作用,这意味着您正在分离附加到该链接元素的任何内容。

我建议:

  • 保存来自站点A的整个网页
  • 保存来自站点B的整个网页
  • 使用 diff 工具比较这两个目录。

我确实做到了这一点,除了两者之间为控件生成的ClientID值外,它们是相同的。 - Zack

0

你尝试过直接从onclick属性调用window.open吗?可能是因为在单击链接时函数尚未加载,因此会产生错误,因此不会调用return false,并且链接将继续其默认行为(在此情况下打开一个选项卡)。

如果是这种情况,请查看该函数的加载顺序,或尝试将其放置在代码的不同部分中(也许在onload事件中)。

检查一下你的Internet选项中是否显示JS错误。


我想我可能已经提到了,我可以复制并粘贴onclick属性值到控制台中,然后从那里完美运行,并打开窗口。我知道在链接被点击时加载了该函数,因为如果没有加载,则当从控制台运行脚本时窗口将不会打开。 - Zack
此外,在IE控制台中除了一个关于尝试应用不能应用的伪元素样式的错误之外,没有任何错误显示。 - Zack

0
可能有点幼稚,但是由于您正在作为弹出窗口打开窗口,因此可能会出现来自站点的URL被浏览器阻止的问题。如果您只替换

,它应该始终正常工作。
window.open(url, '', 'top=15,scrollbars=yes,menubar=no,height=800,width=800,resizable=yes,toolbar=no,location=no,status=no');

使用

window.open(url);

我在哪里可以找到你所描述的URL阻止?新窗口的URL位于同一站点中(托管在内部网络的IIS上),因此我认为如果我们能够访问主站点,则不应以你所描述的方式阻止新窗口。 - Zack
请查看此链接,它提供了我认为的问题的见解:https://dev59.com/t2kw5IYBdhLWcg3w_feJ - IBAD GORE

0

你尝试过将你的标签修改为:

<a href='javascript:MyFunction(this);' data-url='YourUrl'>Name</a>

MyFunction:  function(obj) {

var element = $(obj);
window.open(element.data("YourUrl"));
}

请注意,如果用户的浏览器配置为在选项卡中打开窗口,则没有解决方法。target="_blank"是我所知道的最好的实现此目的并通过GP强制浏览器行为的方式。

根据另一个问题上得到高赞的答案,将JavaScript放在href中是不好的。https://dev59.com/w3NA5IYBdhLWcg3wKaYx#11348403 然而,我已经使用jQuery将点击处理程序附加到<span>...元素,并且它们现在可以工作了。我仍然想知道为什么onclick没有触发JavaScript函数。如果我有时间,我可以尝试您具体的建议,将JavaScript放入href中,但我认为这不是一个有效的解决方案。 - Zack

0

听起来好像不在您提供的代码范围内。您提到打开IE9开发工具可以使其正常工作,我建议尝试添加控制台-polyfill,类似于:

if(typeof(console)=="undefined") {
  var console = {
    log : function() {},
    error : function() {},
    debug : function() {}
  };
}

如果您的代码将一些内容输出到控制台,然后JS代码在此事件之后停止工作,那么请注意可能是某个外部库,在加载后开始向控制台输出内容 - 这可能因缓存设置和/或网络延迟而在不同服务器上表现不同。

注意:为了正确测试这一点,请记得在加载任何JS代码或导入任何外部库之前将其添加到SCRIPT标签中。


我刚刚查看了代码,我们自己编写的JavaScript中没有任何console.log、console.error或console.debug调用。唯一的情况是在jQuery库中有一些console.log调用,但它们被包装在检查控制台是否定义的语句中。 - Zack
此外,仅仅打开开发工具是不够的,我必须打开编辑模式,然后再关闭它才能使其正常工作。 - Zack
好的,那个OpenWindow代码是10多年前使用的东西,也许你可以使用其他方法获得更好的结果,在某些情况下,弹出窗口拦截器可以阻止那种代码。 - Tero Tolonen
也许有人已经在那个服务器上启用了弹出窗口拦截器,很难说... http://answers.microsoft.com/en-us/ie/forum/ie9-windows_7/ie-9-pop-up-blocker-where-is-it/ee81c7f8-2b65-e011-8dfc-68b599b31bf5 - Tero Tolonen
弹出窗口拦截器有时会阻止那种代码。这会使得使用该代码的onclick基本上不存在吗?我看到的是onclick处理程序根本不会触发。在服务器B上的OpenWindow函数中没有命中断点。我认为如果弹出窗口拦截器在起作用,它至少会通知您已经阻止了一个弹出窗口,对吗? - Zack
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接