PJAX 取回的 JS 文件未生效的问题
这两天参考社区里 龙哥 和 ChiVincent 的两篇关于 pjax 的文章 在 Laravel 应用中使用 pjax 进行页面加速 和 在 Laravel 5.3 中使用 Pjax,着手给自己的博客使用上该特性。
我的博客是用 laravel 5.3 写的,前端使用了 jquery-pjax , 后端使用了 JacobBennett/pjax , 按照步骤操作下来,体验貌似不错,但点了几下发现问题:我博客使用了 gulp 将所有需要的(除了jquery) 压缩到 all.js 文件当中,然后放在 body 最底部,当我用 pjax 去请求页面时, 查看 response :
看到响应的内容中,明明有返回 all.js ,但实际上,js 并未进行加载,除了 boostrap 带的响应式菜单未失效外(但是,我 bootstrap 脚本也包含在 all.js 中),其他的 js 效果都失效了。
同学们可以看看我的博客 麦肯先生,目前仍然是这个问题。帮忙找找原因,谢谢。
需要多了解下 PJAX 的原理:
简单来说是利用 pushState 和 ajax 来实现 HTML DOM 的「局部刷新」,并且去除页面 JS 的再次加载来加快页面访问速度。
PJAX 里的 JS 运行环境不同于「页面刷新」的运行环境。
像以下代码
$(document).ready
只会发生在「页面刷新」的时候触发:后续的通过 PJAX 来渲染的「局部刷新」页面,都需要使用 PJAX 的事件
pjax:end
来触发:康哥你需要做的不是让 all.js 加载起来,而是重构 all.js 的初始化流程。可以参照 phphub 的 js 初始化流程: