2015-08-31 5 views
8

Привет Я пытаюсь использовать ТОЛЬКО JavaScript и HTML, чтобы прочитать объект json с URL-адреса. Я использую следующий код:Перекрестный домен JSON

function getJSONP(url, success) { 

    var ud = '_' + +new Date, 
     script = document.createElement('script'), 
     head = document.getElementsByTagName('head')[0] 
      || document.documentElement; 

    window[ud] = function(data) { 
     head.removeChild(script); 
     success && success(data); 
    }; 

    script.src = url.replace('callback=?', 'callback=' + ud); 
    head.appendChild(script); 
} 

getJSONP('http://webURl?&callback=?', function(data){ 
    console.log(data); 
}); 

Как вы уже догадались, я получаю Not at same origin as the document, and parent of track element does not have a 'crossorigin' attribute. Origin 'null' is therefore not allowed access.

FYI сервер возвращает данные в формате JSON и оленья кожа имеют функцию обратного вызова.

Забота о вашей помощи.

+1

Если сервер не поддерживает JSONP и не поддерживает CORS, вам не повезло. JavaScript не может работать вокруг одной и той же политики происхождения. Это по какой-то причине. – epascarello

+0

@epascarello, так что вы думаете Если сервер поддерживает JSONP, тогда этот код будет работать нормально. – usrNotFound

+0

Он должен работать для JSONP – epascarello

ответ

7

Сервер либо должен быть включен CORS используя заголовки, как это: (Credits в ответ здесь: CORS with php headers)

// Allow from any origin 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Max-Age: 86400'); // cache for 1 day 
} 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    exit(0); 
} 

Или сервер должен выводить JSONP как:

echo $_GET['callback'] . '(' . json_encode($whatever) . ')'; 

Другой вариант, если это не на вашем собственном сервере, - это создать файл PHP на своем собственном сервере, который делает filegetcontents на URL-адресе, который вам нужно прочитать (с данными JSON без кода), и повторить те же данные в формате JSONP. Затем вы можете использовать этот новый файл PHP (url) в своей чистой функции javascript getJSON.

Без сервера в середине или в корне или jsonp это невозможно.

+0

Не укради другие ответы! http://stackoverflow.com/questions/8719276/cors-with-php-headers – GuyT

+0

Приносим извинения, я должен был добавить ссылку. Отредактировал мой ответ, чтобы включить ссылку. Спасибо, что заметили. –

4

Если вы хотите получить оперативное исправление &, вы можете получить контент через iframe или использовать прокси-сервер, например YQL.

Но я бы рекомендовал использовать бэкэнд-стратегию для извлечения вашего контента, а затем обработать его с помощью javascript.

Смежные вопросы