Comment testez-vous l'existence d'un élément sans utiliser la méthode getElementById
? J'ai mis en place un démo en direct pour référence. Je vais aussi imprimer le code ici aussi:
<!DOCTYPE html>
<html>
<head>
<script>
var getRandomID = function (size) {
var str = "",
i = 0,
chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
while (i < size) {
str += chars.substr(Math.floor(Math.random() * 62), 1);
i++;
}
return str;
},
isNull = function (element) {
var randomID = getRandomID(12),
savedID = (element.id)? element.id : null;
element.id = randomID;
var foundElm = document.getElementById(randomID);
element.removeAttribute('id');
if (savedID !== null) {
element.id = savedID;
}
return (foundElm) ? false : true;
};
window.onload = function () {
var image = document.getElementById("demo");
console.log('undefined', (typeof image === 'undefined') ? true : false); // false
console.log('null', (image === null) ? true : false); // false
console.log('find-by-id', isNull(image)); // false
image.parentNode.removeChild(image);
console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
console.log('null', (image === null) ? true : false); // false ~ should be true?
console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
};
</script>
</head>
<body>
<div id="demo"></div>
</body>
</html>
Fondamentalement, le code ci-dessus montre qu'un élément est stocké dans une variable puis supprimé de dom. Même si l'élément a été retiré du dom, la variable le conserve tel qu'il était lors de sa première déclaration. En d'autres termes, il ne s'agit pas d'une référence active à l'élément lui-même, mais plutôt d'une réplique. En conséquence, vérifier l'existence de la valeur de la variable (l'élément) donnera un résultat inattendu.
La fonction isNull
est ma tentative de vérifier l'existence d'éléments à partir d'une variable, et cela fonctionne, mais j'aimerais savoir s'il existe un moyen plus simple d'obtenir le même résultat.
PS: Je voudrais aussi savoir pourquoi les variables JavaScript se comportent de la sorte si quelqu'un connaît de bons articles sur le sujet.
Il semble que certaines personnes atterrissent ici et veulent simplement savoir si un élément existe (un peu différent de la question initiale).
C'est aussi simple que d'utiliser une méthode de sélection du navigateur et de la vérifier pour une valeur vérité (en général).
Par exemple, si mon élément avait une id
de "find-me"
, je pourrais simplement utiliser ...
var elementExists = document.getElementById("find-me");
Ceci est spécifié pour renvoyer une référence à l'élément ou null
. Si vous devez avoir une valeur booléenne, lancez simplement un !!
avant l'appel de la méthode.
En outre, vous pouvez utiliser certaines des nombreuses autres méthodes existantes pour rechercher des éléments, telles que (toutes les personnes vivant au large de document
):
querySelector()
/querySelectorAll()
getElementsByClassName()
getElementsByName()
Certaines de ces méthodes renvoient un NodeList
, vous devez donc vérifier sa propriété length
, car un NodeList
est un objet, et donc vérité .
Pour déterminer réellement si un élément existe dans le DOM visible (comme la question posée à l'origine), Csuwldcat fournit une meilleure solution que de rouler le vôtre (comme cette réponse le contenait). Autrement dit, utiliser la méthode contains()
sur les éléments DOM.
Vous pourriez l'utiliser comme si ...
document.body.contains(someReferenceToADomElement);
Pourquoi ne pas utiliser getElementById()
s'il est disponible?
En outre, voici un moyen simple de le faire avec jQuery:
if ($('#elementId').length > 0) {
// exists.
}
Et si vous ne pouvez pas utiliser de bibliothèques tierces, restez sur JavaScript:
var element = document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
// exists.
}
En utilisant Node.contains DOM API , vous pouvez facilement vérifier la présence de tout élément de la page (actuellement dans le DOM):
document.body.contains(YOUR_ELEMENT_HERE);
NOTE DE CROSS-BROWSER : l'objet document
de IE n'a pas de méthode contains()
- pour assurer la compatibilité entre les navigateurs, utilisez plutôt document.body.contains()
Je fais simplement:
if(document.getElementById("myElementId")){
alert("Element exists");
} else {
alert("Element does not exist");
}
Fonctionne pour moi et je n'ai encore eu aucun problème avec cela ....
Pourriez-vous simplement vérifier si la propriété parentNode est null?
c'est à dire.
if(!myElement.parentNode)
{
//node is NOT on the dom
}
else
{
//element is on the dom
}
De Réseau de développeurs Mozilla
Cette fonction vérifie si un élément est dans le corps de la page. As contient est inclusif et déterminer si le corps lui-même n'est pas l'intention de isInPage ce cas retourne explicitement la valeur false.
function isInPage(node) {
return (node === document.body) ? false : document.body.contains(node);
}
noeud est le noeud que nous voulons vérifier dans le fichier.
La solution la plus simple consiste à vérifier la propriété baseURI , définie uniquement lorsque l'élément est inséré dans le DOM, puis rétablie une chaîne vide lorsqu'elle est supprimée.
var div = document.querySelector('div');
// "div" is in the DOM, so should print a string
console.log(div.baseURI);
// Remove "div" from the DOM
document.body.removeChild(div);
// Should print an empty string
console.log(div.baseURI);
<div></div>
Un moyen simple de vérifier si un élément existe peut être utilisé avec le code d'une ligne de jQuery.
Voici le code ci-dessous:
if ($('#elementId').length > 0) {
// do stuff here if element exists
}else {
// do stuff here if element not exists
}
solution jQuery:
if ($('#elementId').length) {
// element exists, do something...
}
Cela fonctionnait pour moi avec jQuery et ne nécessitait pas l'utilisation de $('#elementId')[0]
.
la solution de csuwldcat semble être le meilleur du lot, mais une légère modification est nécessaire pour le faire fonctionner correctement avec un élément figurant dans un document différent de celui dans lequel le javascript est exécuté, tel qu'un iframe:
YOUR_ELEMENT.ownerDocument.body.contains(YOUR_ELEMENT);
Notez l'utilisation de la propriété ownerDocument
de l'élément, par opposition à la simple expression 'document
(qui peut ou non faire référence au document propriétaire de l'élément).
torazaburo a publié une méthode encore plus simple qui fonctionne également avec des éléments non locaux, mais malheureusement, il utilise la propriété baseURI
, qui n'est pas implémentée de manière uniforme sur tous les navigateurs (je ne pouvais obtenir que cela fonctionne dans les webkit). Je ne pouvais trouver aucune autre propriété d'élément ou de nœud pouvant être utilisée de la même manière, donc je pense que pour le moment, la solution ci-dessus est aussi performante que possible.
Une autre option element.closest :
element.closest('body') === null
Solution simple avec jQuery
$('body').find(yourElement)[0] != null
au lieu d'itérer les parents, vous pouvez simplement obtenir le rectangle de délimitation, composé de zéros lorsque l'élément est détaché de dom
function isInDOM(element) {
if (!element) return false;
var rect=element.getBoundingClientRect();
return (rect.top || rect.left || rect.height || rect.width)?true:false;
}
si vous voulez gérer la casse d'un élément de largeur et hauteur zéro à zéro en haut et à gauche, vous pouvez vérifier en itérant les parents jusqu'à la fin du document.
function isInDOM(element) {
if (!element) return false;
var rect=element.getBoundingClientRect();
if (element.top || element.left || element.height || element.width) return true;
while(element) {
if (element==document.body) return true;
element=element.parentNode;
}
return false;
}
Vous pouvez également utiliser jQuery.contains
, qui vérifie si un élément est un descendant d'un autre élément. J'ai transmis document
en tant qu'élément parent à rechercher, car tous les éléments présents dans la page DOM sont des descendants de document
.
_jQuery.contains( document, YOUR_ELEMENT)
_
// this will work prefect in all :D
function basedInDocument(el) {
// this function use for checking if this element in a real DOM
while (el.parentElement != null) {
if (el.parentElement == document.body) {
return true;
}
el = el.parentElement; // for check parent of
} // if loop break will return false mean element not in real DOM
return false;
}
essayez ceci, c'est la solution la plus fiable:
window.getComputedStyle(x).display == ""
c'est à dire:
var x = document.createElement("html")
var y = document.createElement("body")
var z = document.createElement("div")
x.appendChild(y);
y.appendChild(z);
z.style.display = "block";
console.log(z.closest("html") == null);//false
console.log(z.style.display);//block
console.log(window.getComputedStyle(z).display == "");//true
Vérifiez si l'élément est un enfant de <html>
via Node::contains()
:
const div = document.createElement('div');
document.documentElement.contains(div); //-> false
document.body.appendChild(div);
document.documentElement.contains(div); //-> true
J'ai couvert cela et plus dans is-dom-détaché .
Utilisez ceci:
var isInDOM = function(element, inBody) {
var _ = element, last;
while (_) {
last = _;
if (inBody && last === document.body) { break;}
_ = _.parentNode;
}
return inBody ? last === document.body : last === document;
};
Utilisez querySelectorAll
avec forEach
:
document.querySelectorAll('.my-element').forEach((element) => {
element.classList.add('new-class');
});
comme l'inverse de:
const myElement = document.querySelector('.my-element');
if (myElement) {
element.classList.add('new-class');
}
J'ai aimé cette approche
var elem = document.getElementById('elementID');
if( elem )do this
else
do that
Aussi
var elem = ((document.getElementById('elemID')) ? true:false);
if( elem ) do this
else
do that