IE上的jQuery方法失败

时间:2011-05-04 13:41:13

标签: jquery internet-explorer

我有这个方法:

function replaceRightClickIcefacesMethod() {
    var oldName = jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu");
    oldName = oldName.replace('Ice.Menu.contextMenuPopup', 'contextMenuPopupUpdated');
    alert(oldName);
    jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu", oldName);
}

在Chrome或FF上运行良好。 但是在IE上我收到了这个抱怨:

  

Object不支持此属性或方法

它指向我第3行..

你看到有什么解决方法吗?

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

更新

我也尝试过:

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

但IE仍然存在同样的问题

2 个答案:

答案 0 :(得分:1)

这是IE 8之前的Internet Explorer版本的问题。attr()映射到事件处理程序的getAttribute,但旧的IE有一个错误导致getAttribute只返回DOM属性值而不是属性字符串。

除了解析IE中的outerHTML字符串之外,我无法想办法解决这个问题,你真的不希望这样做: - )

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

$(".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设置为属性的新值。

答案 1 :(得分:1)

我能够将它作为字符串而不是函数(就像在IE中一样)得到它:

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