在IE8中jQuery不支持.has?什么是解决方案?

时间:2012-03-30 16:46:53

标签: javascript jquery internet-explorer dom rangy

代码:http://jsfiddle.net/4hV6c/4/ 只做任何选择,你会在ie8

中得到一个脚本错误

我正在尝试这样做:

$(end_node.parentNode).has(start_node)
如果start_node不在end_node.parentNode中,那么在现代浏览器(chrome,ff,opera等)中返回[],如果找到则返回元素(我忘了哪个)。

现在,end_node是一个文本元素,而parentNode是一个实际的DOM实体。 IE将仅在$(end_node).has(start_node)执行.has,但这显然是不同的行为。

是否有解决这个问题的工作?

  • 在IE中,小提琴会出错,其他浏览器会提示你一个布尔值。

更新:这里有一个词可以覆盖.has()用于我的特定场景..不确定它是否适用于.has的所有情况,因为我不知道所有情况。 http://jsfiddle.net/8F57r/13/

3 个答案:

答案 0 :(得分:4)

问题是而不是 jQuery

运行

console.log( $("div:has(span)").html() );
console.log( $("div").has($("span")[0]).html() );

但是,以下内容会引发异常http://jsfiddle.net/mendesjuan/4hV6c/8/

var textNode =  $("span")[0].childNodes[0];
$("div").has(textNode);

这意味着您无法将文本节点传递到$.has。您应该使用jQuery提交错误

错误输出的行正在发出以下消息

No such interface supported jquery-1.7.1.js, line 5244 character 3

这是尝试在节点上调用contains方法。这意味着这真的是一个jQuery尚未解决的IE漏洞。我已经重现了这个问题,而无需致电$.has http://jsfiddle.net/4hV6c/10/

// This is broken in IE
var textNode =  $("span")[0].childNodes[0];
var divNode = $("div")[0];
divNode.contains(textNode);

解决方法 http://jsfiddle.net/4hV6c/12/

function contains(outer, inner) {
   var current = inner;
    do {
        if (current == outer) {
           return true;
        }
    } while((current = current.parentNode) != document.body);

    return false;

}
rangy.init();

$(document).bind("mouseup", function() {
    var a = rangy.getSelection();
    start_node = a.anchorNode;
    end_node = a.focusNode;
    var b = a.getRangeAt(0);
    var c = b.commonAncestorContainer;
    b.selectNodeContents(c);
    a.setSingleRange(b);
    alert( contains( end_node.parentNode, start_node) );
});

答案 1 :(得分:1)

你可以随时DIY吗? :)我听到递归子索引工作很快,很容易实现。

请在此处查看优秀教程:

http://blog.swapnilsarwe.com/javascript-traversing-html-dom-recursively.html

答案 2 :(得分:0)

找到你想要的东西吗?

rangy.init();

$(document).bind("mouseup", function() {
    var a = rangy.getSelection();
    start_node = a.anchorNode;
    end_node = a.focusNode;
    var b = a.getRangeAt(0);
    var c = b.commonAncestorContainer;
    b.selectNodeContents(c);
    a.setSingleRange(b);
    alert($(end_node.parentNode).find(start_node).length > 0);
});​