【问题标题】:jQuery .ready not getting called from within Greasemonkey scriptjQuery .ready 没有从 Greasemonkey 脚本中被调用
【发布时间】:2013-07-27 12:52:10
【问题描述】:

我正在尝试编写一个简单的 Greasemonkey 脚本,但作为 Javascript 的初学者和 Greasemonkey 的新手,我一直遇到问题。到目前为止,这是我的代码:

// ==UserScript==
// @name        TEDToYoutube
// @include     http://www.ted.com/talks/*.html
// @exclude     http://www.ted.com/talks/*.html?*
// @version     1
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
// @run-at      document-start
// @grant       none
// @namespace   abiteasier.in
// ==/UserScript==

var url = window.location.href;
var talk_name = url.split("/").pop();
talk_name = talk_name.substring(0, talk_name.lastIndexOf('.html'));

var youtube_search_url = 'http://www.youtube.com/user/TEDtalksDirector/search?query=' + talk_name;
window.location.href = youtube_search_url;

$(document).ready( function() {
    alert("called");
    var a = $("li.channels-browse-content-list-item");
    alert(a.length());
} );

正如您可能已经推断的那样,该脚本将从 TED 谈话页面重定向到其相应的 Youtube 视频。我的搜索工作正常,搜索页面加载正常,但 .ready 函数似乎永远不会触发。这是由于上面的@run-at 造成的问题吗,Greasemonkey 是否仅将其应用于原始 TED 页面或我们从脚本访问的每个页面?还是脚本中其他地方的问题?

更新:好的,我考虑过这个,我能想到的最合理的逻辑是,一旦 URL 发生变化,GM 就会停止执行这个脚本。我将尝试在 GM 文档中验证这一点,如果您在该领域有知识,请发表答案或评论。

更新 2:我通过在 @include 中包含 YouTube 页面解决了这个问题,如果有人好奇,代码在 http://userscripts.org/scripts/show/174390

【问题讨论】:

    标签: javascript jquery firefox greasemonkey


    【解决方案1】:

    警报没有触发有两个原因:

    1. 浏览器立即从www.ted.com 重定向到www.youtube.com——早在ready 事件可以在ted.com 上触发之前。该脚本根本不会在youtube.com 上触发。

      如果您希望脚本在两个域上触发,请调整 @include(或 @match)指令,然后使用以下检查:

      if (location.hostname == "www.ted.com") {
          var url         = window.location.href;
          var talk_name   = url.split("/").pop();
          talk_name       = talk_name.substring(0, talk_name.lastIndexOf('.html'));
          var youtube_search_url = 'http://www.youtube.com/user/TEDtalksDirector/search?query=' + talk_name;
      
          window.location.href = youtube_search_url;
      }
      

      改变脚本的行为,每个域。

    2. 因为@grant none 被使用,the GM script's jQuery conflicts with code 在两个域上。您将在 Firefox 的 Error Console (CtrlShiftJ) 上看到错误消息。 解决方案是通过将@grant 更改为@grant GM_addStyle 来恢复沙箱。

    【讨论】:

    • 您好,感谢您的回复,正如更新中提到的,我在这里猜到了原因 1 并据此更改了脚本,然后它开始工作(userscripts.org/scripts/show/174390)。 2中提到的冲突似乎没有发生,可能是因为我需要最新版本的jQuery,和TED一样(不确定YouTube使用的是什么版本,如果有的话)。
    • 没有。冲突肯定会发生。您正在请求与 TED (1.7.1) 不同的 jQ (1.10.2) 版本,您的 jQ 副本被页面取代,而您的脚本没有纯属运气在任一站点上破坏任何明显(尚未)的内容。
    • 我已经上传了一个带有@grant 请求以启用沙箱的新版本,但我想知道:既然你提到的这个 jQuery 正在被他们的取代,那么脚本怎么会中断他们网站上的东西?我知道当他们的 jQuery 版本没有脚本所期望的东西时,脚本本身可能会出现问题,但是网站自己的 javascript 会如何受到影响?
    • 是的,在这种情况下,因为您使用document-start,您的脚本比页面更容易中断。但是,您仍然有竞争条件和脚本的 jQuery 加载在页面脚本之上或之后的可能性。在这种情况下,它会导致间歇性故障(如果有的话),这是最糟糕的故障排除。又是为了什么?修复不需要任何费用,当您尝试在不同情况下重用代码时,这是一个好习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多