การสร้างวัตถุ jQuery จาก HTML-string ขนาดใหญ่


140

ฉันมีสตริง HTML ขนาดใหญ่ที่มีหลายโหนดย่อย

เป็นไปได้ที่จะสร้างวัตถุjQuery DOM โดยใช้สตริงนี้หรือไม่?

ฉันได้ลองแล้ว$(string)แต่จะคืนค่าอาร์เรย์ที่มีโหนดทั้งหมดทั้งหมดเท่านั้น

กำลังพยายามรับองค์ประกอบซึ่งฉันสามารถใช้ฟังก์ชัน. find ()


HTML อยู่ที่ไหนคุณต้องการสร้างด้วยอะไร คุณอาจต้องการดูฟังก์ชั่น. ค้นหา (): api.jquery.com/find
การควบคุมที่ผิดปกติ

3
วัตถุ jQuery เป็นวัตถุคล้ายอาร์เรย์ที่มีโหนดทั้งหมด คุณสามารถอธิบายรายละเอียดเกี่ยวกับสิ่งที่คุณพยายามจะทำอย่างไร
Frédéric Hamidi

'สายนี้' อยู่ที่ไหน สายอะไร
Viezevingertjes

ลองดูที่นี่ฉันคิดว่ามันเป็นสิ่งที่คุณต้องการ stackoverflow.com/q/759887/474535
บาร์ต s

ฉันต้องผ่านองค์ประกอบจาก WebView หนึ่งไปยังอีกผ่านสตริงสตริงนั้นก็จะเป็นแหล่ง HTML ขององค์ประกอบนั้น ฉันคิดว่าฉันอาจเข้าใจผิดว่า jQuery คืออะไร
user1033619

คำตอบ:


200

ปรับปรุง:

จาก jQuery 1.8 เราสามารถใช้$ .parseHTMLซึ่งจะแยกสตริง HTML ไปยังอาร์เรย์ของโหนด DOM เช่น:

var dom_nodes = $($.parseHTML('<div><input type="text" value="val" /></div>'));

alert( dom_nodes.find('input').val() );

การสาธิต


var string = '<div><input type="text" value="val" /></div>';

$('<div/>').html(string).contents();

การสาธิต

มีอะไรเกิดขึ้นในรหัสนี้:

  • $('<div/>')เป็นของปลอม<div>ที่ไม่มีอยู่ใน DOM
  • $('<div/>').html(string)ต่อท้ายstringภายในของปลอม<div>เป็นเด็ก
  • .contents()ดึงลูกของปลอม<div>ที่เป็นวัตถุ jQuery

หากคุณต้องการ.find()ทำงานลองสิ่งนี้:

var string = '<div><input type="text" value="val" /></div>',
    object = $('<div/>').html(string).contents();

alert( object.find('input').val() );

การสาธิต


1
@ user1033619 คุณสามารถดำเนิน.find()การได้ตรวจสอบตัวอย่าง
thecodeparadox

แต่อย่างไรถ้าstring = '<input type="text" value="val" />'
fdrv

1
ถ้าคุณทำได้$("<div/>")ทำไมคุณทำ$(string)ไม่ได้
xr280xr

2
ด้วย HTML ที่ซับซ้อนยิ่งขึ้นฉันจำเป็นต้องลบ .contents เพื่อให้มันใช้งานได้ jsfiddle.net/h45y2L7v
Simon Hutchison

คุณไม่ต้องการทำ $ (สตริง) เพราะคุณต้องมี div div เพื่อรับเนื้อหา คุณจะได้รับเนื้อหาของ div ซึ่งจะเป็นข้อมูลที่คุณป้อน
Michael Khalili

120

ตั้งแต่ jQuery 1.8 คุณสามารถใช้ parseHtml เพื่อสร้างวัตถุ jQuery ของคุณ:

