javascript - JS 未在加载了 .load 的页面上执行

标签 javascript jquery single-page-application

我正在开发单页应用程序网站。所有导航都发生在一个 div 中。我使用 addEventListener 点击查找链接,阻止常规 href 并在 div 中打开它。

使用这段代码,我可以更改页面,保留页眉和页脚,而无需刷新整个页面。

var spa_array = Array.from(document.getElementsByClassName('spa')); // Array with history (for the back button)

spa_array.forEach( function(b) {
    var id = b.id;
    b.addEventListener('click', function(e) {
        event.preventDefault(); // Prevent href
        history.pushState({id:id}, null, id); // Change url on browser
        openPage(id);
    });
});

window.addEventListener('popstate', function(e) {
    openPage(e.state.id);
});

function openPage(url) {
    var encodedUrl = encodeURI(url);
    $("#spa").load(encodedUrl); // open link inside the div
}

这就是问题所在:我使用 JS 在 div 上加载一个新页面,例如 index_2.html。 index_2.html 页面上的链接不会触发 JS addEventListener,因此会刷新页面并打开新链接。

JS 未应用于在 .load 中打开的页面。有没有一种方法可以应用相同的脚本,而无需再次调用它(这会造成很多麻烦)?

最佳答案

使用委托(delegate)的事件处理程序:

$("#spa").on('click', '.spa', function(e){
    var anchor = this,
        id = anchor.id;
    e.preventDefault();
    history.pushState({id:id}, null, id);
    openPage(id);
});

您可以在未被删除的 DOM 节点上注册处理程序(在您的例子中,容器的内容发生变化,但元素本身保持不变),并将选择器作为第二个参数传递以检查是否单击发生在其中与选择器匹配的元素上。

这是必要的,因为一旦您 .load() 添加了内容,它将替换之前元素中的任何内容,包括您在第一次加载时附加的任何事件监听器。每次内容更改时,您都需要调用循环,但这是一种资源密集度较低的解决方案,可以为您省去麻烦。

关于javascript - JS 未在加载了 .load 的页面上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698037/

相关文章:

jquery - 通过单击标签以编程方式取消选择单选按钮

javascript - Vue-router嵌套路由未加载我的组件页面

javascript - SPA 中用户数据存储在哪里

Spring 捕获 index.html 的所有路由

javascript - 为 Angular Material $mdDialog 提供 Angular ui-router 状态的 url

javascript - 仅对 jqgrid 中的当前页行进行排序

javascript - 单击 iframe 内容内的按钮时如何更改 iframe 高度

jquery - 焦点事件在所选 jquery 中不起作用

javascript - 从本地文件夹响应 native 调用动态图像

javascript - 阅读有关数据库结果的更多信息