【发布时间】:2018-01-19 10:57:10
【问题描述】:
tl;dr
我使用 ajax 来获取新内容。内容被提取并添加到页面。但是,脚本不会“重新触发”,因为它们的调用在 ajaxed div 之外。
脚本在初始页面加载时加载和触发没有任何问题,但当我通过 ajax 添加新内容时则没有。我没有收到控制台错误,如果我直接访问 URL 也没有问题。
相关:
- Forcing Script To Run In AJAX Loaded Page - 与一个特定的脚本有关。我想修复(重新启动)所有脚本,包括来自Cloudflare apps 的动态脚本
- Using jQuery script with Ajax in Wordpress - 同上,这只涉及一个特定的脚本
- ajax loaded content, script is not executing
简介:
我在 WordPress 网站上使用 Ajaxify WordPress Site(AWS)。
该插件允许您通过其 id 选择 div,然后使用 ajax 获取该 div 中的新内容
html 标记
<html>
<head></head>
<body>
<div id="page">
<header></header>
<main id="ajax"> <!-- This is what I want to ajaxify -->
<div class="container">
main page content
</div>
</main> <!-- end of ajaxfied content -->
<footer></footer>
</div> <!-- #page -->
</body>
</html>
问题
该插件有效,我加载了新内容并设置了样式,但存在问题。我的一些页面 脚本和函数调用 在我使用 ajax 的 div 之外。我有两个例子
1- Masonry 已加载并在 <footer> 中调用
<html>
<head></head>
<body>
<div id="page">
<header></header>
<main id="ajax"> <!-- This is what I want to ajaxify -->
<div class="container">
main page content
</div>
</main> <!-- end of ajaxfied content -->
<footer></footer> <!-- Masonry script is loaded and called here -->
</div> <!-- #page -->
</body>
</html>
2- 谷歌地图电话在<head>
<html>
<head></head> <!-- Google maps is called here -->
<body>
<div id="page">
<header></header>
<main id="ajax"> <!-- This is what I want to ajaxify -->
<div class="container">
main page content
</div>
</main> <!-- end of ajaxfied content -->
<footer></footer>
</div> <!-- #page -->
</body>
</html>
这只是两个示例。其他地方还有其他人。如您所知,此类脚本不会被重新调用,因为页面上重新加载的唯一内容是 <main id="ajax">。虽然<main> 中的新内容在那里,但正确呈现它所需的一些脚本没有被重新调用,因此我最终会丢失元素/破坏布局。
我不是唯一一个遇到这个问题的人;快速浏览一下插件的support forum on wordpress.org 就会发现这个问题很常见。
注意:如果插件有很多其他问题,我不会尝试解决这个问题。它对我有用,我只需要重新启动脚本。
官方回应是可以通过在插件的 php 文件中添加以下内容来重新加载/重新触发脚本:
$.getScript(rootUrl + 'PATH TO SCRIPT');
哪个有效。它运作良好。例如,如果我添加
$.getScript(rootUrl + '/Assets/masonry.js');
然后,即使 masonry.js 在 ajaxed div 之外加载,当获取 ajaxed 内容时,masonry 函数调用也会重新触发
我建议您参考plugin's files on github,以便更清楚地了解修复的实际作用(我无法理解使用$.getScript 时会发生什么)
总结
如果您有 3-4 个脚本需要在 ajaxed 内容上重新触发,则官方修复可以正常工作。
这对我的目标不起作用,因为
- 它太死板和硬编码
- 部分脚本通过Cloudflare apps动态添加到页面
一个可能的解决方案可能涉及添加一个事件来模拟触发器,该触发器导致脚本在 ajaxed div 的底部触发
问题:
当仅通过 ajax 重新加载页面的特定部分时,如何强制所有脚本 - 包括动态添加的脚本 - 重新触发?
注意事项:
-
我试图避免一一调用脚本,因为这需要事先了解它们的调用。我可能在我头上说话但是......
我正在尝试模仿页面加载和/或文档就绪事件 - 大多数条件脚本被触发(如果我错了,请纠正我) - 在我的 html 中的
<main>末尾添加新的 ajaxed 内容但不影响通过直接使用 url 加载页面时的文档...或任何其他类似的方法。 -
只是为了一点上下文,这里列出了插件关闭时页面上的一些事件侦听器。我知道里面有些东西我不需要触发。我只是添加了这个以供参考。另外,请注意,这是从其中一页中获取的样本。其他页面可能会有所不同。
DOMContentLoaded
beforeunload
blur
click
focus
focusin
focusout
hashchange
keydown
keyup
load
message
mousedown
mousemove
mouseout
mouseover
mouseup
mousewheel
orientationchange
readystatechange
resize
scroll
submit
touchscreen
unload
【问题讨论】:
-
您的所有插件都可能具有允许它们在页面加载时执行其在页面加载时执行的操作的方法,即使在页面加载后也是如此。例如,石工(我个人不知道)在 jQuery 的对象上公开了一个
masonry()方法。所以你可以使用这些方法而不是可疑的黑客攻击。 -
您的问题中的“tl;dr”是什么意思?最重要的问题...
-
@DonkeyKing acronymfinder.com/TLDR.html => “太长;不要阅读”(不要阅读所有内容,如果需要,请跳到底部/摘要/结论)
-
@VivekAthalye 谢谢 :-) 我认为它仅用于 Stack Exchange 网络...
标签: javascript ajax wordpress listener dom-events