在jQuery.ajax中为OpenCalais SemanticProxy服务指定回调

时间:2010-08-06 10:34:36

标签: javascript jquery ajax jsonp

我正在尝试查询OpenCalais服务semanticproxy.com。不幸的是,他们的网址格式如下:

http://service.semanticproxy.com/processurl/APIKEY/jsonp:handler_function/http://en.wikipedia.org/wiki/Germany

注意函数回调,是不是在回调=?参数,而是遵循响应格式(jsonp :)。这意味着我不能使用.getJSON,而是需要使用.ajax方法。所以我有以下对象定义:

function Subject() {
}

Subject.prototype.populate = function(page_title) {
  var url = "http://service.semanticproxy.com/processurl/APIKEY/jsonp:handler/http://en.wikipedia.org/wiki/" + page_title;
  $.ajax({url: url, dataType: "script", type: "GET", cache: false, callback: null, data: null});
};

var handler = function (data) {
  // do stuff with the returned JSON
};

s = new Subject();
s.populate("Germany");

这很好用。但我真正想要做的是设置我的Subject对象的属性。但我不知道如何在Subject的上下文中创建一个能够用作回调的函数。即:

Subject.prototype.handler = function(data) { this.title = data.title } 

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您必须在window对象上设置一个函数。这基本上(我认为)jQuery使用.getJSON方法做了什么。以下是有点hacky但希望它指出你正确的方向:

function Subject() {
}

Subject.prototype.populate = function(page_title) {
    // Save context object
    var subject = this;
    // Create function name like subjectHandler1281092055198
    var functionName = "subjectHandler" + new Date().getTime();
    window[functionName] = function(data) {
        // Invoke function with saved context and parameter
        subject.handler.call(subject, data);
    }
    var url = "http://service.semanticproxy.com/processurl/APIKEY/jsonp:" + functionName + "/http://en.wikipedia.org/wiki/" + page_title;
    $.ajax({url: url, dataType: "script", type: "GET", cache: false, callback: null, data: null});
};

Subject.prototype.handler = function (data) {
  // do stuff with the returned JSON
};

s = new Subject();
s.populate("Germany");

答案 1 :(得分:0)

我认为你不能做到这一点,只是因为JSONP如何工作,看看它实际上是如何回到浏览器的,它几乎就是这样:

<script type="text/javascript">
  handler({ title: "Germany", ...other properties... });
</script>

此处无法维护引用,您可以一次执行一个请求,或者为每个主题保留一个对象映射,但是在JSONP请求中无法执行此操作。

对象图看起来像这样:

//delcare this once for the page
var subjects = {};

//do this per subject
var s = new Subject();
s.populate("Germany");
subjects["Germany"] = s;

然后在你的hanldler中,如果任何data属性为"Germany",你可以这样做,例如:

var handler = function (data) {
  var subject = subjects[data.title];
  //subject is  your Germany subject, use it, go nuts!
};