ฉันจะใช้ส่วนเสริมและผนวกกับ JavaScript ปกติได้อย่างไร


150

ฉันสามารถใช้ย่อหน้าและผนวกกับปกติ JavaScript โดยไม่ต้องใช้ jQuery?


1
ฉันไม่เข้าใจว่าคุณหมายถึงอะไร
Pekka

@GenericTypeTea: ดังนั้นฉันในเวลาเดียวกัน ... ฉันจะทิ้งมันไว้คนเดียวในตอนนี้!
Mark Byers

@Mark - การแก้ไขของคุณดีกว่า :)
djdd87

คำตอบ:


147

บางทีคุณอาจกำลังถามเกี่ยวกับวิธีการ DOM และappendChildinsertBefore

parentNode.insertBefore(newChild, refChild)

แทรกโหนดnewChildเป็นเด็กของก่อนที่เด็กโหนดที่มีอยู่parentNode refChild(ส่งคืนnewChild)

หากrefChildเป็นโมฆะnewChildจะมีการเพิ่มที่ส่วนท้ายของรายการลูก ใช้อย่างเท่าเทียมกันและอ่านง่าย parentNode.appendChild(newChild)ขึ้น


7
ดังนั้นการเสริมกำลังจึงเป็นเช่นนี้แล้วfunction prepend(tag, ele) { var x =document.getElementsByTagName(tag)[0]; x.insertBefore(ele ,x.children[0]); }
Muhammad Umer

166

นี่เป็นตัวอย่างข้อมูลเพื่อให้คุณไป:

theParent = document.getElementById("theParent");
theKid = document.createElement("div");
theKid.innerHTML = 'Are we there yet?';

// append theKid to the end of theParent
theParent.appendChild(theKid);

// prepend theKid to the beginning of theParent
theParent.insertBefore(theKid, theParent.firstChild);

theParent.firstChildจะให้การอ้างอิงถึงองค์ประกอบแรกภายในtheParentและวางไว้theKidก่อนหน้า


ขอบคุณทำไมสำหรับการเพิ่มเพียงแค่ใช้ insertBefore โดยไม่ต้องสร้าง div เพิ่มเติม เช่นคำตอบ Grumdrig?
โยเซฟ

สิ่งนี้สร้างองค์ประกอบและเพิ่มลงใน dom ผนวกและเสริมการทำงานต่างกัน
Andrei Cristian Prodan

ฉันได้สิ่งนี้เปรียบเทียบกับคำตอบของ Grumdig
andrew

10
ปี 2558 เรามีprepend()วิธีการในตัวหรือยัง
1.21 gigawatts

Node.append หรือ node.appendChild เป็นวิธีการโมฆะใช้ insertBefore (โหนด, โมฆะ) แทน
Suhayb

28

คุณไม่ได้ให้อะไรมากกับเราที่นี่ แต่ฉันคิดว่าคุณแค่ถามว่าจะเพิ่มเนื้อหาไปยังจุดเริ่มต้นหรือจุดสิ้นสุดขององค์ประกอบได้อย่างไร ถ้านี่คือวิธีที่คุณสามารถทำได้ง่ายๆ:

//get the target div you want to append/prepend to
var someDiv = document.getElementById("targetDiv");

//append text
someDiv.innerHTML += "Add this text to the end";

//prepend text
someDiv.innerHTML = "Add this text to the beginning" + someDiv.innerHTML;

ค่อนข้างง่าย


ดีสิ่งที่ฉันกำลังมองหา
Andrei Cristian Prodan

2
@Munzilla วิธีนี้จะบังคับให้เบราว์เซอร์แยกวิเคราะห์เด็กที่มีอยู่ทั้งหมดอีกครั้ง ในการแก้ปัญหาข้างต้นเบราว์เซอร์ก็ต้องแนบลูกที่กำหนดให้กับเอกสาร
Sayam Qazi

12

หากคุณต้องการแทรกสตริง HTML แบบดิบไม่ว่าจะซับซ้อนแค่ไหนคุณสามารถใช้: insertAdjacentHTMLพร้อมอาร์กิวเมนต์แรกที่เหมาะสม:

'beforebegin' ก่อนหน้าองค์ประกอบ 'afterbegin' อยู่ในองค์ประกอบก่อนลูกคนแรก 'beforeend' อยู่ในองค์ประกอบหลังจากลูกคนสุดท้าย 'afterend' หลังจากองค์ประกอบเอง

คำแนะนำ: คุณสามารถโทรหาElement.outerHTMLเพื่อรับสตริง HTML ที่เป็นตัวแทนขององค์ประกอบที่จะแทรก

ตัวอย่างการใช้งาน:

document.getElementById("foo").insertAdjacentHTML("beforeBegin",
          "<div><h1>I</h1><h2>was</h2><h3>inserted</h3></div>");

การสาธิต

