jQuery รับ html ของคอนเทนเนอร์รวมถึงคอนเทนเนอร์ด้วย


156

ฉันจะรับ html บน '#container' รวมถึง '#container' ได้อย่างไรและไม่ใช่แค่สิ่งที่อยู่ภายใน

<div id="container">
 <div id="one">test 1 </div>
 <div id="two">test 2 </div>
 <div id="three">test 3 </div>
 <div id="four">test 4 </div>
</div>

ฉันมีสิ่งนี้ซึ่งได้รับ html ใน #container ไม่รวมองค์ประกอบ #container นั่นคือสิ่งที่ฉันต้องการจะทำ

var x = $('#container').html();
$('#save').val(x);

ตรวจสอบhttp://jsfiddle.net/rzfPP/58/


คุณสามารถใส่ตู้คอนเทนเนอร์ไว้ในตู้คอนเทนเนอร์อีกตู้แล้วรับ html นั้น ... แต่มันดูเหมือนว่าแฮ็คเล็กน้อย บางทีถ้าเรารู้เพิ่มเติมเกี่ยวกับปัญหาอีกเล็กน้อยเราสามารถหาวิธีแก้ปัญหาที่ใช้การได้หรือไม่ คุณทำอะไรกับพื้นที่ข้อความที่เต็มไปด้วย html
Patricia

คำตอบ:


160

หากคุณตัดคอนเทนเนอร์ในPแท็กดัมมี่คุณจะได้รับคอนเทนเนอร์ HTML ด้วย

สิ่งที่คุณต้องทำคือ

var x = $('#container').wrap('<p/>').parent().html();

ตรวจสอบตัวอย่างการทำงานได้ที่http://jsfiddle.net/rzfPP/68/

ไปunwrap()ที่<p>แท็กเมื่อเสร็จแล้วคุณสามารถเพิ่ม

$('#container').unwrap();

19
@ mc10 เราสามารถใช้โคลน () และคุณไม่ต้องกังวลกับองค์ประกอบพิเศษที่สร้างขึ้น var x = $('#container').clone().wrap('<p/>').parent().html();. แนวคิดของการห่อหุ้มนั้นยอดเยี่ยมและจัดสรรความซับซ้อนน้อยลงดังนั้นโซลูชันส่วนใหญ่ที่ให้ไว้
ก้อย

ปัญหา Firefox นั้นล้าสมัยดังนั้นฉันแนะนำให้โหวต @MikeM คำตอบเพราะมันเป็นของแท้ JS
Rob

6
ทำไมถึงต้อง<p>ติดแท็ก จะไม่<div>ทำให้รู้สึกมากขึ้น?
Martin Burch

6
นี่เป็นวิธีที่ง่ายกว่ามาก ดูคำตอบของฉัน
1.44mb

132
var x = $('#container').get(0).outerHTML;

อัปเดต : ตอนนี้ได้รับการสนับสนุนโดย Firefox ในฐานะของ FireFox 11 (มีนาคม 2012)

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นสิ่งนี้จะไม่ทำงานใน FireFox หากคุณต้องการให้มันทำงานใน FireFox คุณอาจต้องการคำตอบสำหรับคำถามนี้: ใน jQuery มีฟังก์ชั่นใดที่คล้ายกับ html () หรือ text () แต่คืนเนื้อหาทั้งหมดขององค์ประกอบที่ตรงกันหรือไม่?


6
สิ่งนี้ใช้ได้ใน Firefox และดีกว่าโซลูชันที่ได้รับการยอมรับในตอนนี้
luqita

นี่เป็นวิธีที่สวยงามในการทำเช่นนั้นดีกว่าคำตอบที่ยอมรับซึ่งเป็นเพียงแฮ็คสกปรก
minhajul

มันสมบูรณ์แบบ
Gaurav Aggarwal

นี่เป็นคำตอบที่สมบูรณ์แบบเพราะการตัดแท็กหลักด้วย div หรือ p เป็นความคิดที่ไม่ดี อาจเป็นเพราะ CSS ของคุณจะพัง พิเศษเมื่อคุณใช้ bootstrap (เช่น form-row) ดังนั้นคำตอบนี้ค่อนข้างดี
Sudhir K Gupta

73

ฉันชอบที่จะใช้สิ่งนี้

$('#container').prop('outerHTML');

7
ดูเหมือนว่าทางออกที่ดีที่สุดสำหรับฉันไม่จำเป็นต้องมีการจัดการ dom หรือหลอกหลอก dom manipulation (the wrap method) และวัตถุ jquery มีคุณสมบัติอยู่แล้ว
Nieminen

1
รักวิธีแก้ปัญหานี้
Sameera Kumarasingha

69
var x = $('#container')[0].outerHTML;

1
ปัญหาของ Firefox ล้าสมัยดังนั้นฉันขอแนะนำให้โหวตคำตอบนี้
Rob

1
การใช้. clone () ใช้งานได้ แต่สิ่งนี้สะอาดกว่ามาก คำตอบที่ยอมรับจะสร้างองค์ประกอบใหม่ใน DOM = ไม่ดี
pete

13
$('#container').clone().wrapAll("<div/>").parent().html();

อัปเดต: outerHTML ใช้งานได้กับ firefox ทันทีดังนั้นให้ใช้คำตอบอื่น ๆ ยกเว้นว่าคุณต้องการสนับสนุน firefox เวอร์ชันเก่ามาก


คุณสมบัติ outerHTML ใช้งานไม่ได้กับ Firefox ดังนั้นคุณต้องทำมันด้วยโคลน
Robert Noack

2

Oldie แต่ goldie ...

เนื่องจากผู้ใช้กำลังขอ jQuery ฉันจะทำให้มันง่าย:

var html = $('#container').clone();
console.log(html);

เล่นซอที่นี่


2
สิ่งนี้ไม่ได้ช่วยในการเรียก html ของคอนเทนเนอร์เอง มันไม่ได้ส่งคืนรหัส html ฉันเห็นว่ามันอาจเป็นประโยชน์ในการเข้าถึงโหนดเป้าหมายผ่านทางโคลนเพื่อหลีกเลี่ยงการแก้ไข dom แต่มันก็เป็นการดีที่จะพูดถึงว่าทำไมคุณใช้วิธีนี้
AeonOfTime


0

Firefox ไม่รองรับ outerHTMLดังนั้นคุณต้องกำหนดฟังก์ชั่นเพื่อช่วยสนับสนุน:

function outerHTML(node) {
    return node.outerHTML || (
        function(n) {
            var div = document.createElement('div');
            div.appendChild( n.cloneNode(true) );
            var h = div.innerHTML;
            div = null;
            return h;
        }
    )(node);
}

จากนั้นคุณสามารถใช้ outerHTML:

var x = outerHTML($('#container').get(0));
$('#save').val(x);

0
var x = $($('div').html($('#container').clone())).html();

6
คุณกำลังสร้างวัตถุ 3 jquery ในหนึ่งคำสั่ง แม้ว่ามันจะใช้งานได้
Pinkie

-2

วิธีแก้ปัญหาง่ายๆด้วยตัวอย่าง:

<div id="id_div">
  <p>content<p>
</div>

ย้าย DIV นี้ไปยัง DIV อื่นด้วย id = "other_div_id"

$('#other_div_id').prepend( $('#id_div') );

เสร็จสิ้น


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