HTML锚标记的onclick属性不会调用javascript函数

时间:2015-05-18 17:14:57

标签: javascript html asp.net onclick dotnetnuke

我们有一个DotNetNuke模块在DotNetNuke 5.4.4的实例中运行,安装在“Server A”上,这是一台带有IIS 6.1和Internet Explorer 11的Windows Server 2008 R2 Standard机器。

我们使用Internet Explorer 9从运行Windows Server 2008 Standard的“Server B”访问我们的DotNetNuke模块。

当我们在服务器B上访问我们的模块时,单击具有onclick属性的锚点html元素时会发生此问题。

onclick的锚点如下:

<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函数中没有断点,浏览器通过打开一个新选项卡导航到href (View.aspx)。这告诉我,onclick属性引用的OpenWindow函数由于某种原因甚至没有运行,即使它位于anchor元素上,并且可以在任何其他服务器上运行。

我尝试了什么

我比较了服务器A DotNetNuke和我的本地开发人员DotNetNuke实例之间的安全设置,web.config文件和DotNetNuke设置,发现设置没有差异。

我将服务器B Internet Explorer安全设置与我的安全设置进行了比较,发现设置没有差异。

根据对此问题的评论建议,我尝试将锚标记更改为span标记(删除了href和目标属性),我看到了相同的行为。它适用于服务器A和开发人员,但现在不在服务器B上执行任何操作。 我认为核心问题是onclick属性无法被识别,或者被某种方式阻止。

我现在更进一步,将大多数<a>...</a>标记更改为<span>...</span>标记,使用特定的类,然后我将jQuery(...).live('click', ...)处理程序附加到(使用jQuery 1.4.2) 。 允许点击工作,但我仍然无法解决为什么忽略onclick属性。

奇怪的是什么......

如果我打开开发人员工具(IE9),然后单击“编辑”按钮再次打开和关闭编辑模式,锚标签和img标签上的所有onclick属性都会正常工作,直到我重新加载页面。

如果我通过开发人员工具以任何方式手动编辑onclick处理程序,例如从onclick处理程序中删除return false;,它将起作用,但是如果我将return false;重新设置为使用它就像我从未改变任何东西一样,它再次停止工作。

我想弄清楚

我正在检查要解决这个问题的方法。我无法在我的开发人员计算机上重现它,它也适用于服务器A,所以代码工作得非常好。 我想我必须有一个设置,我忽略了某个地方,但在哪里?我不知道还有什么可以检查,我正在寻找想法。

5 个答案:

答案 0 :(得分:1)

我没有确切的答案,但我可以让你大致了解发生了什么以及为什么。

这两个服务器没有得到相同的内容 - 也许它们指向不同的CDN,也许有一个旧文件的JavaScript文件 - 你必须逐个遍历它们。

某个地方,正在向所有锚标签应用onclick处理程序。

起初我认为它是贴在身体元素上的东西,并以你的链接为目标,但我已经排除了这一点。您可以编辑HTML并保存它然后链接工作的事实意味着您正在分离附加到该链接元素的任何内容。

我会:

  • 保存整个网站A
  • 保存Site B的整个网页
  • 针对这两个目录运行-lgomp工具。

答案 1 :(得分:0)

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

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

检查您是否在Internet选项中显示JS错误。

答案 2 :(得分: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);

答案 3 :(得分:0)

您是否尝试将代码修改为:

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

MyFunction:  function(obj) {

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

请注意,如果用户的浏览器配置为以选项卡形式打开Windows,则无法解决方法。 target =“_ blank”是我所知道的实现此目的并通过GP强制执行浏览器行为的最佳方式。

答案 4 :(得分:0)

听起来不像你提供的代码范围内的东西。你提到打开IE9 dev-tools使它工作,我建议尝试添加console -polyfill,如:

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

以防万一你的代码将一些代码输出到控制台中,并且JS代码在该事件之后停止工作。可能是一些外部库,在加载后开始向控制台输出内容 - 由于缓存设置和/或网络延迟,可能在不同服务器上的工作方式不同。

注意:要正确测试,请记住在加载任何JS代码或导入任何外部库之前将其添加到SCRIPT标记中。