【问题标题】:Code from bookmarklet works in console but not in my Tampermonkey script?小书签中的代码在控制台中有效,但在我的 Tampermonkey 脚本中无效?
【发布时间】:2014-05-29 00:34:08
【问题描述】:

tl;博士

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

这些是特定脚本的设置:

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


检查语法后(见 cmets):


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

【问题讨论】:

  • 您是否单击了检查语法错误按钮?它直接在“更新网址”的左侧。
  • @Vedaad,是的,它确实说语法错误(见编辑),但代码“有效”。它是合法的 JavaScript —— 它可以在控制台中运行。
  • 为什么不用分号替换这些逗号呢?至少你可以排除这是一个原因
  • @Phil 我试过了,每次都重新检查语法。显然语法解析器有问题。中途我就放弃了。见编辑。
  • @Phil 你能自己试试代码吗,至少在控制台里?

标签: javascript google-chrome tampermonkey


【解决方案1】:

该脚本依赖于一个非常短的计时器来加载 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]
} );

【讨论】:

  • 什么是通用汽车?你能解释一下@grant吗?
  • 可能油猴
  • GM 是 Greasemonkey——Tampermonkey 非常努力地重新创建的 Firefox 插件。在这种情况下,@grant 强制沙箱重新打开,并且只允许指定的 GM_ 函数。 @grant 最大限度地减少了 GM 和 TM 中的冲突,并且该脚本在两者中的工作方式相同。
猜你喜欢
  • 1970-01-01
  • 2019-06-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多