ข้อควรระวัง: ไม่ได้รักษาผู้ฟังว่าที่แนบมาด้วยinsertAdjacentHTML.addEventLisntener


" insertAdjacentHTMLไม่รักษาผู้ฟัง ... "ผู้ฟังอะไร? มันคือ HTML ดังนั้นจึงไม่มีองค์ประกอบใด ๆ ที่จะผูกมัด หากคุณอ้างถึงองค์ประกอบที่มีอยู่ภายในfooนั่นไม่ใช่คำสั่งที่แท้จริง ประเด็นทั้งหมดของ.insertAdjacentHTMLมันคือการปกป้องผู้ฟัง คุณอาจกำลังคิด.innerHTML += "..."ซึ่งจะทำลายโหนด DOM เก่า
spanky

@spanky คุณถูกต้องที่อาจตีความคำสั่งได้หลายวิธีสิ่งที่ฉันหมายถึงจริง ๆ คือโหนด DOM ที่สร้างขึ้นใหม่ด้วยinsertAdjacentHTML(ไม่ใช่รากหรือลูกหลานของรากที่มีอยู่เดิม)
artur grzesiak

6

ฉันเพิ่มสิ่งนี้ลงในโครงการและดูเหมือนว่าจะใช้ได้:

HTMLElement.prototype.prependHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    this.insertBefore(div, this.firstChild);
};

HTMLElement.prototype.appendHtml = function (element) {
    const div = document.createElement('div');
    div.innerHTML = element;
    while (div.children.length > 0) {
        this.appendChild(div.children[0]);
    }
};

ตัวอย่าง:

document.body.prependHtml(`<a href="#">Hello World</a>`);
document.body.appendHtml(`<a href="#">Hello World</a>`);

5

เพื่อให้ชีวิตของคุณง่ายขึ้นคุณสามารถขยายHTMLElementวัตถุ อาจไม่ทำงานกับเบราว์เซอร์รุ่นเก่า แต่จะทำให้ชีวิตของคุณง่ายขึ้น:

HTMLElement = typeof(HTMLElement) != 'undefined' ? HTMLElement : Element;

HTMLElement.prototype.prepend = function(element) {
    if (this.firstChild) {
        return this.insertBefore(element, this.firstChild);
    } else {
        return this.appendChild(element);
    }
};

ดังนั้นครั้งต่อไปที่คุณสามารถทำได้:

document.getElementById('container').prepend(document.getElementById('block'));
// or
var element = document.getElementById('anotherElement');
document.body.prepend(div);

1
เกิดอะไรขึ้นถ้าโหนดไม่มีโหนดย่อย ในกรณีนี้ firstChild จะเป็นโมฆะ
felixfbecker

prepend มีอยู่แล้วโปรดดู ParentNode.prepend () ดังนั้นเพื่อให้ prependChild เพียงพอที่จะเรียก prnt.prepend (chld)
Igor Fomenko

2

นี่คือตัวอย่างของการใช้ prepend เพื่อเพิ่มย่อหน้าลงในเอกสาร

var element = document.createElement("p");
var text = document.createTextNode("Example text");
element.appendChild(text);
document.body.prepend(element);

ผลลัพธ์:

<p>Example text</p>

1

ในปี 2560ฉันรู้สำหรับ Edge 15 และ IE 12 วิธีการเติมจะไม่รวมอยู่ในคุณสมบัติสำหรับองค์ประกอบ Div แต่ถ้าใครต้องการการอ้างอิงอย่างรวดเร็วเพื่อ polyfill ฟังก์ชั่นที่ฉันทำ:

 HTMLDivElement.prototype.prepend = (node, ele)=>{ 
               try { node.insertBefore(ele ,node.children[0]);} 
                     catch (e){ throw new Error(e.toString()) } }

ฟังก์ชั่นลูกศรง่าย ๆ ที่เข้ากันได้กับเบราว์เซอร์ที่ทันสมัยที่สุด


0
var insertedElement = parentElement.insertBefore(newElement, referenceElement);

ถ้า referenceElement เป็นโมฆะหรือไม่ได้กำหนด newElement จะถูกแทรกที่ส่วนท้ายของรายการโหนดลูก

insertedElement The node being inserted, that is newElement
parentElement The parent of the newly inserted node.
newElement The node to insert.
referenceElement The node before which newElement is inserted.

ตัวอย่างสามารถพบได้ที่นี่: Node.insertBefore



-1

นี่ไม่ใช่วิธีที่ดีที่สุดที่จะทำ แต่ถ้าใครต้องการแทรกองค์ประกอบก่อนทุกอย่างนี่คือวิธี

var newElement = document.createElement("div");
var element = document.getElementById("targetelement");
element.innerHTML = '<div style="display:none !important;"></div>' + element.innerHTML;
var referanceElement = element.children[0];
element.insertBefore(newElement,referanceElement);
element.removeChild(referanceElement);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.