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中更新。。。