如何从用户脚本中使用Freebase's建议脚本

How to use Freebase's suggestion script from a userscript?

本文关键字:脚本 Freebase 用户      更新时间:2023-09-26

我想写一个(Scriptish) userscript,其中包括在各种网站上的Freebase建议搜索小部件。我尝试了几种方法来让它工作,但到目前为止还没有运气。

我的用户脚本看起来像(注意通配符的包含):

// ==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 is not defined Source文件:http://www.freebase.com/private/suggest?callback=jQuery16101843227533633628_1325186688691&prefix=ron+paul&type_strict=any&all_types=false线:1

显然,脚本使用JSONP跨域请求,我的直觉告诉我回调jQuery16101843227533633628_1325186688691是在不同的上下文中定义的文档小部件(Scriptish上下文与unsafeWindow)。

我该怎么办?

在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);

我不知道这种方法是否明智,但它确实有效。