Используйте JSONP для загрузки html-страницы - PullRequest
23 голосов
/ 23 сентября 2011

Я пытаюсь загрузить внешнюю страницу, используя JSONP, но страница является страницей HTML, я просто хочу получить ее содержимое с помощью ajax.

РЕДАКТИРОВАТЬ: причина, по которой я это делаю, заключается в том, что я хочу передать всю пользовательскую информацию ex: headers, ip, agent при загрузке страницы, а не с моих серверов.

Это выполнимо? Прямо сейчас я могу получить страницу, но jsonp пытается проанализировать json, возвращая ошибку: Uncaught SyntaxError: Unexpected token <

Пример кода:

$.post('http://example.com',function(data){
    $('.results').html(data);
},'jsonp');

Я установил jsfiddle для людей, с которыми можно тестировать: http://jsfiddle.net/8A63A/1/

Ответы [ 6 ]

15 голосов
/ 23 сентября 2011

http://en.wikipedia.org/wiki/JSONP#Script_element_injection

Для выполнения вызова JSONP (другими словами, для использования этого шаблона использования) требуется элемент script.Поэтому для каждого нового запроса JSONP браузер должен добавить (или повторно использовать) новый элемент - другими словами, вставить этот элемент - в HTML DOM с требуемым значением для атрибута "src".Затем этот элемент оценивается, URL-адрес src извлекается и оценивается JSON-ответ.

Теперь рассмотрим вашу ошибку:

Uncaught SyntaxError: Неожиданный токен <</p>

< - это первый символ любого тега html, вероятно, это начало <DOCTYPE, в данном случае, конечно , недопустимый JavaScript.

И НЕТ , вы не можете использовать JSONP для получения HTML-данных.

12 голосов
/ 29 апреля 2012

Я сделал то, что вы хотите, но в моем случае у меня есть контроль над кодом на стороне сервера, который возвращает HTML.Итак, то, что я сделал, заключил HTML-код в одно из свойств Json возвращаемого объекта и использовал его на стороне клиента, например:

callback({"page": "<html>...</html>"})

Синтаксическая ошибка, с которой вы столкнулись, потому что библиотекавы используете JSON, но ответ HTML, только это.

2 голосов
/ 30 июня 2012

Если вы действительно хотите использовать клиент для захвата HTML-файла, я предлагаю использовать flyJSONP - который использует YQL .. или использовать jankyPOST, который использует некоторые приятные приемы:

jankyPOST создает скрытый iframe и прочееэто с формой (iframe [0] .contentWindow.document.body.form.name).

Затем он использует HTML5 (смотреть устаревшие браузеры!) webMessaging API для публикации в другом iframe и устанавливает элементы формы iframe.'vals к тому, что вы указали.

Отправляет форму на удаленный сервер ... готово.

Или вы можете просто использовать PHP curl, разобрать его, повторить его и т. д.

IDK, если для чего именно вы используете его, но я надеюсь, что это поможет.

ТАКЖЕ ... Я почти уверен, что вы можете JSONP делать все, что является выходом из кода сервера.Я сделал это с ClientLogin, просто JSONPing их страницы keyGen и успешно consoleLogged текст, хотя это были ч / б теги.У меня были некоторые другие ошибки по этому поводу, но дело в том, что я удалил этот вывод.

В настоящее время я пытаюсь сделать то, что вы делаете, поэтому я отправлю ответ в случае успеха.

2 голосов
/ 23 сентября 2011

У меня есть три слова для вас: Одинаковая политика происхождения

Если удаленный URL-адрес на самом деле не поддерживает правильные запросы JSONP, вы не сможете делать то, что пытаетеськ.И это хорошо.

Редактировать: Конечно, вы можете попытаться прокси-запрос через ваш сервер ...

0 голосов
/ 23 сентября 2011

Я не думаю, что это возможно. JSONP требует, чтобы ответ отображался правильно.

Если вам нужно другое решение, как насчет загрузки URL-адреса в iframe и попытки общения через iframe. Я не уверен на 100%, что это сработает, но оно того стоит.

0 голосов
/ 23 сентября 2011

Во-первых, вызовите URL-адрес AJAX вручную и посмотрите на полученный HTML-код.

Во-вторых, вам нужно закрыть DIV в примере с скрипкой.

...