我正在尝试编写一个简单的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。
答案 0 :(得分:2)
警报没有触发,原因有两个:
浏览器会立即从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;
}
根据域名更改脚本的行为。
因为@grant none
使用@grant
,所以两个域都有the GM script's jQuery conflicts with code。您将在Firefox的错误控制台( Ctrl Shift J )上看到错误消息。
解决方案是通过将@grant GM_addStyle
更改为{{1}}来恢复沙箱。