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

Javascript Greasemonkey脚本仅在重新加载页面时运行,javascript,greasemonkey,rally,Javascript,Greasemonkey,Rally,我正在编写一个Greasemonkey脚本,将一些文本转换为页面上的链接。只有在我重新加载页面时,脚本才能正常工作。如果我以任何方式(链接、浏览器前进/后退)导航到页面,脚本不会运行,尽管Greasemonkey菜单在底部显示我的脚本,并带有复选标记 以下是一个示例URL: https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets 我的匹配规则: /^https://.*\.rallydev\

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

以下是一个示例URL:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets
我的匹配规则:

/^https://.*\.rallydev\.com/.*/changesets$/
我不知道散列是否引起了问题,但当我重新加载时,一切都很好


不知道从这里到哪里去。感谢您提供的任何帮助。

我们无法确定到底发生了什么,因为目标页面位于工资墙后面,而他们所谓的“免费试用”机制则是一团糟

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

  • 初始请求不安全(http),但会重定向到安全页面(https)
  • 第一个页面加载执行某种其他类型的重定向到实际页面
  • 目标内容位于不会立即加载的
  • 目标内容是AjaxIn
  • 一些奇异的东西,我们需要看到实际的页面才能弄清楚
  • 初始URL实际上并不以
    变更集
    结尾
  • 也要养成在正则表达式中间逃出<代码> /<代码>的习惯。它并不总是需要的,但如果你不这样做,它最终会在[审查]中咬你一口。 因此,脚本应使用:

    // @include  /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/
    
    开始,但请参见下文


    解决方案的步骤:

  • 更改您的
    @include
    ,以考虑http以及URL中尾随空格或尾随斜杠的可能性。使用:

    // @include  /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/
    
  • 检查页面时使用。内容是否包含在Ajax中?它在
    中吗?如果是,iframe URL是什么(如果有的话)
  • 要检测AJAX和/或重定向,请使用和/或
  • 如果可能,请向我们提供登录凭据,以便我们看到有问题的页面
  • 快照一个有问题的页面(通过Firefox保存),并在中链接到该HTML和JS
  • 考虑使用如下代码:

    if (window.top != window.self) {
        //--- Don't run on/in frames or iframes.
        return;
    }
    
    使脚本仅在(或不在)iframe中运行(如适用)



  • 如果问题是由AJAX延迟(或加载新内容)引起的,请按中所示使用解决。

    如果在重新加载时可用,则我怀疑匹配是否重要……同意,我之所以包含该信息,是因为我想有人会问。:)这非常有帮助,非常感谢。这是一个AJAX问题,尽管一开始我被页面上链接的配置方式愚弄了。我尝试使用waitforkyelloments(),将规则应用于整个域,它似乎起到了作用。它有点重(希望我不需要加载jQuery),但它可以工作并且看起来很可靠。非常感谢,不客气。我曾经想过创建一个不需要jQuery的
    waitforkyellements
    ,但除了最简单的脚本之外,其他脚本都使用jQuery。它并没有那么重,特别是当你使用
    @require
    指令时,通用汽车在你的本地机器上运行它。jQuery令人敬畏的优点使脚本编写变得更加容易。非常感谢所有相关人员。我正在使用Amazon的签出过程,起初我没有意识到这一点,但他们正在使用AJAX加载每个“页面”,并通过
    window.location.pathname
    更改URL。我将脚本更新为@include any page in the process,并轻松地将其转换为使用
    waitforkyelments
    。这是一个3分钟的解决方案,可以解决一个巨大的调试噩梦。