5

代码: 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 将执行 .has ,$(end_node).has(start_node)但这显然是不同的行为。

有没有办法让这个工作?

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

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

4

3 回答 3

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) );
});
于 2012-03-30T16:51:38.750 回答
1

你总是可以DIY吗?:) 我听说递归子索引工作得很快,而且很容易实现。

请参阅此处以获取出色的教程:

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

于 2012-03-30T16:49:43.533 回答
0

find 做你想做的事吗?

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);
});​
于 2012-03-30T17:00:46.110 回答