2010-08-10 15 views
9

Ad esempio, nel codice JavaScript in esecuzione nella pagina abbiamo qualcosa di simile:È possibile ottenere oggetti jquery da una stringa html che non è nel DOM?

var data = '<html>\n <body>\n I want this text ...\n </body>\n</html>'; 

Mi piacerebbe usare e almeno sapere se il suo possibile per ottenere il testo nel corpo di quella stringa HTML senza gettare la tutta la stringa html nel DOM e selezionando da lì.

+0

jquery - $ ('body'). Html() – khairil

+2

@khairil - leggi la domanda con più attenzione ... – detly

+0

opss, mi spiace, per favore ignora il mio commento precedente. – khairil

risposta

8

In primo luogo, si tratta di una stringa:

var arbitrary = '<html><body>\nSomething<p>This</p>...</body></html>'; 

Ora jQuery lo trasforma in un frammento DOM non collegato, applicando il suo metodo interno .clean() per rimuovere elementi come l'extra <html>, <body>, ecc.

var $frag = $(arbitrary); 

È possibile manipolare questo con funzioni di jQuery, anche se è ancora un frammento:

alert($frag.filter('p').get()); // says "<p>This</p>" 

O, naturalmente, solo ottenere il contenuto del testo come nella vostra domanda:

alert($frag.text()); // includes "This" in my contrived example 
         // along with line breaks and other text, etc 

È può anche successivamente allegare il frammento al DOM:

$('div#something_real').append($frag); 

Ove possibile, è spesso una buona strategia per eseguire complicate manipolazioni sui frammenti mentre sono distaccati e quindi trasferirli nella pagina "reale" quando hai finito.

1

La risposta corretta a questa domanda, in questo esatto fraseggio, è NO.

Se si scrive qualcosa come var a = $("<div>test</div>"), jQuery aggiungerà quel div al DOM e quindi costruirà un oggetto jQuery attorno ad esso.

Se si vuole fare a meno di infastidire il DOM, si dovrà analizzare da soli. Le espressioni regolari sono tuoi amici.

+0

È male aggiungere dinamicamente tag come a un div nascosto? Riuscirà a rovinare la pagina? . So che sicuramente non sarà valido html ma suppongo che avrei potuto fare qualcosa di simile:

e poi fare qualcosa di simile $ ("# dati html") html(); – Travis

+0

Sì, puoi farlo e sì, funzionerà. Il riferimento a "HTML valido" non è rilevante qui, perché, una volta che l'HTML è stato analizzato dal browser, non è più HTML, ma piuttosto un albero DOM. Devo anche aggiungere che non è necessario avvolgerlo in un div. Puoi semplicemente passare l'intera stringa alla funzione '$()', e dovrebbe restituire un oggetto jQuery che rappresenta il tuo tag 'html'. –

0

Prima di lanciarlo nel DOM è solo una stringa semplice.

È possibile utilizzare REGEX.

1

Sarebbe più semplice, credo, inserirlo nel DOM e ottenerlo da lì, quindi rimuoverlo dal DOM di nuovo.

Jquery è pieno di trucchi come questo. Sta aggiungendo ogni genere di cose nel DOM tutto il tempo, incluso quando costruisci qualcosa usando $ ('< p> un numero di codice </p>'). Quindi, se percorressi quella strada, avresti comunque inserito le cose nel DOM, rimuovendolo di nuovo temporaneamente, tranne che sarebbe stato Jquery a farlo.

+0

Che cosa fa esattamente $ ('

httml

')? – Travis

+0

Crea elementi DOM dall'HTML che gli hai fornito e restituisce quegli elementi in un oggetto Jquery, che puoi quindi inserire nel documento da qualche parte o fare altre cose con. Jquery lo fa utilizzando innerHTML e gli equivalenti per trarre vantaggio dal parser HTML interno del browser. – thomasrutter

+0

@Travis: come indicato nella documentazione di jQuery (http://api.jquery.com/jQuery/#jQuery2), "... jQuery tenta di creare nuovi elementi DOM come descritto dall'HTML, quindi viene creato un oggetto jQuery e restituito che si riferisce a questi elementi ... " –

1

John Resig (autore jQuery) ha creato uno pure JS HTML parser che potrebbe risultare utile. Un esempio da quella pagina:

var dom = HTMLtoDOM("<p>Data: <input disabled>"); 
dom.getElementsByTagName("body").length == 1 
dom.getElementsByTagName("p").length == 1 

Buuuut ... Questa domanda contiene un vincolo che penso che hai bisogno di essere più critici. Piuttosto che lavorare attorno a una stringa HTML codificata in una variabile JS, non puoi riconsiderare il motivo per cui è così in primo luogo? WHAT è quella stringa hard-coded utilizzata?

Se è solo seduto nella sceneggiatura, riscrivilo come oggetto appropriato.

Se è la risposta di una chiamata AJAX, c'è già un ottimo jQuery AJAX API. (Aggiunto:. Anche se jQuery solo lo restituisce come una stringa, senza alcuna possibilità di analizzarlo, quindi credo che sei di nuovo al punto di lì)

Problemi correlati