2009-04-01 6 views
5

Posso utilizzare la funzione getElementsByTagName() per ottenere una raccolta di elementi da un elemento in una pagina Web.Esiste una funzione simile a getElementsByTagName() per le variabili stringa javascript?

Mi piacerebbe essere in grado di utilizzare una funzione simile sul contenuto di una variabile di stringa javascript invece del contenuto di un elemento DOM.

Come posso fare?

EDIT

posso fare questo con la creazione di un elemento al volo.

var myElement = new Element('div'); 
myElement.innerHTML = "<strong>hello</strong><em>there</em><strong>hot stuff</strong>"; 
var emCollection = myElement.getElementsByTagName('em'); 
alert(emCollection.length); // This gives 1 

Ma la creazione di un elemento al volo per la comodità di utilizzare la funzione getElementsByTagName() proprio non mi sembra giusto e non funziona con gli elementi in Internet Explorer.

+0

Cioè, si desidera cercare il testo in una stringa? – strager

+0

Sì. Non voglio creare una foresta di espressioni regolari se è disponibile una funzione alternativa. – adolfojp

risposta

-1

L'HTML in una stringa non è niente di speciale. È solo testo in una stringa. Deve essere analizzato in un albero perché sia ​​utile. Ecco perché è necessario creare un elemento, quindi chiamare getElementsByTagName su di esso, come si mostra nell'esempio.

3
function countTags(html, tagName) { 
    var matches = html.match(new RegExp("<" + tagName + "[\\s>]", "ig")); 
    return matches ? matches.length : 0; 
} 

alert(
    countTags(
     "<strong>hello</strong><em>there</em><strong>hot stuff</strong>", 
     "em" 
    ) 
); // 1 
4

Iniettare la stringa in DOM, come hai mostrato, è il modo più semplice e affidabile per farlo. Se lavori su una stringa, dovrai prendere in considerazione tutti gli scenari di escape possibili che potrebbero rendere qualcosa che sembra come un tag in realtà non un tag.

Ad esempio, si potrebbe avere

<button value="<em>"/> 
<button value="</em>"/> 

nel markup - se si trattano come una stringa, si potrebbe pensare di avere un tag <em> in là, ma in realtà, si hanno solo due tag pulsante .

Inserendo nel DOM tramite innerHTML si sta sfruttando il parser HTML integrato nel browser, che è davvero dannatamente veloce. Fare la stessa cosa con le espressioni regolari sarebbe un problema, ei browser generalmente non forniscono funzionalità come DOM per trovare elementi all'interno delle stringhe.

Un'altra cosa che potreste provare sarebbe analizzare la stringa come XML, ma sospetto che questo sarebbe più problematico e più lento del metodo di iniezione DOM.

0
var domParser = new DOMParser(); 
var htmlString = "<strong>hello</strong><em>there</em><strong>hot stuff</strong>"; 
var docElement = domParser.parseFromString(htmlString, "text/html").documentElement; 
var emCollection = docElement.getElementsByTagName("em"); 
for (var i = 0; i < emCollection.length; i++) { 
    console.log(emCollection[i]); 
} 
Problemi correlati