外部JS文件的函数在无限滚动后无法加载

时间:2014-06-16 10:34:11

标签: javascript jquery tumblr infinite-scroll

我在tumblr上使用gumroad.js,无限滚动

<script type="text/javascript" src="https://gumroad.com/js/gumroad.js"></script>

这会在按钮点击时创建一个叠加检查(模态)窗口。对于前15个帖子,它加载正常。但是,一旦其余按钮加载无限滚动,它们就不会加载js功能。

该脚本位于页面<head>

我是否需要在无限滚动的每次回调中重新加载文件?:function(newElements) {

修改

我刚注意到无限滚动后,soundcloud播放器也在消失。这些都是自定义类。它们出现在检查器中,因为这些类仍处于机智状态,但是js文件没有得到处理。

1 个答案:

答案 0 :(得分:1)

已知无限滚动会导致脚本出现问题。是的,你可能需要在每次加载页面后在回调中重新初始化Gumroad。我对Gumroad了解不多,但快速搜索了

Gumroad.init()

作为重新初始化代码的方法。

如果我错了,有人可以纠正我,但在回调中放这一行应该有效!


修改

我们无法阻止Gumroad.js在每次运行init()后创建重复按钮,因此我们只需要擦除所有按钮并让它们重新初始化。也无法取消附加点击处理程序,因此您需要克隆锚点以将其删除。在每次无限滚动回调之后,您将需要运行此代码以将所有gumroad链接恢复正常,然后调用Gumroad.init()重新初始化。我不确定你是否使用jQuery,但如果是这样,这是最简单的方法。

使用their demo作为模型:

<强>的jQuery

$('.gumroad-button').each(function() {
    $(this).replaceWith($(this).clone().children().remove().end()); 
});
Gumroad.init();

香草javascript

for (var i = 0, a = document.getElementsByTagName("a"); i < a.length; i++) {
  if (a[i].className.indexOf("gumroad-button") > -1) {
    var clone = a[i].cloneNode();
    clone.appendChild(document.createTextNode(a[i].lastChild.nodeValue));
    a[i].parentNode.replaceChild(clone, a[i]);
  }
}
Gumroad.init();

备注

选择要删除的子元素后,需要

.end() 来引用克隆元素 .remove() 不会删除文本节点,因此在克隆(最佳)后,只会删除按钮的“图标”部分。

如果您使用的是vanilla javascript,则需要在克隆后复制文本节点(“购买我的产品”)。但是,不要使用DOM Node.cloneNode 方法深度克隆(克隆所有子元素)(通过将true传递给.cloneNode(true)来克隆锚点,然后删除不必要的子元素(即图标),就像jQuery方式一样,你只需要浅层克隆锚点,然后复制文本。

同样,我们需要克隆并替换锚链接元素以摆脱重复的点击处理程序,否则当您单击按钮时,它将实际执行两次Gumroad叠加模式。