2013-07-22 15 views
9

Sto scrivendo un utente che rimuoverà elementi da una pagina che contiene una determinata stringa.Equivalente javascript nativo di jQuery: contiene() selettore

Se capisco correttamente la funzione contains() di jQuery, mi sembra lo strumento corretto per il lavoro.

Sfortunatamente, dal momento che la pagina su cui eseguirò il codice utente non utilizza jQuery, non posso usare: contains(). Qualcuno di voi persone adorabili sa qual è il modo nativo per farlo?

http://codepen.io/coulbourne/pen/olerh

+0

Avanti e [aggiungi jQuery con il tuo userscript] (http://stackoverflow.com/a/12751531/331508). Non perdere tempo a cercare di ricrearlo a pezzi. –

+0

Se sei pronto a lasciare il supporto per alcuni browser (penso solo a IE7 - EDIT: anche forse IE8), puoi usare il nativo "document.querySelectorAll" in un modo molto simile al selettore di JQuery. http://caniuse.com/#feat=queryselector – Katana314

risposta

0

Beh, jQuery è dotato di un motore di attraversamento DOM che opera molto meglio di quella che sto per mostrarvi, ma farà il trucco.

var items = document.getElementsByTagName("*"); 
for (var i = 0; i < items.length; i++) { 
    if (items[i].innerHTML.indexOf("word") != -1) { 
    // Do your magic 
    } 
} 

avvolgerla in una funzione se si vuole, ma vi consiglio vivamente di utilizzare l'implementazione di jQuery.

3

Se si desidera implementare contains metodo exaclty come fa jQuery, questo è ciò che è necessario avere

function contains(elem, text) { 
    return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; 
} 

function getText(elem) { 
    var node, 
     ret = "", 
     i = 0, 
     nodeType = elem.nodeType; 

    if (!nodeType) { 
     // If no nodeType, this is expected to be an array 
     for (; (node = elem[i]); i++) { 
      // Do not traverse comment nodes 
      ret += getText(node); 
     } 
    } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { 
     // Use textContent for elements 
     // innerText usage removed for consistency of new lines (see #11153) 
     if (typeof elem.textContent === "string") { 
      return elem.textContent; 
     } else { 
      // Traverse its children 
      for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 
       ret += getText(elem); 
      } 
     } 
    } else if (nodeType === 3 || nodeType === 4) { 
     return elem.nodeValue; 
    } 
    // Do not include comment or processing instruction nodes 

    return ret; 
}; 

FONTE: Sizzle.js

16

Questo dovrebbe fare nei browser moderni:

function contains(selector, text) { 
    var elements = document.querySelectorAll(selector); 
    return [].filter.call(elements, function(element){ 
    return RegExp(text).test(element.textContent); 
    }); 
} 

Quindi utilizzarlo in questo modo:

contains('p', 'world'); // find "p" that contain "world" 
contains('p', /^world/); // find "p" that start with "world" 
contains('p', /world$/i); // find "p" that end with "world", case-insensitive 
... 
+3

È possibile utilizzare 'Array.prototype.filter.call' invece di allocare un nuovo array. –