JavaScript 在 Squarespace 中只被调用一次

IT技术 javascript squarespace
2021-03-13 15:14:15

我的 SquareSpace 站点上有一些自定义 JavaScript,它可以操作 SquareSpace 的默认样式编辑器无法完成的产品标题。它在最初加载页面 ( https://www.manilva.co/catalogue-accessories/ )时起作用,但如果您单击左侧的任何类别,样式将重置为默认值。

我假设 JavaScript 被 SquareSpace 样式覆盖,但我不知道为什么。也许我在错误的地方调用了这个函数?

任何的意见都将会有帮助。

谢谢!

当前代码:

document.querySelectorAll(".ProductList-filter-list-item-link".forEach(i=>i.addEventListener("click", function()
  {
      var prodList = document.querySelectorAll("h1.ProductList-title");
  for (i = 0, len = prodList.length; i < len; i++) 
  {
    var text = prodList[i].innerText;
    var index = text.indexOf('-');
    var lower = text.substring(0, index);
    var higher = text.substring(index + 2);
    prodList[i].innerHTML = lower.bold() + "<br>" + higher;

  });
2个回答

问题的根源在于您的模板启用了 AJAX 加载。作为 Squarespace 开发人员,目前有几种普遍接受的方法来处理这个问题:

  1. 禁用 AJAX 加载
  2. 编写您的 javascript 函数,使其在初始站点加载时以及发生“AJAX 加载”时运行。

选项 1 - 禁用 AJAX

  1. 在“主页”菜单中,单击“设计”,然后单击“站点样式”
  2. 向下滚动到站点:加载中
  3. 取消选中启用 Ajax 加载


选项 2 - 在您的 JS 中使用 AJAX

开发人员可以通过多种方式来解决这个问题,包括通过全站代码注入添加的以下方法

<script>
window.Squarespace.onInitialize(Y, function() {
  // do stuff
});
</script>

或者

<script>
(function() {
  // Establish a function that does stuff.
  var myFunction = function() {
    // Do stuff here.
  };

  // Initialize the fn on site load.
  myFunction();
  // myFunction2(); , etc...

  // Reinit. the fn on each new AJAX-loaded page.
  window.addEventListener("mercury:load", myFunction);
})();
</script>

或者

<script>
(function() {
  // Establish a function that does stuff.
  var myFunction = function() {
    // Do stuff here.
  };

  // Initialize the fn on site load.
  myFunction();

  // Reinit. the fn on each new AJAX-loaded page.
  new MutationObserver(function() {
    myFunction();
    // myFunction2(); , etc...
  }).observe(document.body, {attributes:true, attributeFilter:["id"]});
})();
</script>

大多数情况下,这些中的每一个都适用于大多数最新的(在撰写本文时)模板。每一种都有其优点和缺点,以及它们无法按预期工作的上下文(例如,在/cart/页面或其他“系统”页面上)。通过在上述方法之一的上下文中添加您的代码,并确保代码当然在所需的上下文中工作并且没有其自身的错误/问题,您将在初始站点加载和每个 AJAX 页面上运行您的代码加载(有一些例外,取决于您使用的方法)。

如果您在 Squarespace 页面上添加一个 HTML 块,并在其中放置一个 <script> ,则该脚本实际上不会在 AJAX 加载时执行,即使它被添加到页面中。我认为这是因为 HTML 块仅作为内部 HTML 与脚本一起添加,而不是添加脚本节点本身。添加一些标记会起作用,但这需要将实际的 JavaScript 添加到站点范围的代码中。换句话说,使用 AJAX 加载,所有自定义 JS 代码都必须是站点范围代码的一部分。在某些情况下,我只是喜欢代码块,因为我更喜欢封装。
2021-04-20 15:14:15
关于选项 2,如果我添加代码来侦听 AJAX 加载,则需要在页面首次加载时添加该代码,对吗?所以我必须将它添加到站点的每个页眉(使用加载的脚本)。然后,如果我想要只特定于一个页面的代码,我必须检测正在加载哪个页面并检查它是否是正确的页面?
2021-04-22 15:14:15
@Andrew:如果我理解,那么答案是 1) 以上选项二中的所有片段都考虑了初始加载和后续 AJAX 加载。第一个片段使用.onInitializewhich 在两种情况下运行,第二个片段使用初始函数调用来加载第一个页面,然后使用 eventListener 或 mutationObserver 加载 AJAX。2)您可以通过站点范围的页脚或页眉代码注入来添加它,从而避免添加到每个页面(请参阅编辑后的答案)。3) 是的,// Do stuff here需要包含检查适当/适用条件以运行其他代码的逻辑。
2021-05-12 15:14:15
谢谢布兰登!那是完美的并且有效!我暂时禁用了 AJAX 加载,因为我对 Squarespace 开发还很陌生,但将来我会添加代码并保持启用 AJAX 加载。
2021-05-17 15:14:15
是的,基本上回答了我的问题,谢谢!例如,它仍然无法解决允许您在 SquareSpace 中使用具有 JavaScript 的自定义“代码”块的情况(例如,如果您正在用一些孤立的代码编写博客文章)。我看到 <script> 节点确实被添加到 DOM,但没有运行。虽然,有可能检测到那些被插入的节点并在它们上运行 eval() ......我觉得这会带来安全风险。
2021-05-20 15:14:15

您的问题是单击左侧的按钮时页面不会重新加载,只是删除、添加和替换了一些元素。更改的元素不会被重新设计。单击这些按钮之一后,您将需要重新运行 JavaScript。也许是这样的:

document.querySelectorAll(
    ".ProductList-filter-list-item"
).forEach(
    i=>i.addEventListener(
        "click", ()=>console.log("hello")
    )
)

console.log("hello")用什么来替换你的格式。

是的。您还需要每次都再次添加事件句柄。
2021-04-23 15:14:15
似乎您缺少 querySelector 的“)”
2021-04-26 15:14:15
我已经使用我添加的代码更新了我的问题以尝试实现这一目标,尽管它目前无法正常工作并且我收到了错误消息。
2021-05-18 15:14:15
我已经修复了所有错误,看起来当我单击一个按钮时,它是在单击按钮之前将代码应用于页面,而不是在单击后应用于标题。
2021-05-18 15:14:15
谢谢 - 试一试!只是我很清楚,你说在哪里替换console.log,你的意思是用我为重置格式所做的功能?
2021-05-20 15:14:15