5

コード:http : //jsfiddle.net/4hV6c/4/選択するだけで、ie8でスクリプトエラーが発生します

私はこれをやろうとしています:

$(end_node.parentNode).has(start_node)

最近のブラウザ(chrome、ff、operaなど)では、start_nodeがend_node.parentNodeにない場合は[]を返し、見つかった場合は要素(どちらを忘れたか)を返します。

現在、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のバグであるということです。http://jsfiddle.net/4hV6c/10/に電話することなく問題を再現しました$.has

// 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

あなたが望むことを見つけますか?

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 に答える