2013-07-27 62 views
1

我正在尝试编写一个简单的Greasemonkey脚本,但是作为Javascript的初学者和Greasemonkey的新手,我一直遇到问题。这里是我到目前为止的代码:jquery.ready没有从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如果任何人的好奇。

回答

2

警报不火的原因有两个:

  1. 浏览器从www.ted.comwww.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的错误控制台按CtrlĴ)的错误信息。 解决方案是通过将@grant更改为@grant GM_addStyle来还原沙箱。

+0

嗨,感谢您的回复,正如更新中提到的那样,我在这里猜测原因1并根据该原则改变了脚本,然后开始工作(http://userscripts.org/scripts/show/ 174390)。 2中提到的冲突似乎没有发生,也许是因为我需要最新版本的jQuery,与TED相同(不确定YouTube使用哪个版本(如果有的话))。 – sundar

+0

不会。冲突肯定会发生。您正在从TED(1.7.1)申请不同版本的jQ(1.10.2),您的jQ副本已被页面取代,并且它是纯粹的运气**,您的脚本没有破坏任何明显的(还)在任何一个网站上。 –

+0

我已经上传了一个带有@grant请求的新版本来启用沙盒,但是我想知道:因为你提到这个jQuery已经被他们所取代,那么脚本怎么会在他们的网站上破坏一些东西呢?我理解脚本本身在他们的jQuery版本没有脚本期望的东西时可能会有问题,但是网站自己的javascript会受到怎样的影响? – sundar