Лучший способ вставить html с помощью javascript
Я надеюсь, что это не слишком субъективно. Я чувствую, что есть окончательный ответ, вот так.
Я хочу создать этот html на лету, используя JS (без библиотек):
<a href="#" id="playButton">Play</a>
<a href="javascript: void(0)" id="muteUnmute">Mute</a>
<div id="progressBarOuter">
<div id="bytesLoaded"></div>
<div id="progressBar"></div>
</div>
<div id="currentTime">0:00</div>
<div id="totalTime">0:00</div>
с помощью javascript. Я знаю, что могу сделать это с помощью createElement и т.д., Но, похоже, очень сложно сделать это для каждого элемента. Может ли кто-нибудь предложить способ сделать это с большей кратностью.
У меня нет доступа к библиотеке в этом проекте.... поэтому нет jquery и т.д.
Ответы
Ответ 1
Переместите всю вещь в переменную JS:
var html = '<a href="#" id="playButton">Play</a>';
html += '<a href="javascript: void(0)" id="muteUnmute">Mute</a>';
html += '<div id="progressBarOuter"><div id="bytesLoaded"></div><div id="progressBar"></div></div>';
html += '<div id="currentTime">0:00</div>';
html += '<div id="totalTime">0:00</div>';
Тогда:
document.getElementById("parentElement").innerHTML = html;
если вы хотите: N:
document.getElementById("totalTime").innerHTML = "5:00";
Ответ 2
Сохраняйте разметку отдельно от вашего кода:
Вы можете вставлять фрагменты HTML, которые вы будете использовать в качестве скрытых шаблонов внутри вашей HTML-страницы, и клонировать их по запросу:
<style type="text/css">
#templates { display: none }
</style>
...
<script type="text/javascript">
var node = document.getElementById("tmp_audio").cloneNode(true);
node.id = ""; // Don't forget :)
// modify node contents with DOM manipulation
container.appendChild(node);
</script>
...
<div id="templates">
<div id="tmp_audio">
<a href="#" class="playButton">Play</a>
<a href="#" class="muteUnmute">Mute</a>
<div class="progressBarOuter">
<div class="bytesLoaded"></div>
<div class="progressBar"></div>
</div>
<div class="currentTime">0:00</div>
<div class="totalTime">0:00</div>
</div>
</div>
Обновление. Обратите внимание, что я преобразовал атрибуты id
в шаблон в атрибуты class
. Это делается для того, чтобы на вашей странице не было нескольких элементов с одинаковыми идентификаторами. Возможно, вам даже не нужны классы. Вы можете получить доступ к элементам с помощью:
node.getElementsByTagName("div")[4].innerHTML =
format(data.currentTime);
В качестве альтернативы вы можете действовать в HTML-шаблоне:
<script type="text/javascript">
var tmp = document.getElementById("tmp_audio").innerHTML;
// modify template HTML with token replacement
container.innerHTML += tmp;
</script>
Ответ 3
Вы можете использовать
<script type="text/javascript">
function appendHTML() {
var wrapper = document.createElement("div");
wrapper.innerHTML = '\
<a href="#" id="playButton">Play</a>\
<a href="javascript: void(0)" id="muteUnmute">Mute</a>\
<div id="progressBarOuter"> \
<div id="bytesLoaded"></div>\
<div id="progressBar"></div>\
</div>\
<div id="currentTime">0:00</div>\
<div id="totalTime">0:00</div>\
';
document.body.appendChild(wrapper);
}
</script>
Ответ 4
Теперь с помощью Web Components
вы можете вводить HTML, используя импорт HTML.
Синтаксис выглядит так:
<link rel="import" href="component.html" >
Это просто загрузит содержимое html файла в атрибут href
, встроенный в том порядке, в котором он появляется. Вы можете использовать любой допустимый HTML-код в загруженном файле, поэтому вы можете даже загрузить другие сценарии, если хотите.
Чтобы добавить это из JavaScript, вы можете сделать что-то вроде:
var importTag = document.createElement('link');
importTag.setAttribute('rel', 'import');
importTag.setAttribute('href', 'component.html');
document.body.appendChild(importTag);
На момент написания этой статьи Chrome и Opera поддерживают импорт HTML. Вы можете увидеть обновленную таблицу совместимости здесь http://caniuse.com/#feat=imports
Но не беспокойтесь о браузерах, которые его не поддерживают, вы можете использовать его в любом случае с помощью webcomponentsjs polyfill.
Для получения дополнительной информации о проверке импорта HTML http://webcomponents.org/articles/introduction-to-html-imports/
Ответ 5
Если вам не нужна какая-либо проверка вашего синтаксиса (это то, что делает createElement()
настолько приятным), вы всегда можете по умолчанию просто установить innerHTML
свойство элемента, в который вы хотите вставить свою разметку внутри.
Лично я хотел бы использовать createElement()
. Это более подробно, но есть гораздо меньше проблем, чтобы беспокоиться об этом.
Ответ 6
Вы можете объединить необработанные строки HTML (чтобы избежать текста и предотвратить отверстия XSS), или вы можете переписать jQuery (или что-то подобное)
Ответ 7
Если производительность является проблемой, держитесь подальше от innerHTML. Вы должны создать все дерево объектов с помощью document.createElement()
столько раз, сколько необходимо, в том числе для вложенных элементов.
Наконец, добавьте его в документ с одним утверждением, не так много утверждений.
В моем неформальном тестировании на протяжении многих лет это даст вам лучшую производительность (некоторые браузеры могут отличаться).
Если HTML всегда объявляется в переменной, он должен быть простым и для очень конкретной цели. Обычно это неправильный подход.
Ответ 8
У меня есть ситуация, когда я передаю текст в стороннюю библиотеку, но если моя модель isPrivate, я бы хотел добавить элемент в текст.
return { id: item.id, text: (item.isPrivate == true) ? "<i class=\"icon-lock\" title=\"Private group.\"></i> " + item.label : item.label };
Это создает проблемы с тем, как сторонняя библиотека создает свою разметку.
Это никогда не бывает хорошей идеей, но существуют сторонние библиотеки, поэтому нам не нужно писать все сами. В такой ситуации вы должны полагаться на прохождение разметки, хотя javascript.
Когда я найду подходящее решение для этого, я дам вам обновление
Ответ 9
Если вы живете в 2019 году и далее, читайте здесь.
В JavaScript es6 вы можете использовать строковые литералы для создания шаблонов.
создайте функцию, которая возвращает строковый/шаблонный литерал
function videoPlayerTemplate(data) {
return '
<h1>${data.header}</h1>
<p>${data.subheader}</p>
<a href="#" id="playButton">Play</a>
<a href="javascript: void(0)" id="muteUnmute">Mute</a>
<div id="progressBarOuter">
<div id="bytesLoaded"></div>
<div id="progressBar"></div>
</div>
<time id="currentTime">0:00</time>
<time id="totalTime">0:00</time>
'
}
Создайте объект JSON, содержащий данные, которые вы хотите отобразить
var data = {
header: 'My video player',
subheader: 'Version 2 coming soon'
}
добавьте это к любому элементу, который вам нравится
const videoplayer = videoPlayerTemplate(data);
document.getElementById('myRandomElement').insertAdjacentHTML("afterbegin", videoplayer);
Вы можете узнать больше о строковых литералах здесь