jQuery.ready未从Greasemonkey脚本中调用

jQuery .ready not getting called from within Greasemonkey script

本文关键字:调用 脚本 Greasemonkey ready 未从 jQuery      更新时间:2023-09-26

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

// ==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引起的问题吗?Greasemonkey只将其应用于原始TED页面还是应用于我们从脚本访问的每个页面?或者问题在剧本的其他地方?

更新:好吧,我考虑过了,我能想到的最合理的逻辑是,一旦URL更改,GM就会停止执行这个脚本。我会尝试在通用汽车文档中验证这一点,如果你在这方面有知识,请发表回答或评论。

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

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

  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,所以GM脚本的jQuery与两个域上的代码冲突。您将在Firefox的错误控制台上看到错误消息(CtrlShift<kbd&J>