HTML 模板和 HTML 导入 - Firefox 中不执行内部脚本
HTML Templates and HTML Import - Inner Script not Executing in Firefox
我正在使用 webcomponents.js 填充 Firefox 对 Web 组件的支持。
通过 HTML 导入加载 HTML 模板时,一旦将基于模板的自定义元素添加到 DOM 中,模板中的脚本就不会执行主页.
它确实在 运行 在 Chrome(具有本机 Web 组件支持)中设置站点时执行。
但是,当模板放在主页本身时,Firefox 和 Chrome 都会执行这样的脚本。
请参阅 HTML5Rocks 上 Eric Bidelmann 的示例。 Chrome 和 Firefox(通过 webcomponents.js)中的 运行 - 只要模板位于同一个 HTML 文件中。
<!DOCTYPE html>
<html>
<body>
<button onclick="useIt()">Use me</button>
<div id="container"></div>
<script>
function useIt() {
var content = document.querySelector('template').content;
// Update something in the template DOM.
var span = content.querySelector('span');
span.textContent = parseInt(span.textContent) + 1;
document.querySelector('#container').appendChild(
document.importNode(content, true));
}
</script>
<template>
<div>Template used: <span>0</span></div>
<script>alert('Thanks!')</script>
</template>
</body>
</html>
但是,虽然显示了模板文本,但在通过 HTML 导入 link 加载模板及其内容时,它不会 运行。如前所述,它会加载内容,但不会在 Firefox 中执行脚本。
这是 webcomponents.js 中的错误还是 Firefox 中的错误?
任何人有解决方法的好主意("use Polymer or Angular" 除外)?
注意 - 这是基于使用 Firefox 43 和 Chrome 47.
这不是 Firefox 中的错误,Internet Explorer 11 具有相同的行为(webcomponents.js)。
importNode
方法未被 webcomponents.js 填充。这就是 <script>
元素在导入时未激活的原因。
有一个 issue opened 与该问题有关。
我的解决方法:我不在导入的 <template>
中插入脚本标签 <script>
(JS/HTML 分隔:)。
此外,您可以解析 <template>
寻找 <script>
标签并尝试 activate/execute 手动 它们 (可能有点棘手。 ..)
我确实找到了解决此问题的方法,它允许在激活模板元素时执行脚本。
这依赖于 HTML 导入位于导入文件中的执行脚本,如果它们不在模板标签内的话。
所以解决方案是在导入文件中再添加一个 HTML 导入并将脚本作为外部资源加载 - 一旦模板激活并立即执行,它就会加载。
所以不要在外部导入文件中包含以下内容:
<template>
<div>Template used: <span>0</span></div>
<script>alert('Thanks!')</script>
</template>
你有这个:
<template>
<div>Template used: <span>0</span></div>
<link rel="import" href="script1.html">
</template>
引用的 script1.html 文件包含以下内容:
<script>
alert('Thanks!')
</script>
是的,又是一个 HTTP 请求,但它可行且简单。
这解决了在模板元素初始化时必须 运行 的任何脚本。稍后激活所需的脚本可以根据函数定义或内联脚本具体化。
注:
另一种解决方法是在带有 id="script1" 的模板部分下方(和外部)的外部导入文件中添加一个 "div" 标记,然后使用一些 JS 来提取 div 的内容并将脚本标签添加到模板中。由于您无论如何都需要 JS 来激活模板,因此变化不大,但这感觉更像是 hack。
我正在使用 webcomponents.js 填充 Firefox 对 Web 组件的支持。
通过 HTML 导入加载 HTML 模板时,一旦将基于模板的自定义元素添加到 DOM 中,模板中的脚本就不会执行主页.
它确实在 运行 在 Chrome(具有本机 Web 组件支持)中设置站点时执行。
但是,当模板放在主页本身时,Firefox 和 Chrome 都会执行这样的脚本。
请参阅 HTML5Rocks 上 Eric Bidelmann 的示例。 Chrome 和 Firefox(通过 webcomponents.js)中的 运行 - 只要模板位于同一个 HTML 文件中。
<!DOCTYPE html>
<html>
<body>
<button onclick="useIt()">Use me</button>
<div id="container"></div>
<script>
function useIt() {
var content = document.querySelector('template').content;
// Update something in the template DOM.
var span = content.querySelector('span');
span.textContent = parseInt(span.textContent) + 1;
document.querySelector('#container').appendChild(
document.importNode(content, true));
}
</script>
<template>
<div>Template used: <span>0</span></div>
<script>alert('Thanks!')</script>
</template>
</body>
</html>
但是,虽然显示了模板文本,但在通过 HTML 导入 link 加载模板及其内容时,它不会 运行。如前所述,它会加载内容,但不会在 Firefox 中执行脚本。
这是 webcomponents.js 中的错误还是 Firefox 中的错误? 任何人有解决方法的好主意("use Polymer or Angular" 除外)?
注意 - 这是基于使用 Firefox 43 和 Chrome 47.
这不是 Firefox 中的错误,Internet Explorer 11 具有相同的行为(webcomponents.js)。
importNode
方法未被 webcomponents.js 填充。这就是 <script>
元素在导入时未激活的原因。
有一个 issue opened 与该问题有关。
我的解决方法:我不在导入的 <template>
中插入脚本标签 <script>
(JS/HTML 分隔:)。
此外,您可以解析 <template>
寻找 <script>
标签并尝试 activate/execute 手动 它们 (可能有点棘手。 ..)
我确实找到了解决此问题的方法,它允许在激活模板元素时执行脚本。
这依赖于 HTML 导入位于导入文件中的执行脚本,如果它们不在模板标签内的话。 所以解决方案是在导入文件中再添加一个 HTML 导入并将脚本作为外部资源加载 - 一旦模板激活并立即执行,它就会加载。
所以不要在外部导入文件中包含以下内容:
<template>
<div>Template used: <span>0</span></div>
<script>alert('Thanks!')</script>
</template>
你有这个:
<template>
<div>Template used: <span>0</span></div>
<link rel="import" href="script1.html">
</template>
引用的 script1.html 文件包含以下内容:
<script>
alert('Thanks!')
</script>
是的,又是一个 HTTP 请求,但它可行且简单。
这解决了在模板元素初始化时必须 运行 的任何脚本。稍后激活所需的脚本可以根据函数定义或内联脚本具体化。
注:
另一种解决方法是在带有 id="script1" 的模板部分下方(和外部)的外部导入文件中添加一个 "div" 标记,然后使用一些 JS 来提取 div 的内容并将脚本标签添加到模板中。由于您无论如何都需要 JS 来激活模板,因此变化不大,但这感觉更像是 hack。