我正在编写一个 Greasemonkey 脚本,将一些文本转换为 a Rally 页面上的链接。当我重新加载页面时,脚本工作正常仅。如果我以任何方式导航到该页面(链接、浏览器前进/后退),脚本都不会运行,尽管 Greasemonkey 菜单在底部显示了我的脚本,并带有复选标记。
这是一个示例 URL:
https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets
我的搭配规则:
/^https://.*\.rallydev\.com/.*/changesets$/
我不知道哈希是否导致了问题,但是当我重新加载时一切都很好。
不知道从这里去哪里。如有任何帮助,我们将不胜感激。
不可能确定发生了什么,因为目标页面位于付费墙后面,并且他们所谓的“免费试用”机制会造成巨大损失。
以下是当前行为的一些可能原因:
<iframe>
中,无法立即加载。changesets
结尾。此外,养成转义正则表达式
middle中的
/
的习惯。它并不总是需要的,但如果你不这样做,它最终会在[审查]中咬你一口。
所以脚本应该使用:
// @include /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/
开始,但请参阅下文。
解决步骤:
更改
@include
以考虑 http 以及 URL 中尾随空格或尾随斜杠的可能性。用途:
// @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/
<iframe>
中吗?如果有,iframe URL 是什么?考虑使用如下代码:
if (window.top != window.self) {
//--- Don't run on/in frames or iframes.
return;
}
让脚本仅在(或不在)iframe 中运行(如果适用)。
waitForKeyElements()
实用程序 来解决该问题,如 “针对 AJAX 请求启动 Greasemonkey 脚本”。
虽然这个帖子已经过时了,但我正在试试运气,也许有人正在看。
我遇到的问题是 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"]'
);