2011-12-29 63 views
1

我想寫一個(Scriptish)腳本,在其他東西the Freebase suggestion search widget包括各種網站。我已經嘗試了幾種方法來實現這個目標,但目前還沒有運氣。如何從腳本中使用Freebase的建議腳本?

我userscript樣子(帶通配符包含的注):

// ==UserScript== 
// @id    [email protected] 
// @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(""); 
    }); 

一切加載罰款,但是當我嘗試使用搜索框它不工作,並顯示錯誤以下錯誤控制檯:

Error: jQuery16101843227533633628_1325186688691 is not defined Source File: http://www.freebase.com/private/suggest?callback=jQuery16101843227533633628_1325186688691&prefix=ron+paul&type_strict=any&all_types=false Line: 1

顯然,腳本使用JSONP跨域請求,我的直覺告訴我jQuery16101843227533633628_1325186688691在不同的上下文中被定義從文檔中的小部件可(在Scriptish背景與不安全的回調窗口)。

我該怎麼辦?

回答

0

添加jQuery和Freebase建議在DOM中的腳本並等待它們加載足以使這項工作。但是你必須參考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); 

我不知道這種方法是否聰明,但它確實有效。