2017-03-24 82 views
0

我正在創建一個調用遠程數據(json)的網頁。因爲我使用jQuery.ajax這是很好的,當我打電話在同一個域中的頁面。但是,如果我把這個從另一個域(如:本地主機)的瀏覽器說未捕獲的SyntaxError:意外的令牌:jQuery ajax

No 'Access-Control-Allow-Origin' header is present on the requested resource

阻擋,但如果我使用dataType: 'JSONP'阿賈克斯則瀏覽器不會阻止,但得到這個以下錯誤雖然這是一個有效的JSON對象:

Uncaught SyntaxError: Unexpected token : 
at p (jquery.min.js:2) 
at Function.globalEval (jquery.min.js:2) 
at text script (jquery.min.js:4) 
at Nb (jquery.min.js:4) 
at A (jquery.min.js:4) 
at XMLHttpRequest.<anonymous> (jquery.min.js:4) 

這是我的Ajax代碼:

$(function() { 
    $.ajax({ 
     url: "/GarmentTech/api/get_products.php", 
     type: "GET", 
     success: function (result) { 
      $('.text').text(''); 
      console.log(result); 
      console.log(result); 
      for (var i = 0; i < result.products.length; i++) { 
       var place = ` 
        <tr> 
         <td>${result.products[i].name}</td> 
         <td>${result.products[i].description}</td> 
         <!--<td>${result.products[i].type}</td>--> 
         <td>${result.products[i].model_color}</td> 
         <td>${result.products[i].size}</td> 
         <!--<td>${result.products[i].manufacturer}</td>--> 
         <td>${result.products[i].purchase_rate}</td> 
         <td>${result.products[i].sales_rate}</td> 
         <td style="text-align:right;"> 
          ${result.products[i].stock_count} 
          ${result.products[i].unit_type} 
         </td> 
        </tr> 
       `; 
       $('.product_view').append(place); 
      } 
     }, 
     dataType: 'JSONP' // <---- 
    }); 
}); 

和JSON是這樣的:

{ 
"status": "ok", //<---- (chrome is saying problem is hare) 
"count": 26, 
"count_total": 26, 
"pages": 1, 
"products": [ 
    { 
     "size": "16X18", 
     "id": 41, 
     "name": 86416, 
     "cost_price": 1200, 
     "sales_rate": 1300, 
     "description": "", 
     "remarks": "", 
     "batch_no": "NA" 
    }, {}... 
+0

這可能是有效的JSON,但它不是有效的JSONP。 – JJJ

+0

謝謝@JJJ,我在這找到解決方案。問題解決了。剛剛添加了這行'<?php header('Access-Control-Allow-Origin:*'); ?>' – Sariful

回答

1

要使用JSONP,您需要同時使用JavaScript和服務器端回調函數。 callback =?值必須在除客戶端 客戶給出:

$.ajax({ 
     type:"GET", 
     dataType:"jsonp", 
     url:"example.php", 
     data: "callback=?", 
     success: function (result) { 
      // do something 
     } 
    }); 

服務器:

function example() 
{ 
    // do something and return as follows 
    $value = json_encode($value); 
    echo $_GET['callback'] . '(' . $value. ')'; 
} 
1

你不能只用JSONP,它必須由服務器支持。 JSONP是服務器將您的JSON數據封裝在JavaScript函數(回調函數)中的一種入侵。當jQuery收到它時,它會評估它並嘗試運行該函數。如果你打電話的服務器沒有進行包裝,它將不起作用。因此令牌錯誤。

如果您可以控制服務器,則可以實現JSONP支持或爲您的AJAX調用提供適當的跨域支持。這通常被稱爲CORS(跨源資源共享)。

通過修改訪問策略,可以使CORS設置更寬鬆。有很多關於如何使用幾乎任何Web服務器以及幾乎任何語言來完成此任務的教程。

相關問題