2010-08-03 97 views
4

當ajax提供程序預先定義了它的回調函數時,我遇到了將javascript對象上下文傳遞給JSONP ajax請求的回調處理程序的問題。 (Flickr是服務提供商)。如何將對象上下文傳遞給jQuery.ajax JSONP回調?

我給一個簡化的例子:

 
function Person(anId) { 
this.name; 
this.id = anId; 
var self = this; 
this.loadName = function() { 
    $.ajax({ 
    url: "jsonp.json", 
    dataType: "jsonp", 
    jsonpCallback : "handleJSON", 
    data : {id: this.id}, 
    context: self, 
    success: function (data) { 
    self.name = data.name; 
    } 
    }); 
} 
} 

var handleJSON = function(data) { 
console.log("received " + data.name); 
} 

var a = new Person(234); 
a.loadName(); 
var b = new Person(345); 
b.loadName(); 



上面的例子完美地工作,控制檯輸出handleJSON函數的線。但是在這個函數中,我沒有對調用它的原始對象的引用。我希望成功函數被調用來代替:這裏我可以參考自我變量。

有幾種可能的解決方案,但我沒有得到任何運行。

  1. 我將攔截jQuery爲我生成的回​​調名稱,並將其作爲jsonpCallback參數中的值。我認爲這個功能委託給指定的成功功能,我可以從中訪問這個功能。但我看不出如何獲得生成的名稱。
  2. 我將指定上下文對象,就像我在示例中所做的那樣。 jQuery文檔指出這個對象可用於回調處理程序。但是我無法找到這種情況如何暴露於handleJSON函數來自我的例子。

目前我從google代碼中找到了jquery-jsonp的解決方案。但是我仍然很好奇如何解決這個問題,因爲我認爲jQuery引用聲明它可以像那樣處理。什麼讓我可以依靠較少的第三方庫。

有人可以告訴我如何使用jQuery訪問JSONP回調處理程序中的上下文嗎?

回答

11

只留下jsonpCallback屬性,讓jQuery創建被調用的函數,它的函數名稱。該函數將使用您指定的上下文來調用您指定的成功回調。

function Person(anId) { 
this.name; 
this.id = anId; 
this.loadName = function() { 
    $.ajax({ 
    url: "jsonp.json", 
    dataType: "jsonp", 
    data : {id: this.id}, 
    context: this, 
    success: function (data) { 
    this.name = data.name; 
    } 
    }); 
} 
} 

var a = new Person(234); 
a.loadName(); 
var b = new Person(345); 
b.loadName(); 
+0

感謝您的快速回復。你的答案似乎微不足道,但我的服務提供商allways在自己的回調中包裝了JSON:jsonFlickrApi({json})和生成的回調jQuery名稱被忽略。如果您提供參數'jsoncallback = handleJSON',則可以影響回調名稱,但這不是選項,因爲那樣我只能傳遞全局作用域函數名稱,並且需要傳遞對象作用域函數名稱。 – TheHobbyist 2010-08-03 21:22:28

+1

@TheHobbieist:在這種情況下,您可以使用'jsonpCallback'屬性來指定''jsonFlickrApi''作爲函數名稱,但不要創建該函數。 'ajax'方法將爲您創建函數。 – Guffa 2010-08-03 22:20:52

+0

你是男人。非常感謝。 – TheHobbyist 2010-08-04 09:44:50