Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery.attr(';onclick';在IE7中不起作用_Jquery_Internet Explorer 7_Onclick_Attr - Fatal编程技术网

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

jquery.attr(';onclick';在IE7中不起作用,jquery,internet-explorer-7,onclick,attr,Jquery,Internet Explorer 7,Onclick,Attr,我知道,有好几篇帖子几乎都有相同的问题,但是所有提到的“修复”对我来说都不起作用 但首先,我需要的是: 我的应用程序中的某些表单必须通过激活编辑模式来启用。如果编辑模式处于活动状态,则页面上的每个按钮(保存和中止除外)和链接都不应执行其正常操作,但它应显示一条消息,提示您必须改为结束编辑模式 我的剧本: 启动编辑模式的按钮调用以下命令: function startEditMode(selector) { var disableAction = "return f

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

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

我的剧本: 启动编辑模式的按钮调用以下命令:

    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中没有。正如我在其他帖子中看到的那样,在IE7中通过.attr对onClick进行了修改

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

以下是我无法回答的原因: 正如您在上面的代码中看到的,我尝试解除所有处理程序的绑定并绑定我自己的处理程序,但这并不能阻止内联onclick被调用。 好吧,你可能会想,不要使用内联调用..但是我的项目是用JSF编写的,使用Primefaces,它的大部分代码是动态生成的。总之,我不可能阻止内联onclick

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

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

谢谢你的回答! 亚历克斯

编辑 在您的帮助下,我发现在IE7中,通过
this.onclick=..
更改内联onclick是可能的。正确的处理方法在这个问题中得到了回答:

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

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

启用我以前禁用的内容:

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

也许这对其他人有帮助

这是IE7的一个已知问题

你试过这个吗

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

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

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

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

我在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]。当您更改
element.attr('onclick',callback);
(意思是
element[0].onclick=eval(element.attr('onclick'))
或类似的内容时,onclick
)会发生变化,但IE不会出现同样的问题,而是纯粹的
href=“javascript:some_js_function_而不返回_false();”
解决了。
我知道这不是onclick的解决方案,但在某些情况下可能会有所帮助。

为什么在attr('onclick')中大写C?在您的情况下,这可能会很有帮助。
var clickEvents=$(元素)。数据(“事件”)。click;$。每个(clickEvents,function(key,handlerObj){..}
感谢您的评论:1.我将C大写,因为出于某种原因IE8不会删除我添加的返回false;没有C:(2.我还尝试了使用数据(“事件”)但是内联onclick似乎不是其中的一部分。我会再试一次。谢谢你的帖子@Mrchief!这部分起到了作用。获取值不是问题,而是设置,但是使用
this.onclick=newvalue;
我也可以在IE7中修改内联onclick。但是现在我指向另一个问题。添加和删除return false;是可行的,但两个版本都要在IE7中返回一个包装函数,如下所示:
function anonymouses(){这是真正的onclick}
。将其作为字符串添加到onclick值可能会明显破坏它。仅供参考:使用
this.getAttributeNode('onclick'))
您在没有包装的情况下获得onclick值,但我找不到正确的方法来更改此值。onclick不破坏旧js。因为我找不到方法,所以我更改了脚本,如果是IE7,我将禁用所有按钮和链接。太糟糕了,我现在不得不使用IE7禁用的样式:(非常有趣,@Allanon。幸好世界很快就会远离IE7。谢谢你评论@namuol!据我所知,返回false;在链接内联onclick确实阻止了IE7中的默认行为,我的问题是/是我不能直接修改它。链接中提到的方法只是添加了一个新事件,我同意这样做,默认操作仍然被调用。我还通过搜索多次找到event.returnValue,但这并没有提供线索,因为正如我所说的,我无法修改onclick,我的脚本无法在IE7的DOM中更新内联onclick。
// 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.
// 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;