使用javascript注入html的最佳方法

Mik*_*gin 20 javascript

我希望这不是太主观.我觉得这里有一个明确的答案.

我想使用JS(无库)动态创建这个html:

<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>
Run Code Online (Sandbox Code Playgroud)

使用javascript.我知道我可以使用createElement等来做到这一点但是对于每个元素来说,这似乎是非常冗长的.任何人都可以建议一种更简洁的方法来做到这一点.

我无法访问此项目中的库....所以没有jquery等.

Ate*_*ral 29

将您的标记与代码分开:

您可以在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>
Run Code Online (Sandbox Code Playgroud)

更新:请注意,我已将id模板中的class属性转换为属性.这是为了避免页面上的多个元素具有相同的ID.你甚至可能不需要这些课程.您可以访问元素:

node.getElementsByTagName("div")[4].innerHTML =
    format(data.currentTime);
Run Code Online (Sandbox Code Playgroud)

或者,您可以对模板的HTML进行操作:

<script type="text/javascript">
var tmp = document.getElementById("tmp_audio").innerHTML;
// modify template HTML with token replacement
container.innerHTML += tmp;
</script>
Run Code Online (Sandbox Code Playgroud)

  • @Ryan Ternier:不,它不会.请注意`node.id ="";`行. (5认同)
  • 这样做会创建多个具有相同ID的元素, (2认同)

Rya*_*ier 18

将整个事物推入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>';
Run Code Online (Sandbox Code Playgroud)

然后:

document.getElementById("parentElement").innerHTML = html;
Run Code Online (Sandbox Code Playgroud)

如果你想要N:

document.getElementById("totalTime").innerHTML = "5:00";
Run Code Online (Sandbox Code Playgroud)

  • 这不是最好的解决方案,但考虑到条件,这是可以接受的。 (2认同)
  • @RyanTernier:最近的浏览器[不解析注入的innerHTML](http://meta.stackexchange.com/q/257243/242800). (2认同)

yor*_*ick 8

您可以使用

<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>
Run Code Online (Sandbox Code Playgroud)


Mar*_*oni 6

现在,Web Components您可以使用HTML导入注入HTML .

语法如下所示:

<link rel="import" href="component.html" >
Run Code Online (Sandbox Code Playgroud)

这将只按内容href的顺序在内联属性中加载html文件的内容.您可以在加载的文件中使用任何有效的html,因此您甚至可以根据需要加载其他脚本.

要从JavaScript中注入,您可以执行以下操作:

var importTag = document.createElement('link');
importTag.setAttribute('rel', 'import');
importTag.setAttribute('href', 'component.html');
document.body.appendChild(importTag);
Run Code Online (Sandbox Code Playgroud)

在我写这篇文章时,Chrome和Opera支持HTML导入.您可以在http://caniuse.com/#feat=imports上查看最新的兼容性表

但是不要担心浏览器不支持它,你可以使用webcomponentsjs polyfill在它们中使用它.

有关HTML导入的更多信息,请访问http://webcomponents.org/articles/introduction-to-html-imports/


ii *_*to1 5

如果您生活在 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>
    `
}
Run Code Online (Sandbox Code Playgroud)

创建一个包含要显示的数据的 JSON 对象

var data = {
     header: 'My video player',
     subheader: 'Version 2 coming soon'
}
Run Code Online (Sandbox Code Playgroud)

将其添加到您喜欢的任何元素中

const videoplayer = videoPlayerTemplate(data);
document.getElementById('myRandomElement').insertAdjacentHTML("afterbegin", videoplayer);
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关字符串文字的更多信息