防止 $.pjax 将动态脚本标签移动到头部

Prevent $.pjax from moving dynamic script tags to the head section

我们几个月前在 CodeIgniter 应用程序中实现了 $.pjax。它似乎工作完美。最近用户开始抱怨某些按钮有时会出现奇怪的行为。调试一段时间后,我们发现 PJAX 正在将脚本标签从新加载的片段移动到文档的头部。

这太棒了,你会想,因为标题和 css 资源也被移到了头部。我们可以从中受益(pushstate,浏览器选项卡名称,...)。

遗憾的是,单击另一个 pjax link 不会删除这些添加的 script/css 标签。当绑定到具有相同 id 或 class 的元素出现在其他新添加的脚本中时,这会变得很奇怪。它往往会破坏东西。

有谁知道如何删除之前添加的脚本标签(不是全部,只有那些由 pjax 添加的)?目前唯一的出路是放弃 pjax.. 但我非常喜欢它:(

正如这个问题的标题所暗示的,我们认为最简单的方法可能是首先阻止 $.pjax 将标签从片段移动到头部。

好久没问这个问题了。我们找到了解决此 pjax 行为的方法。

pjax 仅移动 'linked' javascript 和 css 源。当代码在in部分时,会停留在同一个地方,会执行一次部分内容添加到 DOM.

Github 一些人建议在 <script> 标签上使用 context="inline",不应将其移至 <head> 部分。

因此我们针对部分视图中的脚本的解决方案:

<script type="text/javascript" context="inline">
    <?= file_get_contents(js_url().'controllers/'.$jsController.'.js'); ?>
</script>

显然,在使用 PHP 读取文件之前应该检查文件是否存在。