为非必要内容构建异步客户端包含

Building asynchronous client-side includes for non-essential content

提问人:Rounin 提问时间:10/6/2017 更新时间:10/6/2017 访问量:44

问:

在 javascript 事件侦听器触发后,我想将几段非必要内容插入到几个不同的页面上(作为一系列操作的一部分)。

  • 第 1 页显示非必要内容 A
  • 第 2 页显示“无”
  • 第 3 页显示非必要内容 B
  • 第 4 页显示非必要内容 B
  • 第 5 页显示非必要内容 C

“插入”的所有其他维度都是相同的 - 所有元素的脚本行为都是相同的,所有元素的 CSS 样式都是相同的 - 只是 HTML 标记结构和内容不同。


我的问题是:如何最好地插入非必要的内容?

可能的服务器端方法:

  1. 通过服务器端语言将内容包含在文档中。稍后通过将 CSS 从 更改为 来显示内容。display: nonedisplay: block
  2. 不要在文档中包含内容,而是在需要时使用 Ajax 从服务器获取它。

可能的客户端方法:

  1. 使用(咩!document.write(''))
  2. 使用(真的吗?<iframe>)
  3. 异步加载 javascript 字符串并使用.innerHTML
  4. 异步加载和解析 javascript 对象并使用 、 、 、{}document.createElement()setAttribute()document.createTextNode.textContent.appendchild()

我觉得使用 (Client-Side:3) 有点脏(与 Client-Side:4 相比),但无论如何我都选择了 Client-Side:3:.innerHTML

非必要内容

var nonEssentialContent = '';
nonEssentialContent += '<h2>Roses are Red...</h2>';
nonEssentialContent += '<p>Roses are red,<br />';
nonEssentialContent += 'Violets are blue,<br />';
nonEssentialContent += 'Client-Side Includes are new to me,<br />';
nonEssentialContent += '<span class="last-line">How about you?</span></p>';

异步加载非必要内容

var nonEssentialContentScript = document.createElement('script');

function loadMainEvent() {

    [... CODE HERE...]

    containerDiv.innerHTML = nonEssentialContent;

    [... CODE HERE...]

}

function loadNonEssentialContent() {
    nonEssentialContentScript.setAttribute('src', '/path/to/non-essential-content.js');
    document.body.appendChild(nonEssentialContentScript);
    nonEssentialContentScript.addEventListener('load', loadMainEvent, false);
}

loadNonEssentialContent();

我唠叨的感觉是,因为我是自学成才的,我可能缺少一种非常明显(和优越)的方法来构建客户端包含

我还担心,即使上述方法适用于生产环境,它也可能包含我没有想到的陷阱

所以,上面的问题又来了......如何最好地插入非必要内容?

JavaScript AJAX HTML 服务器端 客户端

评论

1赞 ADyson 10/6/2017
这实际上是一个品味问题,您的应用程序的现有结构(如果有的话),您的性能要求等。 就我个人而言,我会立即排除document.write和iframe,但除此之外,您将面临ajax或插入服务器端然后选择然后显示/隐藏的选择。在非常基本的层面上,这种选择可以取决于你有多少“非必要”数据,预先加载(没有ajax)需要多长时间,以及你认为用户会多久看一次。Ajax 调用具有性能和带宽开销。但是,加载从未使用过的数据也是如此。
1赞 ADyson 10/6/2017
因此,实际上,您必须考虑用例,并决定您认为适合您的应用程序和用户的方法,以及您可能操作的任何限制。这不是一个任何人都可以明确回答的问题。“最佳”解决方案是适合您具体情况的解决方案。
0赞 Rounin 10/6/2017
所以我没有错过任何明显的东西吗?我从上面的评论中推断,Ajax 比插入指向 javascript 字符串或 javascript 对象的 <script> 元素更可取。有什么优势?Ajax 在这个设置中是不是超出了要求?(或者插入<脚本>元素是否存在问题?
0赞 ADyson 10/6/2017
将脚本添加到页面没有错。当然,您可以使用它来显示/隐藏内容,具体取决于用户单击的内容。有很多这样的例子。就像我说的,这是使用 ajax(额外的 HTTP 请求)的开销与自动加载大量内容之间的权衡,然后永远不会被查看。因此,这将取决于您网站和内容的确切性质。顺便说一句,刚刚查看了您的个人资料和简历,并惊讶于您以前没有多次处理过这种设计决策?
0赞 Emmanuel Delay 10/6/2017
我想,这主要是口味问题。几点想法: - HTML 擅长解析,所以一大块 html 的 innerHTML 非常有意义。请注意,新创建的 html 不会对以前定义的事件做出反应。(jQuery .on() 方法有帮助)。我会选择innerHTML而不是document.createElement()。如果需要一次更改多个元素(如表单验证),则将对象作为响应可能很有用

答: 暂无答案