1

さまざまな Web サイトの 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 は定義されていませんソース ファイル: http://www.freebase.com/private/suggest?callback=jQuery16101843227533633628_1325186688691&prefix=ron+paul&type_strict=any&all_types=false 行: 1

どうやら、スクリプトはクロス ドメイン リクエストに JSONP を使用しているようjQuery16101843227533633628_1325186688691で、直感的には、ウィジェットが含まれるドキュメントとは異なるコンテキストでコールバックが定義されていることがわかります (Scriptish コンテキストと unsafeWindow の関係)。

私は何をすべきか?

4

1 に答える 1

0

jQueryとFreebaseSuggestスクリプトの両方を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);

このアプローチが賢いかどうかはわかりませんが、機能します。

于 2011-12-29T20:11:43.493 に答える