Saya memiliki string HTML yang mewakili unsur: '<li>text</li>'
. Saya ingin menambahkannya ke elemen di DOM (a ul
dalam kasus saya). Bagaimana saya bisa melakukan ini dengan Prototipe atau dengan metode DOM?
(Saya tahu saya bisa melakukan ini dengan mudah di jQuery, tapi sayangnya kami tidak menggunakan jQuery.)
javascript
dom
prototypejs
Omer Bokhari
sumber
sumber
var nodes = document.fromString("<b>Hello</b> <br>");
Jawaban:
Catatan: sebagian besar browser saat ini mendukung
<template>
elemen HTML , yang menyediakan cara yang lebih dapat diandalkan untuk mengubah elemen dari string. Lihat jawaban Mark Amery di bawah ini untuk detailnya .Untuk browser yang lebih lama, dan simpul / jsdom : (yang belum mendukung
<template>
elemen pada saat penulisan), gunakan metode berikut. Ini adalah hal yang sama yang digunakan perpustakaan untuk mendapatkan elemen DOM dari string HTML ( dengan beberapa pekerjaan tambahan untuk IE untuk mengatasi bug dengan penerapannyainnerHTML
):Perhatikan bahwa tidak seperti templat HTML, ini tidak akan berfungsi untuk beberapa elemen yang tidak dapat secara hukum menjadi anak-anak dari
<div>
, seperti<td>
s.Jika Anda sudah menggunakan perpustakaan, saya sarankan Anda tetap menggunakan metode yang disetujui perpustakaan untuk membuat elemen dari string HTML:
update()
metode bawaannya .jQuery(html)
danjQuery.parseHTML
metode.sumber
createElementFromHTML
menyesatkan karenadiv.firstChild
mengembalikanNode
yang bukanHTMLElement
eg tidak bisanode.setAttribute
. Untuk membuatElement
pengembaliandiv.firstElementChild
dari fungsi saja.<div>
membungkus HTML yang saya tambahkan dengan.innerHTML
itu mengganggu saya. Saya tidak pernah berpikir untuk menggunakan.firstChild
.div
dan hasilnya adalah[object SVGSVGElement]
ketika log konsol memberi saya elemen DOM yang benar. Apa yang saya lakukan salah?HTML 5 memperkenalkan
<template>
elemen yang dapat digunakan untuk tujuan ini (seperti yang sekarang dijelaskan dalam spesifikasi WhatWG dan dokumen MDN ).Sebuah
<template>
elemen digunakan untuk menyatakan fragmen HTML yang dapat dimanfaatkan dalam skrip. Elemen diwakili dalam DOM sebagaiHTMLTemplateElement
yang memiliki.content
propertiDocumentFragment
tipe, untuk menyediakan akses ke konten template. Ini berarti bahwa Anda dapat mengkonversi string HTML untuk elemen DOM dengan menetapkaninnerHTML
sebuah<template>
elemen, kemudian mencapai ke dalamtemplate
's.content
properti.Contoh:
Perhatikan bahwa pendekatan serupa yang menggunakan elemen wadah yang berbeda seperti
div
tidak cukup berhasil. HTML memiliki batasan pada jenis elemen apa yang diizinkan ada di dalam jenis elemen lainnya; misalnya, Anda tidak dapat menempatkantd
sebagai anak langsung daridiv
. Ini menyebabkan elemen-elemen ini menghilang jika Anda mencoba mengaturinnerHTML
adiv
untuk menampungnya. Karena<template>
s tidak memiliki batasan seperti itu pada konten mereka, kekurangan ini tidak berlaku ketika menggunakan templat.Namun,
template
tidak didukung di beberapa browser lama. Pada Januari 2018, Dapatkah saya menggunakan ... memperkirakan 90% pengguna secara global menggunakan browser yang mendukungtemplate
s . Secara khusus, tidak ada versi Internet Explorer yang mendukungnya; Microsoft tidak menerapkantemplate
dukungan hingga dirilisnya Edge.Jika Anda cukup beruntung untuk menulis kode yang hanya ditargetkan untuk pengguna di peramban modern, silakan dan gunakan sekarang. Jika tidak, Anda mungkin harus menunggu beberapa saat agar pengguna dapat mengejar ketinggalan.
sumber
html.trim
tetapi oleh penguraian dalam pengaturanHTHTML. Dalam kasus saya ini menghapus ruang penting yang menjadi bagian dari textNode. :-(Gunakan insertAdjacentHTML () . Ini bekerja dengan semua browser saat ini, bahkan dengan IE11.
sumber
insertAdjacentHTML
bekerja dengan semua browser sejak IE 4.0.innerHTML += ...
adalah bahwa referensi ke elemen sebelumnya masih utuh menggunakan metode ini.beforebegin
,afterbegin
,beforeend
,afterend
. Lihat artikel MDN.Implementasi DOM yang lebih baru miliki
range.createContextualFragment
, yang melakukan apa yang Anda inginkan dengan cara kerangka kerja independen.Ini didukung secara luas. Namun yang pasti, periksa kompatibilitasnya di tautan MDN yang sama, karena akan berubah. Pada Mei 2017 ini dia:
sumber
innerHTML
div; elemen-elemen tertentu, sepertitd
s, akan diabaikan dan tidak muncul dalam fragmen yang dihasilkan.Tidak perlu mengubah, Anda mendapatkan API asli:
sumber
<td>text</td>
. Ini karenaDOMParser
sedang mencoba mem-parsing dokumen HTML lengkap , dan tidak semua elemen valid sebagai elemen root dari dokumen.Untuk fragmen html tertentu seperti
<td>test</td>
, div.innerHTML, DOMParser.parseFromString dan range.createContextualFragment (tanpa konteks yang tepat) solusi yang disebutkan dalam jawaban lain di sini, tidak akan membuat<td>
elemen.jQuery.parseHTML () menanganinya dengan benar (saya mengekstrak fungsi parseHTML jQuery 2 menjadi fungsi independen yang dapat digunakan dalam basis kode non-jquery).
Jika Anda hanya mendukung Edge 13+, lebih mudah menggunakan tag template HTML5:
sumber
Inilah cara sederhana untuk melakukannya:
sumber
Anda dapat membuat node DOM yang valid dari string menggunakan:
document.createRange().createContextualFragment()
Contoh berikut menambahkan elemen tombol di halaman yang mengambil markup dari sebuah string:
sumber
DocumentFragment
objek, tetap saja - sangat mengejutkan saya - menderita cacat yang sama dengan jawaban yang diterima: jika Anda melakukannyadocument.createRange().createContextualFragment('<td>bla</td>')
, Anda mendapatkan sebuah fragmen yang hanya berisi teks 'bla' tanpa<td>
elemen. Atau setidaknya, itulah yang saya amati di Chrome 63; Saya belum menyelidiki spesifikasi untuk mencari tahu apakah itu perilaku yang benar atau tidak.Dengan Prototipe, Anda juga dapat melakukan:
HTML:
JS:
sumber
Saya menggunakan metode ini (Bekerja di IE9 +), meskipun tidak akan menguraikan
<td>
atau anak-anak langsung lainnya yang tidak valid:sumber
Untuk meningkatkan selanjutnya berguna .toDOM () snippet yang kita dapat menemukan di tempat yang berbeda, kita sekarang dapat dengan aman menggunakan tanda kutip mundur ( literal Template ).
Jadi kita dapat memiliki kutipan tunggal dan ganda dalam deklarasi foo html.
Ini berperilaku seperti heredocs bagi mereka yang akrab dengan istilah tersebut.
Ini dapat ditingkatkan lebih lanjut dengan variabel, untuk membuat templating kompleks:
Jadi, mengapa tidak menggunakannya secara langsung
.innerHTML +=
? Dengan melakukannya, seluruh DOM sedang dihitung ulang oleh browser, itu jauh lebih lambat.https://caniuse.com/template-literals
sumber
Saya menambahkan
Document
prototipe yang membuat elemen dari string:sumber
td
s.HTML5 & ES6
<template>
Demo
sumber
Terlambat tetapi hanya sebagai catatan;
Dimungkinkan untuk menambahkan elemen sepele ke elemen target sebagai wadah dan menghapusnya setelah digunakan.
// Diuji pada chrome 23.0, firefox 18.0, yaitu 7-8-9 dan opera 12.11.
sumber
Solusi tercepat untuk membuat DOM dari string:
Dan di sini Anda dapat memeriksa kinerja untuk manipulasi DOM React vs JS asli
Sekarang Anda cukup menggunakan:
Dan tentu saja dalam waktu dekat Anda menggunakan referensi dari memori karena var "elemen" adalah DOM baru Anda di dokumen Anda.
Dan ingat "innerHTML =" sangat lambat: /
sumber
Ini kode saya, dan berfungsi:
sumber
Untuk itu saya pikir saya akan berbagi ini dengan pendekatan yang rumit tapi sederhana saya datang dengan ... Mungkin seseorang akan menemukan sesuatu yang berguna.
sumber
Mengapa tidak lakukan dengan js asli?
sumber
sumber
Anda dapat menggunakan fungsi berikut untuk mengonversi teks "HTML" ke elemen
sumber
td
s.Gunakan jnerator
sumber
Ini kode yang berfungsi untuk saya
Saya ingin mengonversi string ' Teks ' ke elemen HTML
sumber
wwww
?var msg = "test" jQuery.parseHTML (msg)
sumber
Ini juga akan bekerja:
Rasanya lebih seperti cara jquery dengan panggilan fungsi dirantai.
sumber