2016-11-27 32 views
0

所以我有一個腳本在我試圖從中獲取數據的外部服務器上。我的JSONP代碼嘗試有什麼問題?

這是一個PHP腳本調用test.php的,它具有以下內:

<?php 
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
    $parts = parse_url($url); 
    parse_str($parts['query'], $query); 
    $limit = $query['limit']; 
    $return_array["result"] = $limit; 
    echo json_encode($return_array); 
?> 

於是我就用發送呼叫到該服務器執行以下操作:

/* this is included in head */ 
<script src="http://some-website.com/get-text/index.php?limit=10&q=returnText"></script> 

/* in Body */ 
<script> 
    function returnText(data) { 
    console.log('result: ' + data); 
    } 
</script> 

當你去那個php頁面本身的輸出是

{"result":"10"} 

但是當我運行帶JavaScript代碼的文件時我g等了一個錯誤:?

的index.php限值爲10 & Q = returnText:1未捕獲的SyntaxError:意外的標記:

當你點擊鏈接就這一錯誤行我看到的權利:

{"result":"10"} 

用紅色下劃線從冒號開始並向右。

我看到某處確保JSONP已啓用,它看起來不像是實際的服務器配置或其他東西。

我在做什麼錯?

回答

1

有兩個問題:

  1. JSONP,中,必須用一個函數調用JSON;這就是JSONP的工作原理。

    鑑於你的網址,你的PHP代碼的反應應該是

    returnText({"result":"10"}) 
    

    獲取從查詢參數q參數和使用,在響應作爲函數名。 (該參數的名稱通常是callback,雖然你可以把它叫做別的東西,如果你喜歡。)

  2. 你說,script元素調用PHP文件在head,但script元素定義returnText回調在正文中。這不適用於你已經顯示的script元素,因爲head中的那個元素將停止頁面的所有分析,使瀏覽器等待直到它被檢索,然後只有當它被檢索並運行時它才允許解析繼續。這意味着returnText函數將不存在。在包含回調函數script之後,將查詢JSONP的script更改爲會更有意義。 (你可以考慮它async or defer

+0

當你說「包裹JSON在函數調用」你是說只是回聲encode_json($陣列),而不是我會做一些事情,如回聲「使用functionName( 」 .encode_json($陣列);.).;抱歉不是一個好主意,嘗試在評論部分發布格式化的代碼。 –

+0

哦,那個笨拙的腳本/函數的順序,謝謝我會嘗試你的建議。 –

+0

aaaahhhhhhhhhhhhhh我使它工作!謝謝你,先生。至少我覺得我做到了。我甚至不必把「回調」放在參數中。我只是回顯了與json_encode行連接的函數名稱。這比我得到的感謝你更遠。 –