【问题标题】:Why isn't my click handler being applied in a Greasemonkey script? [duplicate]为什么我的点击处理程序没有应用到 Greasemonkey 脚本中? [复制]
【发布时间】:2019-03-22 14:39:50
【问题描述】:

我正在尝试使用jQuery 创建一个简单的 Greasemonkey 脚本。 jQuery 已经从页面脚本加载。

我需要一个非常简单的改变:

var $ = unsafeWindow.jQuery;
$("body").prepend('<button id="tsDownload">DownloadExcel</button>');
$("#tsDownload").click(function(){
   alert("TEST!");
});

脚本可以添加按钮,但无法附加点击事件,该部分被忽略。你能告诉我为什么吗?与安全有关吗? 例如,经过几次后,我发现我必须添加第一行才能从“unsafeWindow”中获取jQuery

如果我从控制台尝试此代码,它会起作用!这就是为什么我猜测 Greasemonkey 的安全限制。

【问题讨论】:

    标签: jquery greasemonkey


    【解决方案1】:

    这是一个尝试访问页面上使用的 jQuery 实例的安全问题,它被视为一个单独的窗口并有一些限制。

    然而,这根本不是真的要完成的。相反,您应该在 GreaseMonkey 脚本中包含您自己的 jQuery 实例。你可以通过添加来做到这一点

    // @require  https://code.jquery.com/jquery-3.3.1.min.js
    

    到脚本顶部的注释。是的,这意味着脚本被加载了两次,但它是在本地缓存的,意义不大。

    【讨论】:

    • 如果按钮正在被添加,这是否意味着 jQuery 正在正确加载?
    • 正在正常加载,它只是在从GM内部访问GM外部脚本时有安全限制。显然您可以添加元素但不能分配处理程序。不完全确定原因,但我测试过,确实如此。
    • 如果站点已经有 jQuery,仅仅@require 是不够的。除了none,您还必须设置@grant。请参阅第一个重复的问答。
    • @Amunium,这不是科学/工程/测试的工作方式。 “喝了一箱 Schlitz 后,我刚刚以 90 英里/小时的速度驶过一个学区。我没有撞到任何人(重要的),所以一定没问题。”
    • @BrockAdams,嗯,这既是不必要的居高临下,也是完全错误的。这正是你测试事物的方式。而你的“类比”完全没有意义。
    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多