不要在Userscript中使用外来动态注入外部库。他们改为@require
。
我正在尝试使用以下脚本修改this page:
console.log("run");
!function(){var e=document.createElement("SCRIPT")
e.src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js",e.type="text/javascript",document.getElementsByTagName("head")[0].appendChild(e)
var t=function(e){window.jQuery?e(jQuery):window.setTimeout(function(){t(e)},100)}
t(function(e){e(".title").children().each(function(){this.href="/"+this.href.split("'")[1]})})}()
该脚本在控制台上运行良好(试一试),将窗口打开链接转换为URL href
。但是,Tampermonkey中的相同脚本不起作用(调试行显示在控制台中,表明脚本确实正在运行):
这些是特定脚本的设置:
我做错了什么?如何使脚本在Tampermonkey中运行?
检查语法后(见注释):
将一些逗号更改为分号 - 这是一团糟。
答案 0 :(得分:2)
该脚本依赖于一个非常短的计时器来加载jQuery。这是非常糟糕的形式;它设定了一种竞争条件,在某种情况下可能没问题,但在其他情况下可能会失败。
它可能(通常)在控制台上工作,因为大多数代码都是同步操作的,并且它们都在同一范围内。
但是来自Tampermonkey脚本switches scopes and injects的代码,但不是所有需要的代码。
不要use jQuery from a userscript那样!保持脚本沙盒并使用@require
以获得更好的性能。
在这种情况下,您的整个脚本将变为:
// ==UserScript==
// @name OpenHymnal fix
// @match http://openhymnal.org/genindex.html
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
console.log ("run");
$(".title").children ().each (function () {
this.href = "/" + this.href.split("'")[1]
} );