bookmarklet中的代码在控制台中工作,但在我的Tampermonkey脚本中却没有?

时间:2014-05-29 00:34:08

标签: javascript google-chrome tampermonkey

tl; dr

不要在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中的相同脚本不起作用(调试行显示在控制台中,表明脚本确实正在运行):

screenshot

这些是特定脚本的设置:

screenshot

我做错了什么?如何使脚本在Tampermonkey中运行?


检查语法后(见注释):

syntax


将一些逗号更改为分号 - 这是一团糟。

bad parser

1 个答案:

答案 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]
} );