我有这个方法:
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仍然存在同样的问题
答案 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;