【问题标题】:jQuery method fails on IEjQuery 方法在 IE 上失败
【发布时间】:2011-05-04 13:41:13
【问题描述】:

我有这个方法:

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 上,我收到了这样的抱怨:

对象不支持该属性或方法

它把我指向第三行..

你有什么解决办法吗?

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

更新

我也试过:

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

但 IE 仍然存在同样的问题

【问题讨论】:

  • attr("oncontextmenu")是什么类型?
  • @Pekka 不是一直都是字符串吗?
  • @Pekka - 从 1.6 版开始就是字符串
  • 不一定。在旧版本的 IE 中(带有 getAttribute 错误),它可能是事件处理程序的 function 对象。
  • 既然您已经在使用 jQuery,您应该避免在 HTML 属性中绑定事件处理程序。您应该尽最大努力尝试编写unobtrusive JavaScript,在这种情况下,这意味着 使用 JS 绑定 JS 事件处理程序。

标签: jquery internet-explorer


【解决方案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,然后再设置为新的属性的值。

【讨论】:

  • @Andy E - 是的,我明白你的解释。在我的情况下,icefaces 生成了 oncontextmenu 属性,我只尝试替换对他们的方法的调用来挖掘(是的,肮脏的方式,但这是我能想到的唯一方式......因为这有一些带有随机 id 的参数,我需要他们oncontextmenu=Ice.Menu.contextMenuPopup(event, 'j_id1378:sectionContextMenu_sub', 'j_id1378:j_id1401:0:j_id1413:0:j_id1414');return false;
  • @Andy E - 我的主要问题是在 IE8 中,它返回的是函数而不是字符串(Firefox/Chrome)...
  • @Cristian:如果您使用标准模式文档类型,在 IE 8 中应该没问题。但是,对于 IE 7 和 6 的兼容性,可供您选择的选项并不多。
  • @Andy E - 再次感谢,我注意到您的更新方法在 FF/Chrome 上运行良好,但如果我在最后添加:alert(jQuery(".singlePaneOfGlassBlock").attr("oncontextmenu")); 检查 IE 是否采用了新值它返回:未定义...你能再检查一次吗?我看不出你的方法有什么问题……
  • @谢谢,解决了每个问题:jQuery.each(elem, function(){ this.setAttribute("oncontextmenu", fn(oldName)); })
【解决方案2】:

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

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

【讨论】:

  • +1,我完全忘记了getAttributeNode。搞清楚它做得很好:-)
  • @Andy E - 是的,但仍然是一个我无法弄清楚的问题。似乎尝试更改此属性在 IE 中不起作用,即使这也不起作用:jQuery(".singlePaneOfGlassBlock")[0].setAttribute("oncontextmenu",oldName); - 我的意思是它没有任何错误,即使检查新值也表明它已被更改,但 DOM,当我检查它时,在 IE 中没有更新...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多