Comment puis-je trouver DIV avec certains textes? Par exemple:
<div>
SomeText, text continues.
</div>
Essayer d'utiliser quelque chose comme ça:
var text = document.querySelector('div[SomeText*]').innerTEXT;
alert(text);
Mais bien sûr, cela ne fonctionnera pas. Comment puis-je le faire?
Réponses:
La question d'OP concerne le JavaScript brut et non jQuery . Bien qu'il y ait beaucoup de réponses et que j'aime la réponse @Pawan Nogariya , veuillez consulter cette alternative.
Vous pouvez utiliser XPATH en JavaScript. Plus d'informations sur l'article MDN ici .
La
document.evaluate()
méthode évalue une requête / expression XPATH. Vous pouvez donc y passer des expressions XPATH, parcourir le document HTML et localiser l'élément souhaité.Dans XPATH, vous pouvez sélectionner un élément, par le nœud de texte comme suit, qui obtient le
div
qui a le nœud de texte suivant.Pour obtenir un élément contenant du texte, utilisez ce qui suit:
le
contains()
méthode dans XPATH prend un nœud comme premier paramètre et le texte à rechercher comme deuxième paramètre.Vérifiez ce plunk ici , ceci est un exemple d'utilisation de XPATH en JavaScript
Voici un extrait de code:
Comme vous pouvez le voir, je peux saisir l'élément HTML et le modifier à ma guise.
la source
alert(thisHeading.textContent.replace(/.*You have login (.*) times.*/,'$1')) ;
.evaluate()
utilise. Veuillez me corriger si je me trompe), donc tout d'abord, vous ne pouvez pas rechercher quelque chose qui correspond à une expression régulière. Deuxièmement, la.textContent
propriété renvoie le nœud de texte de l'élément. Si vous voulez extraire une valeur de ce texte, vous devez la gérer explicitement, probablement en créant une sorte de fonction qui correspond à une expression régulière et renvoie la valeur correspondante dans le groupe. Pour cela, créez une nouvelle question sur un fil séparé.Vous pouvez utiliser cette solution assez simple:
Le
Array.from
convertira la NodeList en tableau (il existe plusieurs méthodes pour le faire, comme l'opérateur de propagation ou la tranche)Le résultat étant maintenant un tableau permet d'utiliser la
Array.find
méthode, vous pouvez alors mettre n'importe quel prédicat. Vous pouvez également vérifier le textContent avec un regex ou ce que vous voulez.Notez que
Array.from
etArray.find
sont des fonctionnalités ES2015. Te être compatible avec les anciens navigateurs comme IE10 sans transpilateur:la source
find
parfilter
.Depuis que vous l'avez demandé en javascript, vous pouvez avoir quelque chose comme ça
Et puis appelle ça comme ça
la source
[object HTMLDivElement],[object HTMLDivElement]
foundDivs[0].innerText
, aussi simple que çaCette solution effectue les opérations suivantes:
Utilise l'opérateur de diffusion ES6 pour convertir la liste de nœuds de tous les
div
s en tableau.Fournit une sortie si le
div
contient la chaîne de requête, pas seulement si elle correspond exactement à la chaîne de requête (ce qui se produit pour certaines des autres réponses). par exemple, il doit fournir une sortie non seulement pour «SomeText» mais aussi pour «SomeText, le texte continue».Sort le
div
contenu entier , pas seulement la chaîne de requête. Par exemple, pour «SomeText, le texte continue», il doit afficher toute la chaîne, pas seulement «SomeText».Permet à plusieurs
div
s de contenir la chaîne, pas seulement un seuldiv
.la source
innerHTML
de vos meilleurs<div>
s. Vous devez d'abord filtrer lesdiv
s qui contiennent des enfants. Aussi suspectdocument.getElementsByTagName('div')
peut être plus rapide, mais je ferais un benchmark pour être sûr.Vous voyez mieux si vous avez un élément parent du div que vous interrogez. Si c'est le cas, récupérez l'élément parent et effectuez un
element.querySelectorAll("div")
. Une fois que vous obtenez le,nodeList
appliquez un filtre sur lainnerText
propriété. Supposons qu'un élément parent du div que nous interrogeons a unid
ofcontainer
. Vous pouvez normalement accéder au conteneur directement à partir de l'identifiant, mais faisons-le de la bonne manière.Donc c'est tout.
la source
Si vous ne voulez pas utiliser jquery ou quelque chose comme ça, vous pouvez essayer ceci:
Une fois que vous avez les nœuds dans un tableau contenant le texte, vous pouvez faire quelque chose avec eux. Comme alerter chacun ou imprimer sur la console. Une mise en garde est que cela peut ne pas nécessairement saisir les div en soi, cela va saisir le parent du textnode qui contient le texte que vous recherchez.
la source
Comme il n'y a pas de limite à la longueur du texte dans un attribut de données, utilisez des attributs de données! Et puis, vous pouvez utiliser des sélecteurs css réguliers pour sélectionner vos éléments comme le souhaite l'OP.
Idéalement, vous effectuez la partie de configuration des attributs de données sur le chargement du document et affinez un peu le sélecteur querySelectorAll pour les performances.
la source
Google a cela comme un excellent résultat pour ceux qui ont besoin de trouver un nœud avec un certain texte. En guise de mise à jour, une liste de nœuds est désormais itérable dans les navigateurs modernes sans avoir à la convertir en tableau.
La solution peut utiliser forEach comme ça.
Cela a fonctionné pour moi pour faire un texte de recherche / remplacement dans une liste de nœuds lorsqu'un sélecteur normal ne pouvait pas choisir un seul nœud, j'ai donc dû filtrer chaque nœud un par un pour le vérifier pour l'aiguille.
la source
Utilisez XPath et document.evaluate (), et assurez-vous d'utiliser text () et non. pour l'argument contains (), ou bien vous aurez tout le HTML ou l'élément div le plus externe correspondant.
ou ignorez les espaces de début et de fin
ou correspondre à tous les types de balises (div, h1, p, etc.)
Puis itérer
la source
thisheading.setAttribute('class', "esubject")
Voici l'approche XPath mais avec un minimum de jargon XPath.
Sélection régulière basée sur les valeurs d'attribut d'élément (pour comparaison):
Sélection XPath basée sur le texte dans l'élément.
Et voici avec insensibilité à la casse puisque le texte est plus volatil:
la source
J'ai eu un problème similaire.
Fonction qui renvoie tous les éléments qui incluent le texte de arg.
Cela fonctionne pour moi:
}
la source
Il existe déjà de nombreuses solutions intéressantes ici. Cependant, pour fournir une solution plus rationalisée et une plus conforme à l'idée d'un comportement et d'une syntaxe de querySelector, j'ai opté pour une solution qui étend Object avec quelques fonctions prototypes. Ces deux fonctions utilisent des expressions régulières pour faire correspondre le texte, cependant, une chaîne peut être fournie en tant que paramètre de recherche libre.
Implémentez simplement les fonctions suivantes:
Avec ces fonctions implémentées, vous pouvez désormais passer des appels comme suit:
document.queryInnerTextAll('div.link', 'go');
Ce trouverait tous les divs contenant le lien classe avec le mot aller dans le innerText (par exemple. Aller à gauche ou Aller en bas ou à droite aller ou il de Go od )
document.queryInnerText('div.link', 'go');
Cela fonctionnerait exactement comme l'exemple ci-dessus, sauf que cela ne retournerait que le premier élément correspondant.
document.queryInnerTextAll('a', /^Next$/);
Rechercher tous les liens contenant le texte exact Suivant (sensible à la casse). Cela exclura les liens contenant le mot Suivant ainsi que d'autres textes.
document.queryInnerText('a', /next/i);
Recherchez le premier lien contenant le mot suivant , quelle que soit la casse (par exemple, Page suivante ou Aller à la suivante )
e = document.querySelector('#page');
e.queryInnerText('button', /Continue/);
Cela effectue une recherche dans un élément de conteneur pour un bouton contenant le texte, Continuer (sensible à la casse). (par exemple, Continuer ou Continuer au suivant mais pas continuer )
la source