【问题标题】:How to use Freebase's suggestion script from a userscript?如何从用户脚本中使用 Freebase 的建议脚本?
【发布时间】:2011-12-30 05:24:33
【问题描述】:

我想编写一个(Scriptish)用户脚本,其中包括the Freebase suggestion search widget 各种网站。我已经尝试了几种方法来让它工作,但到目前为止没有运气。

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

// ==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)。

我该怎么办?

【问题讨论】:

    标签: javascript firefox greasemonkey freebase scriptish


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2010-12-26
      • 2014-08-03
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多