2010-08-10 6 views
9

Zum Beispiel in JavaScript-Code auf der Seite ausgeführt haben wir so etwas wie:Ist es möglich, jquery-Objekte von einer HTML-Zeichenfolge abzurufen, die nicht im DOM enthalten ist?

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

I und mindestens verwenden möchten wissen, ob ihre möglich, den Text in dem Körper, das HTML-Zeichenfolge zu erhalten, ohne das werfen ganze HTML-Zeichenfolge in das DOM und Auswahl von dort.

+0

jquery - $ ('body') html() – khairil

+2

@khairil - lesen Sie die Frage genauer ... – detly

+0

opss, sorry, bitte ignorieren Sie meinen vorherigen Kommentar. – khairil

Antwort

8

Erstens ist es ein String:

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

Jetzt jQuery verwandelt es in ein nicht angehängtes DOM-Fragment und wendet seine interne .clean()-Methode an, um Dinge wie die zusätzlichen <html>, <body> usw. wegzuziehen.

var $frag = $(arbitrary); 

Sie können diese manipulieren mit jQuery-Funktionen, auch wenn es noch ein Fragment:

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

Oder natürlich nur den Textinhalt erhalten, wie in Ihrer Frage:

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

Sie kann das Fragment später auch an das DOM anhängen:

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

Wo immer es möglich ist, ist es oft eine gute Strategie, Fragmente zu manipulieren, während sie nicht verbunden sind, und sie dann auf die "richtige" Seite zu verschieben, wenn Sie fertig sind.

1

Die richtige Antwort auf diese Frage, in dieser genauen Formulierung, ist NEIN.

Wenn Sie etwas wie var a = $("<div>test</div>") schreiben, fügt jQuery dieses div dem DOM hinzu und erstellt dann ein jQuery-Objekt.

Wenn Sie auf das DOM verzichten möchten, müssen Sie es selbst analysieren. Reguläre Ausdrücke sind dein Freund.

+0

Ist es schlecht, dynamisch Tags wie dynamisch zu einem versteckten div hinzuzufügen? Wird es die Seite überhaupt durcheinander bringen? . Ich weiß, es wird auf jeden Fall nicht gültig html sein, aber ich nehme an, ich so etwas wie tun könnte:

und dann etwas tun, wie $ ("# data html") html(); – Travis

+0

Ja, Sie können dies tun, und ja, es wird funktionieren. Der Verweis auf "valides HTML" ist hier nicht relevant, denn sobald der HTML-Code vom Browser geparst wurde, handelt es sich nicht mehr um HTML, sondern um einen DOM-Baum. Ich muss auch hinzufügen, dass Sie es nicht in ein div wickeln müssen. Sie können diese ganze Zeichenfolge einfach an die Funktion '$()' übergeben und ein jQuery-Objekt zurückgeben, das Ihr 'html' -Tag repräsentiert. –

0

Bevor Sie es in das DOM werfen, das ist nur eine einfache Zeichenfolge.

Sie können sicher REGEX verwenden.

1

Es wäre am einfachsten, denke ich, das in das DOM zu legen und es von dort zu bekommen, dann entferne es wieder vom DOM.

Jquery selbst ist voller solcher Tricks. Es fügt alle möglichen Dinge in das DOM ein, auch wenn man etwas mit $ ('< p> etwas html </p>') erstellt. Wenn Sie also diesen Weg gehen würden, würden Sie immer noch Sachen in das DOM legen und dann vorübergehend wieder entfernen, außer dass Jquery es tun würde.

+0

Was genau macht $ ('

einige html

') genau? – Travis

+0

Es erstellt DOM-Elemente aus dem HTML-Code, den Sie ihm gegeben haben, und gibt diese Elemente in einem Jquery-Objekt zurück, das Sie dann irgendwo in das Dokument einfügen oder andere Dinge tun können. Jquery tut dies, indem es innerHTML und Äquivalente verwendet, um den internen HTML-Parser des Browsers zu nutzen. – thomasrutter

+0

@Travis: Wie in der jQuery-Dokumentation (http://api.jquery.com/jQuery/#jQuery2) angegeben, versucht "... jQuery neue DOM-Elemente wie im HTML beschrieben zu erstellen. Dann wird ein jQuery-Objekt erstellt und zurückgegeben, das bezieht sich auf diese Elemente ... " –

1

John Resig (Autor jQuery) erstellt eine pure JS HTML parser, die Sie möglicherweise nützlich finden. Ein Beispiel von dieser Seite:

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

Buuuut ... enthält diese Frage eine Einschränkung, die ich glaube, Sie kritischer sein müssen. Anstatt eine fest codierte HTML-Zeichenfolge in einer JS-Variablen zu bearbeiten, können Sie nicht darüber nachdenken, warum dies überhaupt so ist? WAS ist die hartcodierte Zeichenfolge?

Wenn es nur im Skript sitzt, schreiben Sie es als ein geeignetes Objekt neu.

Wenn es die Antwort von einem AJAX-Aufruf ist, gibt es ein ganz gutes jQuery AJAX API schon da. (Hinzugefügt:. Obwohl jQuery nur gibt sie als String ohne Fähigkeit, es zu analysieren, so dass ich denke, Sie sind wieder da man dort auf Platz)

Verwandte Themen