2012-10-08 6 views
5

Nehmen wir an, ich habe ein DOM-Element, als ein Parameter eines Ereignisses, zum Beispiel klicken.Wie überprüft man ein aus DOM abgerufenes Element immer noch in DOM

$(document).click(function() { 
    myElement = $(this); 
}); 

Wie kann ich später überprüfen, dass sich myElement noch im DOM befindet? Ich kann .length oder andere Dinge nicht verwenden, weil es sich in diesem Moment immer noch auf das gespeicherte Element und den Status des DOM bezieht, richtig?

Antwort

6

Sie übergeordnetes Element überprüfen:

function isInDom(obj) { 
    var root = obj.parents('html')[0] 
    return !!(root && root === document.documentElement); 
} 


if(isInDom(myElement)) { 
    ... 
} 

Hier arbeiten Geige: http://jsfiddle.net/vnxhQ/7/

+0

diese Tests, ob das Element ** ** Eltern hatte, wenn es gespeichert wurde, hat es nichts mit dem zu tun, ob das Element im DOM ist nach wie vor. – jbabey

+1

nein, testet dieses Element NOW hat Eltern . – Inferpse

+0

'myElement' muss ein jQuery-Objekt Einwickeln das Elements sein, obwohl .. aber ja, ich nicht kaufen, dass dies nichts zu tun hat, wenn es gespeichert wurde, auch nicht. – JayC

0

Um zu testen, ob ein Element noch in dem DOM vorhanden ist, müssen Sie das DOM wieder kriechen:

// store it in some shared scope 
var myElement; 
$(document).click(function() { 
    myElement = $(this); 
}); 

// sometime later... 
if ($('#' + myElement.attr('id')).length > 0) { 
    // it still exists 
} else { 
    // it no longer exists 
} 

Ihre angeklickten Elemente müssen alle id s haben, damit dies funktioniert. Eine Klasse oder ein anderer Selektor könnte stattdessen verwendet werden.

Bearbeiten: siehe this question für Ideen, wie Sie einen eindeutigen Selektor für ein bestimmtes DOM-Element erhalten.

1

Dies wird vorausgesetzt, Sie die ID der möglichen anklickbare Elemente

var idRef; 
$(document).on('click', function() { 
    idRef = this.id;  
}); 

später ..

var exists = document.getElementById(idRef).length > 0; 
0

können Sie die undokumentierte .selector Eigenschaft eines jQuery-Objekt zu sehen, ob ein gesetzt hätte Element ist immer noch im DOM, unter der Bedingung, dass es eine eindeutige ID verwendet. Offensichtliche

http://jsfiddle.net/mblase75/CC2Vn/

$two = $('#two'); 
console.log($($two.selector).length); // 1 
$two.remove(); 
console.log($($two.selector).length); // 0 

Siehe this question für mehr darüber, wie die Wähler eines jQuery-Objekt zu erhalten, die das DOM-Element nicht eindeutig beschreiben kann oder (n) enthält.

3

Die einzige zuverlässige Weise, die ich bisher sehen, ist zu prüfen, ob das Element innerhalb document.getElementsByTagName('*')

function isInDoc(element) 
{ 
    var elements=document.getElementsByTagName(element.tagName); 
    for(var i=0;i<elements.length;++i) 
    { 
    if(elements[i]===element)return true; 
    } 
    return false; 
} 

Demo ist: http://jsfiddle.net/doktormolle/hX8eN/


<edit>

Node.contains() scheint unterstützt werden von allen gängigen Browsern, so würde ich es schließlich empfehlen gest dies:

if(document.documentElement.contains(myElement)) 

Demo: http://jsfiddle.net/doktormolle/LZUx3/

+0

Ugh .... wirklich? Das sind viele Tags. Vielleicht könntest du die Antwort von Inferpse mit deiner kombinieren, um 1. zu testen, ob das Element von einem Body-Tag abhängt. 2. Testen Sie, ob das Body-Tag * des * Elements das Body-Tag des Dokuments ist. – JayC

+0

(oder können Dokumente mehr als ein Body-Tag ??) – JayC

+0

meine Antwort zur Klärung Siehe auf das, was ich meinte. – JayC

0

einfach etwas in den Kampf hinzuzufügen:

Das ist wirklich die Antwort von Inferpse leicht für Dr. gezwicktMolle Ecke bei einer anderen Körperelement zu schaffen, das das Element aus dem allgemeinen DOM-Baum entfernt beherbergen könnte (oder, natürlich, vielleicht war das Element nie im DOM an erster Stelle.) Wie Inferspe Antwort, dauert es ein jQuery gewickeltes Objekt, nicht das Element selbst.

function isInDom(jqobj) { 
    var someBody = jqobj.parents('body'); 
    return someBody.length > 0 && someBody.get(0) === document.body; 
} 
​ 

Ich muss zugeben, ich habe Probleme herauszufinden, wie ich versuchen könnte, das zu brechen.

Edit: Ach ja ... jsFiddle: http://jsfiddle.net/vnxhQ/5/

bearbeiten II: natürlich, wenn wir nicht über Link oder Script-Elemente (etwas sprechen, das in die head gehen könnte, nicht die body, ich denke, das könnte funktionieren: -/

1

vielleicht eine bessere Art und Weise Inferpse die Funktion der Umsetzung ist durch die Erweiterung jQuery:

jQuery.fn.extend({ 
    isInDom: function() { 
     var root = this.eq(0).parents('html')[0]; 
     return !!(root && root === document.documentElement); 
    } 
}) 

Verbrauch:

$("div").isInDom() //returns true if your dom contains a div 
$("<div />").isInDom() //returns false 
$().isInDom() //returns false 
Verwandte Themen