2012-03-30 9 views
5

Code: http://jsfiddle.net/4hV6c/4/ nur jede Auswahl treffen, und Sie erhalten einen Skriptfehler in IE8jQuery unterstützt .has in IE8 nicht? Was ist eine Arbeit?

Ich versuche, dies zu tun bekommen:

$(end_node.parentNode).has(start_node) 

die in modernen Browsern (Chrom, ff, Oper usw.) gibt [] zurück, wenn start_node nicht in end_node.parentNode ist, und gibt das Element zurück (ich vergesse was), wenn es gefunden wird.

Nun ist end_node ein Textelement und der parentNode ist eine tatsächliche DOM-Entität. IE wird .has on nur $(end_node).has(start_node) ausführen, aber das ist offensichtlich ein anderes Verhalten.

Gibt es eine Arbeit um dies zu erreichen?

  • In IE wird die Geige Fehler, andere Browser werden Sie mit einem booleschen Wert alarmieren.
  • UPDATE: hier ist ein Wort um, dass .has() für mein spezifisches Szenario überschreibt .. nicht sicher, ob es für alle Fälle von .has funktioniert, da ich sie nicht alle kenne. http://jsfiddle.net/8F57r/13/

    +1

    Wenn das wirklich wahr wäre, wäre es eine große Sache und hätte auch einen jQuery-Fehlerbericht, nein? – Sparky

    +0

    die Geige lügt nicht. = \ Ich werde sehen, ob ich jemanden bei jQuery kontaktieren/dies irgendwo posten kann. – NullVoxPopuli

    +0

    Was ist die beabsichtigte Reihenfolge der Operation und erwartetes Ergebnis in Ihrem jsFiddle? Ich bekomme eine Warnung, die "falsch" enthält, egal was ich mache. Verwenden von Safari – Sparky

    Antwort

    4

    Das Problem ist nicht jQuery

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

    aber Rennen, die folgende löst eine Ausnahme http://jsfiddle.net/mendesjuan/4hV6c/8/

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

    Das bedeutet, dass Sie keinen Textknoten in $.has übergeben können. Sie sollten einen Fehler mit jQuery

    Die Zeile Datei, die der folgenden Meldung geben wird erroring aus

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

    dass die contains Methode auf einem Knoten zu nennen versucht. Was das bedeutet ist, dass dies wirklich ein IE-Bug ist, den jQuery nicht umgangen hat. Ich habe das Problem reproduziert ohne $.hashttp://jsfiddle.net/4hV6c/10/

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

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

    es ist nicht nur erkennen, ob es ein Tag hat, muss ich für das spezifische Element zu überprüfen. Was passiert, wenn mehrere Spannen vorhanden sind? Weicht auch der jQuery-Selektor nicht davon ab? – NullVoxPopuli

    +0

    Die Überprüfung auf ein bestimmtes Element funktioniert auch gut, siehe mein Update –

    +0

    das Problem ist, dass in End8 End_node.parentNode (was ein unbestimmtes DOM-Element für mich ist, wie es ein div, span oder was auch immer sein könnte) a .has() Methode. Du rufst .has() ein EVERY div ... ALSO, du schreibst hart, um das erste Spannen zu bekommen ... – NullVoxPopuli

    1

    Sie könnten immer DIY? :) Ich höre rekursive Kind-Indizierung sehr schnell und ist ziemlich einfach zu implementieren.

    Sehen Sie hier für eine hervorragende Tutorial:

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

    +0

    @KirkWoll - "Eingeschickt"? –

    +0

    @KirkWoll - Siehe Link für Details, es ist eigentlich ziemlich einfach zu tun. Anstatt den ganzen Baum zu bauen, können Sie einfach überprüfen, ob der Knoten der richtige ist. Auf der Grundlage der obigen Antwort von Juan scheint es jedoch so zu sein, dass IE ".has()" unterstützt, was dies für das OP unnötig macht. –

    +1

    Dies widerspricht der Idee von jQuery, bei der all die dreckigen Dinge für Sie erledigt werden, damit Ihr eigener Code sauberer bleibt. – NullVoxPopuli

    0

    Was finden Sie, was Sie anrufen möchten, zu benötigen?

    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); 
    });​ 
    
    +0

    "Objekt unterstützt diese Eigenschaft oder Methode nicht" = ( funktioniert in nicht ie8 though. = \ – NullVoxPopuli