Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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方法在IE上失败_Jquery_Internet Explorer - Fatal编程技术网

jQuery方法在IE上失败

jQuery方法在IE上失败,jquery,internet-explorer,Jquery,Internet Explorer,我有这个方法: function replaceRightClickIcefacesMethod() { var oldName = jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu"); oldName = oldName.replace('Ice.Menu.contextMenuPopup', 'contextMenuPopupUpdated'); alert(oldName); jQuery(".si

我有这个方法:

function replaceRightClickIcefacesMethod() {
    var oldName = jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu");
    oldName = oldName.replace('Ice.Menu.contextMenuPopup', 'contextMenuPopupUpdated');
    alert(oldName);
    jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu", oldName);
}
哪一种在铬合金或FF上很好用。 但在IE上,我收到了这样的抱怨:

对象不支持此属性或方法

它把我指向第三条线

你看到附近有工作吗

注:我正在使用jQuery的最新版本(1.6)

更新

我也尝试过:

var oldName = jQuery(".singlePaneOfGlassBlock")[0].getAttribute('oncontextmenu');

但是IE仍然存在同样的问题这是IE8之前的IE版本的问题
attr()
映射到事件处理程序的
getAttribute
,但较旧的IEs有一个bug,导致
getAttribute
只返回DOM属性值而不是属性字符串

除了解析IE中的
outerHTML
字符串之外,我想不出一种解决方法,这是您真正不想做的:-)

对于所有浏览器,最好的方法是首先使用jQuery将
绑定到事件:

$(".singlePaneOfGlassBlock").bind("contextmenu", contextMenuPopupUpdated);
然后在需要时切换到另一个功能(
unbind
,然后再次
bind
):

function replaceRightClickIcefacesMethod() {
    $(".singlePaneOfGlassBlock").unbind().bind("contextmenu", function () {
        Ice.Menu.contextMenuPopup();
    });
}

如您所知,您可以使用
getAttributeNode()
获取节点的字符串值。为了设置属性,必须在赋值之前从字符串创建函数。解决这一问题的简单方法可能是:

function replaceRightClickIcefacesMethod() {
    var elem = jQuery(".singlePaneOfGlassBlock"),
        oldName = elem.attr("oncontextmenu"),
        fn = String;

    if (typeof oldName == "function")
        oldName = elem[0].getAttributeNode("oncontextmenu").value,
        fn = Function;

    oldName = oldName.replace('Ice.Menu.contextMenuPopup', 'contextMenuPopupUpdated');
    alert(oldName);
    elem[0].setAttribute("oncontextmenu", fn(oldName));
}

如果原始类型是字符串,则会将字符串传递到
string
,这不会产生实际效果,但如果原始类型是函数,则在将结果字符串设置为属性的新值之前,会将其传递到
function

我可以将其作为字符串而不是函数(在IE中是这样的):

var oldName = jQuery(".singlePaneOfGlassBlock")[0].getAttributeNode("oncontextmenu").value;

什么类型是attr(“oncontextmenu”)
?@Pekka它不总是字符串吗?@Pekka-它是1.6版以来的字符串不一定。在旧版本的IE中(带有
getAttribute
bug),它可能是事件处理程序的
函数
对象。因为您已经在使用jQuery,所以应该避免在HTML属性中绑定事件处理程序。您应该尽最大努力编写,在本例中,这意味着使用JS绑定JS事件处理程序。@Andy E-是的,我理解您的解释。在我的例子中,icefaces生成了oncontextmenu属性,我只尝试将对其方法的调用替换为mine(是的,肮脏的方式,但这是我可以考虑的唯一方式…因为这有一些随机ID的参数,我需要它们
oncontextmenu=Ice.Menu.ContextMenupOpp(事件'j_id1378:sectionContextMenu_sub','j_id1378:j_id1401:0:j_id1413:0:j_id1414');返回false;
@Andy E-我的主要问题是在IE8中,它返回函数而不是字符串(Firefox/Chrome)…@Cristian:如果你使用标准模式的doctype,在IE 8中应该没问题。但是,对于IE 7和6的兼容性,你没有太多的选择。@Andy E-再次感谢,我注意到你的更新方法在FF/Chrome上运行得很好,但是如果我在末尾添加这一点:
alert(jQuery(.singlePaneOfGlassBlock”).attr(“oncontextmenu”))
要检查IE是否使用了它返回的新值:未定义…请您再次检查一下好吗?我看不出您的方法有任何错误…@谢谢,用以下方法解决:
jQuery.each(elem,function(){this.setAttribute(“oncontextmenu”,fn(oldName));})
+1,我完全忘记了
getAttributeNode
。做得很好:-)@Andy E-是的,但仍然有一个问题我无法解决。似乎尝试更改此属性在IE中不起作用,即使这样也不行:
jQuery(.singlePaneOfGlassBlock”)[0]。setAttribute(“oncontextmenu”,oldName);
-我的意思是它工作正常,没有任何错误,即使检查新值也表明它已被更改,但当我检查它时,DOM没有在IE中更新。。。