jquery .attr('onclick'在IE7中不起作用

时间:2011-07-18 18:05:14

标签: jquery internet-explorer-7 onclick attr

我知道,有几个帖子几乎有相同的问题,但所有提到的"修复"不要为我工作。

但首先,这就是我需要的: 必须通过激活编辑模式启用我的应用程序中的某些表单。如果编辑模式处于活动状态,则每个按钮(保存和中止除外)和页面上的链接都不应该执行它的正常操作,但它应该给出一条消息,您必须改为结束编辑模式。

我的剧本: 启动编辑模式的按钮调用:

    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编写,其大部分代码都是动态生成的。总而言之,我没有可能阻止内联onclicks。

现在我被卡住了。 我必须处理内联onclicks,只能通过插入"返回false来防止它被调用;"在前面,但这似乎不可能与IE7。

有没有人知道IE7的解决方法能够操作onclick属性?再说一遍:我不能使用.bind('点击' ...或.click(因为他们无法阻止原始内联点击。

感谢所有答案! 亚历

修改 在我的帮助下,我发现,在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');
}

也许这可以帮助其他人

5 个答案:

答案 0 :(得分:5)

我和你一样遇到过与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[0].onclick(意味着element.attr('onclick', callback);或类似的东西)时,所有现代浏览器都会更改element[0].onclick = eval(element.attr('onclick')),但不会更改IE< = IE 7.但是如果您更改{{1}没有更改element[0].onclick属性的属性将在所有浏览器下运行。在这种情况下,onclick属性与真实事件处理程序不对应。要在所有浏览器下保持onclick属性和属性同步,可以添加以下行:

onclick

答案 1 :(得分:1)

您可以像这样获取内联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);
        });
}

答案 2 :(得分:0)

这是IE7的一个已知问题。

你试过这个workaround吗?

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

以下代码的哪一部分将更改为:

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

答案 3 :(得分:0)

This看起来像你在找什么:

var clickEvents = $(element).data("events").click; 
jQuery.each(clickEvents, function(key, handlerObj) {     
   alert(handlerObj.handler)  // also available: handlerObj.type, handlerObj.namespace 
})

对Crescent Fresh的信用。

答案 4 :(得分:0)

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