【问题标题】:jquery .attr('onclick' does not work in IE7jquery .attr('onclick' 在 IE7 中不起作用
【发布时间】:2011-07-18 18:05:13
【问题描述】:

我知道,有几篇帖子几乎都有相同的问题,但所有提到的“修复”都对我不起作用。

但首先,这是我需要的: 我的应用程序中的某些表单必须通过激活编辑模式来启用。如果编辑模式处于活动状态,每个按钮(除了保存和中止)和页面上的链接不应该像通常那样做,但它应该给出一个消息,你必须改为结束编辑模式。

我的脚本: 启动编辑模式的按钮调用如下:

    function startEditMode(selector) {
            var disableAction = "return false;";
            jQuery("mySelectors").each(function(){
                    jQuery(this).bind('click', editModeOnClickHandler);
                    var onClickValue = "";
                    var onClick = jQuery(this).attr("onClick");
                    if ( onClick !== undefined ) onClickValue = "" + onClick;
                    jQuery(this).attr("onClick", disableAction + onClickValue);
            });
    }

要停止编辑模式,有一种方法可以逆转所有这些。 使用的处理程序“editModeOnClickHandler”只是显示消息并返回false;对我的问题并不重要。

所以.. 在 FF 和 IE8(也在 Chrome)中一切正常,但在 IE7 中却不行。正如我在其他帖子中看到的那样,onClick 在 IE7 中根本没有通过 .attr 进行修改。

到处张贴的解决方案: 使用事件绑定而不是操作属性。我希望我可以使用它!

这就是我不能的原因: 如您在上面的代码中所见,我尝试取消绑定所有处理程序并绑定我自己的处理程序。但这并不妨碍调用内联 onclick。 好吧,你可能会想,不要使用内联调用。但我的项目是使用 Primefaces 用 JSF 编写的,并且它的大部分代码都是动态生成的。总而言之,我无法阻止内联点击。

现在我被困住了。 我必须处理只能通过插入“return false”来阻止调用的内联 onclick;在前面,但这似乎在 IE7 中是不可能的。

有谁知道 IE7 的解决方法可以操纵 onclick 属性?再说一遍:我不能使用 .bind('click'... 或 .click( 因为它们无法停止原始的内联 onclick。

感谢所有回答! 亚历克斯

编辑 在您的帮助下,我发现在 IE7 中更改内联 onclick 可以使用this.onclick = ..。对此问题的正确处理已在此问题中得到解答:How to change onClick handler dynamically?

对于我在这里的具体问题,我没有找到合适的解决方案,因为我无法在不破坏它们的情况下操作原始的内联 onclick 值。出于这个原因,我更改了我的脚本,因此 IE7 禁用了所有按钮和链接以确保它们不再可点击。可以肯定的是,不要启用太多,我也要添加一个类名。

禁用所有尚未禁用的(在循环中调用):

if (!jQuery(this).attr('disabled')) {
    jQuery(this).attr('disabled', 'disabled');
    jQuery(this).addClass('editmodedisabled');
}

启用我以前禁用的东西:

if (jQuery(this).hasClass('editmodedisabled')) {
    jQuery(this).attr('disabled', '');
    jQuery(this).removeClass('editmodedisabled');
}

也许这对其他人有帮助

【问题讨论】:

  • 为什么 attr('onClick') 中的 C 大写?这也可能对您的情况有所帮助var clickEvents = $(element).data("events").click; $.each(clickEvents, function(key, handlerObj) { .. }
  • 感谢您的评论: 1. 我将 C 大写,因为某些原因 IE8 不会删除我添加的返回 false;没有 C :( 2. 我也尝试过使用 data("events") 但内联 onclick 似乎不是其中的一部分。我会再试一次。

标签: jquery internet-explorer-7 onclick attr


【解决方案1】:

我在 JSF 和 PrimeFaces 上遇到了和你一样的问题。这是我对这个问题的解决方案。

您可以禁用内联函数并根据需要恢复它们:

// get the element with jQuery
var element = $('#someId');

// get the current inline onclick function. This works under all browsers. 
var originalInlineClickHandler = element[0].onclick;

// define new click event which will replace the old one.
var click = function () {
    alert('You clicked me!');
}

// replace the old "onclick" event with the new one or in other words disable the click 
element[0].onclick = click;

// Now when clicking #someId element the new function will be executed and only it (the "click" function).
// Original inline function is gone already and those it will not be executed.

// Restore original inline function - a.k.a. enable the click event
element[0].onclick = originalInlineClickHandler.

这种方法适用于所有浏览器。问题是当您更改element.attr('onclick', callback);(意味着element[0].onclick = eval(element.attr('onclick')) 或类似的东西)时,所有现代浏览器都会更改element[0].onclick,而不是IE element[0].onclick 属性而不更改@987654326 @ 属性适用于所有浏览器。在这种情况下,onclick 属性与真实事件处理程序不对应。为了在所有浏览器下保持onclick 属性和属性同步,可以添加以下行:

// define new click event which will replace the old one.
var click = function () {
    alert('You clicked me!');
    return false;
}

// update the onclick attribute of the element. Under most browsers this will update and onclick property of the DOM element.
element.attr('onclick', click.toString());

// replace the old "onclick" event with the new one or in other words disable the click 
element[0].onclick = click;

【讨论】:

    【解决方案2】:

    您可以像这样获得内联onclickvar inlineHandler = this.onclick;

    function startEditMode(selector) {
            var disableAction = "return false;";
            jQuery("mySelectors").each(function(){
                    jQuery(this).bind('click', editModeOnClickHandler);
                    var onClickValue = "";
                    var onClick = this.onclick;
                    if ( onClick !== undefined ) onClickValue = "" + onClick;
                    jQuery(this).attr("onClick", disableAction + onClickValue);
            });
    }
    

    【讨论】:

    • 感谢您的帖子@Mrchief!这在一定程度上起到了作用.. 获取值不是问题,而是设置,但使用this.onclick = newvalue; 我也能够在 IE7 中修改内联 onclick。但现在我指的是另一个问题。 return false 的添加和删除;有效,但两个版本都获取值,在 IE7 中返回一个包装函数,如下所示:function anonymoues() { here is the real onclick }。将此作为字符串添加到 onclick 值可能会明显破坏它。
    • 仅供参考:使用this.getAttributeNode('onclick'),您可以在没有包装器的情况下获得 onclick 值,但我发现没有正确的方法可以在不破坏旧 js 的情况下更改 this.onclick .. 因为我找不到这样做的方法,我更改了我的脚本,如果是 IE7,我将禁用所有按钮和链接。太糟糕了,我现在不得不忍受 IE7 禁用的样式:(
    • 太有趣了,@Allanon。好在世界很快就会远离 IE7。
    【解决方案3】:

    这是 IE7 的一个已知问题。

    你试过这个workaround吗?

    另外,我也听说它可能就像使用 IE 的专有 event.returnValue 作为解决方法一样简单,但无法验证它是否有效。

    以下是您的代码将更改为的部分:

    var disableAction = "event.returnValue = false; return false;";
    

    【讨论】:

    • 感谢您的评论@namuol!据我所知,返回false;在链接内联 onclick 确实阻止了 IE7 中的默认行为,我的问题是/是我不能直接修改它。链接中提到的方法只是添加了一个新事件,我同意这种方式,仍然调用默认操作。我还通过搜索找到了 event.returnValue 几次,但这并没有给出线索,因为正如我所说,我无法修改 onclick,我的脚本只是无法更新内联 onclick IE7 中的 DOM。
    【解决方案4】:

    有同样的问题,但纯粹是href="javascript:some_js_function_without_returning_false();" 解决了它。 我知道这不是 onclick 的解决方案,但在某些情况下可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      相关资源
      最近更新 更多