Greasemonkey脚本仅在重新加载页面时运行

nei*_*ilw 7 javascript greasemonkey rally

我正在使用Greasemonkey脚本将一些文本转换为Rally页面上的链接.只有在我重新加载页面时,脚本才能正常工作.如果我以任何方式导航到页面(链接,浏览器向前/向后),脚本都不会运行,尽管Greasemonkey菜单在底部显示我的脚本,并带有复选标记.

这是一个示例URL:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets
Run Code Online (Sandbox Code Playgroud)

我的匹配规则:

/^https://.*\.rallydev\.com/.*/changesets$/
Run Code Online (Sandbox Code Playgroud)

我不知道哈希是否导致问题,但重新加载时一切都很好.

不知道从哪里开始.任何帮助表示赞赏.

Bro*_*ams 9

无法确定发生了什么,因为目标页面位于付费墙后面,而他们所谓的"免费试用"机制会破坏大块.

以下是当前行为的一些可能原因:

  1. 初始请求是不安全的(http),但重定向到安全页面(https).
  2. 第一页加载会执行另一种重定向到实际页面.
  3. 目标内容<iframe>不会立即加载.
  4. 目标内容是AJAXed-in.
  5. 我们需要看到实际页面才能找到的异国情调.
  6. 最初的URL并没有真正结束changesets.

另外,养成/在正则表达式中间转义s 的习惯.它并不总是需要,但如果你不这样做,它最终会在[审查]中咬你.所以脚本应该使用:

// @include  /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/
Run Code Online (Sandbox Code Playgroud)

开始,但见下文.


解决方案的步骤:

  1. 将您@include的帐户更改为http以及URL中的尾随空格或尾随斜杠的可能性.使用:

    // @include  /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用Firebug检查页面.内容是AJAXed-in?它在一个<iframe>?如果是这样,iframe网址是什么?
  3. 要同时检测AJAX和/或重定向,请使用Firebug的Net面板和/或Wireshark.
  4. 如果可能,请向我们提供登录凭据,以便我们可以看到有问题的页面.
  5. 快照一个有问题的页面(通过Firefox保存)并链接到Pastebin.com中的HTML和JS .
  6. 考虑使用以下代码:

    if (window.top != window.self) {
        //--- Don't run on/in frames or iframes.
        return;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    让脚本仅在(或不在)iframe中运行,如果适用的话.


如果问题是由AJAX延迟(或加载新内容)引起的,请使用"AJAX请求中的Fire Greasemonkey脚本"中所示waitForKeyElements()实用程序来解决问题.

  • 这非常有帮助,非常感谢.这是一个AJAX问题,虽然我最初被页面上配置链接的方式所欺骗.我尝试使用waitForKeyElements(),将规则应用于整个域,它似乎正在工作.它有点重量级(希望我不需要加载jQuery),但它工作,似乎是可靠的.谢谢捆绑. (2认同)
  • 别客气.我曾经想过创建一个不需要jQuery的`waitForKeyElements`,但除了最简单的脚本之外,其他所有脚本都使用jQuery.它不是那么重量级,尤其是当你使用`@ require`指令时,GM将它从你的本地机器上运行.jQuery的优秀功能使脚本编写变得更加容易. (2认同)
  • 非常感谢所有参与者.我正在使用亚马逊的结帐流程,我一开始并没有意识到这一点,但他们是AJAX加载每个"页面"并通过`window.location.pathname`更改URL.我将我的脚本更新为@include过程中的任何页面并轻松将其转换为使用`waitForKeyElements`.这是一个3分钟的解决方案,可能是一场大规模的调试噩梦. (2认同)