几个月前,我开始在课堂上学习 JavaScript,今天发现了这两种方法之间的一个区别。由于Iaroslav Baranov 想要一个例子,这里是:
我试图克隆一个 HTML 模板标签及其内容以创建一个图书画廊(如电子商务网站的产品列表页面)。这是 HTML 代码:
<template id="modeleLivre">
<article class="livre">
<header class="titre">${titre}</header>
<p class="imageCouverture">
<img src="images/${imageCouverture}">
</p>
<p class="auteur">${auteur}</p>
<p class="prix">${prix} €</p>
<p class="genre">${genre}</p>
<input type="button" class="btn_achat" value="Ajouter au panier">
</article>
这是我一开始尝试运行的 JS 函数:
let template = document.getElementById("modeleLivre");
let templateClone;
for (let i = 0; i < gallery.length; i++) {
templateClone = document.importNode(template.content, true);
let eBook = templateClone.querySelector(".livre");
let title = catalogue[i].getTitle();
let coverImage = catalogue[i].getCoverImage();
let author = catalogue[i].getAuthor();
let price = catalogue[i].getPrice();
let book = eBook.innerHTML;
eBook.innerHTML = book.replace('${titre}', title).replace('${imageCouverture}', coverImage).replace('${auteur}', author).replace('${prix}', price);
bookListing.appendChild(templateClone);
}
这工作完美无缺,但浏览器一直在寻找一个未知的奇怪图像来替换 coverImage 变量:
GET ../images/$%7BimageCouverture%7D |净::ERR_FILE_NOT_FOUND
解决方案
为了避免这个错误,我所要做的就是切换 for 循环的第一行 - 使用 importNode() 的那一行 - 如下:
templateClonde = template.content.cloneNode(true);
解释
我不知道为什么 cloneNode() 不会抛出错误,而 importNode() 会。我唯一的猜测是,如果克隆引用和附加的克隆在同一个 DOM 中,则不应使用 importNode()。
无论如何,如果有人能进一步解释这两种方法之间的区别,我会很高兴,但由于 OP 要求举个例子,这里是我的。