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

问题描述 投票:0回答:2

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

这是一个示例 URL:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets

我的搭配规则:

/^https://.*\.rallydev\.com/.*/changesets$/

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

不知道从这里去哪里。如有任何帮助,我们将不胜感激。

javascript greasemonkey rally
2个回答
9
投票

不可能确定发生了什么,因为目标页面位于付费墙后面,并且他们所谓的“免费试用”机制会造成巨大损失。

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

  1. 初始请求不安全 (http),但会重定向到安全页面 (https)。
  2. 第一个页面加载会执行某种其他类型的重定向到实际页面。
  3. 目标内容位于
    <iframe>
    中,无法立即加载。
  4. 目标内容是 AJAX 化的。
  5. 一些奇特的东西,我们需要查看实际页面才能弄清楚。
  6. 初始 URL 并不是真正以
    changesets
    结尾。

此外,养成转义正则表达式

middle
中的 / 的习惯。它并不总是需要的,但如果你不这样做,它最终会在[审查]中咬你一口。 所以脚本应该使用:

// @include  /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/

开始,但请参阅下文。


解决步骤:

  1. 更改

    @include
    以考虑 http 以及 URL 中尾随空格或尾随斜杠的可能性。用途:

    // @include  /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/
    
  2. 使用 Firebug 检查页面。内容是否采用 AJAX 嵌入?是在
    <iframe>
    中吗?如果有,iframe URL 是什么?
  3. 要同时检测 AJAX 和/或重定向,请使用 Firebug 的网络面板 和/或 Wireshark
  4. 如果可能,请向我们提供登录凭据,以便我们可以看到有问题的页面。
  5. 拍摄有问题的页面快照(通过 Firefox 保存)并链接到 Pastebin.com 中的 HTML 和 JS。
  6. 考虑使用如下代码:

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

    让脚本仅在(或不在)iframe 中运行(如果适用)。


如果问题是由 AJAX 延迟(或加载新内容)引起的,请使用

waitForKeyElements()
实用程序 来解决该问题,如 “针对 AJAX 请求启动 Greasemonkey 脚本”


0
投票

虽然这个帖子已经过时了,但我正在试试运气,也许有人正在看。

我遇到的问题是 Greasemonkey 脚本仅在重新加载时运行。

在我的脚本的开头,我包含了一个“调试器”语句。

这是在重新加载后调用的,而不是在第一次运行时调用,因此 Greasemonkey 中的所有代码都不会被激活。

我尝试过使用普通 JS (window.onload) 和“waitForKeyElements”方法的解决方案。

两种解决方案都按预期工作,但只有在重新加载后!

什么可以阻止 Greasemonkey JS 在第一次加载时被调用???

JS纯解决方案如下开始:

// ==UserScript==
// @name     DHL exportiere Sendungsdaten
// @version  1
// @match https://geschaeftskunden.dhl.de/content/vls/vc/ShipmentOverview
// @noframes
// @grant    none
// ==/UserScript==

debugger

window.onload = load

var iframe; var iframe_document; var list; var printed_entry; var myInterval=null; var initted = false

function load () {
  debugger
  if (!initted) {
    initted = true;
    if (myInterval)
    {
      clearInterval(myInterval)
    }
    myInterval = setInterval(add_button, 1000)
  }
}

“waitForKeyElements”方法就是这样开始的

// ==UserScript==
// @name     DHL exportiere Sendungsdaten
// @version  1
// @match https://geschaeftskunden.dhl.de/content/vls/vc/ShipmentOverview
// @noframes
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @require  https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @grant    GM_addStyle

// ==/UserScript==

var list; var printed_entry;

//waitForKeyElements (selectorTxt,actionFunction,bWaitOnce,iframeSelector)

debugger;
waitForKeyElements (
  "ul.nav-pills",
  add_button,
  true,
  'iframe[title^="Ship"]'
);
© www.soinside.com 2019 - 2024. All rights reserved.