1

我正在尝试编写一个简单的 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上。

4

1 回答 1

2

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

  1. 浏览器会立即从 重定向www.ted.comwww.youtube.com—— 早在ready事件可以触发之前ted.com。该脚本根本没有设置为启动youtube.com

    如果您希望脚本在两个域上触发,请调整@include(or @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使用了,GM 脚本的 jQuery 与两个域上的代码冲突。您将在 Firefox 的错误控制台( CtrlShiftJ) 上看到错误消息。解决方案是通过将 更改为 来恢复沙@grant@grant GM_addStyle

于 2013-07-27T20:14:18.437 回答