【发布时间】:2021-12-25 22:54:24
【问题描述】:
我正在尝试在 HubSpot 网站上实施 barba.js。
考虑以下两页:
- 资源
- 客户
使用我当前的barba.js 实现,这是我正在经历的当前流程:
- 我访问了
resources页面(不是通过转换到它,而是通过/resources直接访问它)。 - 此时,我所有的
js都在工作(slick-sliders、滚动功能等) - 然后我使用导航访问
customers页面。页面已加载,但特定于该页面的模块和表单的所有js均无效。
简而言之,js 用于我 transition 不起作用的页面。
为了解决这个问题,我要做的是重新加载 container beforeEnter() 中的所有 scripts。
见下文:
$(function() {
function delay(n){
n = n || 2000;
return new Promise((done) => {
setTimeout(() => {
done();
}, n);
});
}
barba.init({
sync: true,
prefetchIgnore: true,
debug: true,
transitions: [{
async leave(data){
const done = this.async();
await delay(200);
done();
},
async beforeEnter({ next, container }) {
$(container).find('script').each(function (i, script) {
var $script = $(script);
$.ajax({
url: $script.attr('src'),
cache: true,
dataType: 'script',
success: function () {
$script.trigger('load');
}
});
});
},
async enter(data){
let scrollX = 0
let scrollY = 0
barba.hooks.leave(() => {
scrollX = barba.history.current.scroll.x;
scrollY = barba.history.current.scroll.y;
});
window.scrollTo(scrollX, scrollY);
},
async once(data){
console.log("done");
},
}]
});
});
但是,我当前的beforeEnter() 仍然产生相同的结果。有什么办法吗?
编辑
为了提供更多详细信息,此barba.js 实现适用于HubSpot 站点。当您在 HubSpot 中创建 custom modules 时,它会在页面上吐出该模块的 JS(在 script 标记中)。例如,下面是 JS 在页面上的渲染方式:
<script>
// js from custom module is here
</script>
<script src=".../scripts-min.min.js"></script>
因此,当执行 barba 转换时,我需要所有具有 src 的 JS 和内联呈现的那些(如自定义模块)重新加载。
基于User863的反馈的最新方法
$(function() {
function delay(n){
n = n || 2000;
return new Promise((done) => {
setTimeout(() => {
done();
}, n);
});
}
function reload_scripts(param){
$(param).find('script').each(function (i, script) {
var $script = $(script);
$.ajax({
url: $script.attr('src'),
cache: true,
dataType: 'script',
success: function () {
$script.trigger('load');
console.log("scripts loaded");
}
});
});
}
barba.init({
sync: true,
prefetchIgnore: true,
debug: true,
transitions: [{
async leave(data){
const done = this.async();
await delay(200);
done();
},
async beforeEnter(data) {
reload_scripts(data.next.container);
},
async beforeEnter({ next }) {
reload_scripts(next.container);
},
async enter(data){
// scroll to top of page when transitioning
let scrollX = 0
let scrollY = 0
barba.hooks.leave(() => {
scrollX = barba.history.current.scroll.x;
scrollY = barba.history.current.scroll.y;
});
window.scrollTo(scrollX, scrollY);
},
async once(data){
console.log("transition complete");
},
}]
});
});
当前行为:与以前相同(页面更改时模块的脚本被破坏)。例如,带有slick slider 的模块不起作用(slick 未启动)。
【问题讨论】:
-
src的脚本是否正常工作? -
@User863 - 是的,看起来是这样。我有
js使header在滚动fixed上滚动,而这个js在转换到另一个页面时正在执行。只需要一种方法在没有src的页面上执行js
标签: javascript jquery ajax barbajs