我想写一个(Scriptish)用户脚本,其中包括在各种网站上的Freebase建议搜索小部件。我已经尝试过几种方法来使这个工作,但到目前为止没有运气。
我的userscript看起来很像(请注意通配符的包含):
// ==UserScript==
// @id meta@parsed.nl
// @name Meta
// @version 1.0
// @namespace
// @author
// @description
// @include *
// @run-at document-end
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js
// @require http://freebaselibs.com/static/suggest/1.3/suggest.min.js
// @noframes
// ==/UserScript==
$("head").append('<link type="text/css" rel="stylesheet" href="http://freebaselibs.com/static/suggest/1.3/suggest.min.css" />');
$("body").prepend('<input id="freebase-suggest" type="text"/>');
$("#freebase-suggest")
.suggest()
.bind("fb-select", function(e, data) {
alert("");
});所有内容都很好地加载,但是当我尝试使用搜索框时,它无法工作,下面的错误将显示在错误控制台中:
错误: jQuery16101843227533633628_1325186688691未定义源文件:types=false行:1
显然,脚本使用JSONP来处理跨域请求,我的直觉告诉我回调jQuery16101843227533633628_1325186688691是在与小部件所在的文档不同的上下文中定义的( script上下文与unsafeWindow)。
我该怎么办?
发布于 2011-12-29 20:11:43
在DOM中添加jQuery和Freebase建议脚本,等待它们加载就足够了。但你必须参考unsafeWindow。
var head = document.getElementsByTagName('head')[0];
// Only add jQuery if the site doesn't have it already (to prevent conflicts)
if (typeof unsafeWindow.jQuery === "undefined") {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js';
head.appendChild(script);
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://freebaselibs.com/static/suggest/1.3/suggest.min.js';
head.appendChild(script);
window.setTimeout(function() {
$ = unsafeWindow.jQuery;
$("head").append('<link type="text/css" rel="stylesheet" href="http://freebaselibs.com/static/suggest/1.3/suggest.min.css" />');
$("body").prepend('<input id="freebase-suggest" type="text"/>');
$("#freebase-suggest")
.suggest()
.bind("fb-select", function(e, data) {
alert("");
});
}, 1000);我不知道这种方法是否明智,但确实有效。
https://stackoverflow.com/questions/8672573
复制相似问题