2012-09-19 55 views
3

我試圖發送一個JSONP Ajax請求(從client.htm到proxy.htm)JSONP Ajax回調,這是由它創建了另一個不同的阿賈克斯JSONP請求到服務(代理代理網頁接收。 htm ---> service.php)。目前,代理頁面接收來自服務的JSON格式對象,但我堅持要將對象返回到第一個初始Ajax請求。以下是我試圖運行的示例代碼。這是可能的Javascript?如果是這樣,我怎麼可能將它返回到clientCallback功能。從JavaScript調用

Client.htm

// CLIENT ---> PROXY 
$(document).ready(function() { 
    $.ajax({ 
      type: 'GET', 
      url: 'http://localhost/jsonp_proxy/listener.htm', 
      dataType: 'jsonp', 
      jsonpCallback: "clientCallback", 
      success: function (theData) { 
       alert("Success"); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert("Error"); 
      } 
     }); 
     }); 
     window.clientCallback = function(results) { 
     alert(results.uid); 
     } 

Proxy.htm

 // PROXY ---> SERVER 
     $(document).ready(function() { 
     $.ajax({ 
      type: 'GET', 
      url: 'http://localhost/jsonp_server/service.php', 
      dataType: 'jsonp', 
      jsonpCallback: "proxyCallback",  
      success: function (theData) { 
//   alert("Success"); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
//   alert("Error"); 
      } 
     }); 
     }); 
     window.proxyCallback = function(resultData) { 
     // HOW TO CALL CLIENT CALLBACK FUNCTION 
     } 

Service.php

<?php 
echo "proxyCallback("."{'uid': 123, 'username': 'jdirt', 'name': 'Joe Dirt'}".");"; 
?> 

回答

0

爲數不多的半有效使用S代表eval

success: function (theData) { 
    eval("(" + theData + ")"); 
    //alert("Success"); 

正如一個提醒,JSONP是一個黑客和安全風險的東西。你對第三方給予了很多信任和控制。

+0

感謝您的回覆,但是這並不能使其回到client.htm頁面。 Ajax進入錯誤功能。 – Manny

+0

切勿使用eval()。使用JSON.parse()。 – saml

+0

@saml - 通常我會同意,但'JSONP'與'JSON'略有不同。 'JSONP'是*可執行代碼*,必須是'eval'ed,因爲它包含一個內部回調處理程序。 –

0

只需從window.proxyCallback打電話window.clientCallback。

+0

我以前嘗試過,但它不起作用。 – Manny

+0

「不起作用」是一種描述失敗的非常模糊的方式。發生了什麼?發生了什麼事情沒有按照你預期的方式工作?你真的嘗試了什麼? – saml

+0

好吧,所以我嘗試從* window.proxyCallback *調用* window.clientCallback *,但是當我瀏覽client.htm時,請求會進入請求的錯誤函數。我試圖調用這些函數而不使它們成爲全局的,並且我得到了相同的結果。從PHP頁面調用proxyCallback工作正常,但我似乎無法找到一種方法來使用Javascript – Manny