var myString = "<div>Some stuff<div>Some more stuff<span id='theAnswer'>The stuff I am looking for</span></div></div>";
var $jQueryObject = $($.parseHTML(myString));

ฉันได้สร้าง JSFidle ที่แสดงให้เห็นถึงสิ่งนี้: http://jsfiddle.net/MCSyr/2/

มันแยกวิเคราะห์สตริง HTML โดยพลการลงในวัตถุ jQuery และใช้ค้นหาเพื่อแสดงผลใน div


10
ฉันพบคำตอบนี้ดีกว่าเนื่องจากไม่ต้องใช้องค์ประกอบ div ghost $ .parseHtml ftw
ZeeCoder

2
คำตอบนี้ไม่ทำงานสำหรับฉันเมื่อฉันต้องการแล้วถึง $ jQueryObject.find () ฉันคิดว่าเพราะมันไม่ได้เพิ่มไปยัง dom ณ จุดนั้น
dougajmcdonald

@dougajmcdonald - การค้นหาควรทำงานได้โดยไม่ต้องเพิ่มเนื้อหาลงใน dom หากคุณดูซอของฉัน ( jsfiddle.net/MCSyr/2 ) ฉันกำลังเรียกหา find บนวัตถุ jQuery และส่งคืนผลลัพธ์ตามที่คาดไว้: $ jQueryObject.find ("# theAnswer") html ()
kiprainey

1
@ kiprainey น่าสนใจฉันจะขุดตัวอย่างที่ไม่เหมาะกับฉันและดูว่ามีบางสิ่งที่กำลังทำงานอยู่หรือไม่ มันถูกเขียนขึ้นในโมดูล TypeScript ภายในตรรกะอื่น ๆ โหลดอาจเป็นปัญหาที่แตกต่างกัน! ขอโทษด้วย.
dougajmcdonald

8
เป็นมูลค่าการกล่าวขวัญว่า parseHTML ถูกเพิ่มเข้ามาในjQuery 1.8
Jean-Michel Garcia

12
var jQueryObject = $('<div></div>').html( string ).children();

สิ่งนี้จะสร้างวัตถุ jQuery ซึ่งคุณสามารถใส่สตริงเป็น HTML ได้ จากนั้นคุณจะได้รับเด็ก ๆ เท่านั้น


2
ive ลองสิ่งนี้ แต่มันใช้ไม่ได้กับฟังก์ชั่น. find () ที่ฉันต้องใช้ในภายหลัง
user1033619

3
@ user1033619 คุณได้ใช้แทน.filter() .find()
Kulbir Saini

2

นอกจากนี้ยังมีห้องสมุดที่ยอดเยี่ยมที่ชื่อว่าcheerio ที่ออกแบบมาโดยเฉพาะสำหรับสิ่งนี้

การปรับใช้ core jQuery ที่รวดเร็วยืดหยุ่นและแบบลีนออกแบบมาสำหรับเซิร์ฟเวอร์โดยเฉพาะ

var cheerio = require('cheerio'),
    $ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

$.html();
//=> <h2 class="title welcome">Hello there!</h2>

1

ฉันใช้สิ่งต่อไปนี้สำหรับเทมเพลต HTML ของฉัน:

$(".main").empty();

var _template = '<p id="myelement">Your HTML Code</p>';
var template = $.parseHTML(_template);
var final = $(template).find("#myelement");

$(".main").append(final.html());

หมายเหตุ: หากคุณใช้ jQuery


1

สาเหตุที่ $ (สตริง) ไม่ทำงานเป็นเพราะ jquery ไม่ค้นหาเนื้อหา html ระหว่าง $ () ดังนั้นคุณต้องแยกวิเคราะห์มันเป็น html ก่อน เมื่อคุณมีตัวแปรที่คุณแยกวิเคราะห์ html จากนั้นคุณสามารถใช้ $ (สตริง) และใช้ฟังก์ชั่นทั้งหมดที่มีอยู่บนวัตถุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.