#jquery #getjson
#jquery #getjson
Вопрос:
Я искал соответствующую тему в jQuery, но я не видел никакого метода для решения моей проблемы.
$(document).ready(function(){
$("#inputForm").submit(function(event){
$(":text").each(function() {
var inputText = $(this).val();
var userList = [];
var weblink = 'http://test.com';
// problem is from here.
$.getJSON(weblink, function(data){
alert(weblink); // this statement doesn't show up
$.each(data, function(entryIndex, entry){
userList.push(entry['from_user']);
});
});
alert(userList);
});
});
});
Здесь есть 3 проблемы:
- Почему не отображается первое предупреждение (‘weblink’)?
- Почему этот код не может получить данные json с веб-сайта?
- Цель этого кода — получить тег from_user из файла json и сохранить в массиве UserList.
Переменные в операторе «$.each(data, function(entryIndex, entry){«, функция имеют два входных параметра, один из которых — entryIndex, а другой — entry. Мне интересно, для чего предназначены эти параметры и как их использовать?.
Кто-нибудь может помочь мне решить эту проблему. Я был здесь в течение одного дня. Большое вам спасибо.
Комментарии:
1. вы проверили, что возвращаемый вами файл является допустимым json?
Ответ №1:
Есть пара проблем:
-
getJSON
выполняет запрос ajax. Запросы Ajax подчиняются той же политике происхождения. Если ваша страница не загружена сhttp://test.com
(или из-за пары других предостережений), это не сработает. Вы, вероятно, ищете JSON-P (который также поддерживает jQuery), при условии, что сервер его поддерживает. -
getJSON
, как и все запросы ajax, по умолчанию является асинхронным, поэтому ваше второе предупреждение (со списком пользователей) произойдет до завершения запроса. Хотя вы можете сделать запросы ajax синхронными, это очень плохая идея (блокирует пользовательский интерфейс большинства браузеров во время запроса). Вместо этого просто используйте список пользователей после того, как вы получили его при обратном вызове, вместо того, чтобы пытаться использовать его при вызове функцииgetJSON
.
Редактировать: ниже вы сказали, что пытаетесь использовать поисковый API Twitter. Этот API действительно поддерживает JSON-P, поэтому, если вы используете JSON-P для выполнения своего запроса, он должен сработать. например:
$(document).ready(function(){
$("#inputForm").submit(function(event){
$(":text").each(function() {
var inputText = $(this).val();
var userList = [];
var weblink = 'http://search.twitter.com/search.json?q=amp;ands=google';
// problem is from here.
$.ajax({
url: weblink,
dataType: "jsonp", // <== JSON-P request
success: function(data){
alert(weblink); // this statement doesn't show up
$.each(data.result, function(entryIndex, entry){ // <=== Note, `data.results`, not just `data`
userList.push(entry['from_user']); // <=== Or `entry.from_user` would also work (although `entry['from_user']` is just fine)
});
alert(userList); // <== Note I've moved this (see #2 above)
}
});
});
});
});
…но вы, конечно, не хотите делать это для каждого текстового поля в форме?
Вот живой пример, но без формы (и выполняющий только один запрос, а не запрос для каждого поля).
Комментарии:
1. На самом деле, веб-сайт является поисковым API Twitter .
2. @Jimmy: Если только ваша страница не загружается с search.twitter.com тогда вы не можете запросить эти данные через ajax (из-за SOP). Смотрите ссылку для получения дополнительной информации. Но я уверен, что Twitter предлагает интерфейс JSON-P, который вы могли бы использовать. Фактически, быстрый поиск по «twitter json-p interface» предполагает, что это так. 🙂
3. @Jimmy: Фактически, эта конкретная страница API поддерживает JSON-P, поэтому вам просто нужно изменить свой вызов (и разобраться со второй проблемой). Обновлено примером.
4. «блокирует пользовательский интерфейс большинства браузеров во время запроса» не соответствует действительности годами. Синхронность в порядке.
5. @Tomalak: Сейчас дела обстоят немного лучше, но лишь немного (и только для полностью обновленных пользователей IE, а мы знаем, что есть МНОГО пользователей IE, которые таковыми не являются, обычно крупных правительственных и корпоративных). Но даже в современных браузерах это полностью блокирует страницу. Вы не можете выделить текст. Вы не можете прокручивать. Вы не можете ничего сделать на этой вкладке. Синхронные запросы — это не только плохая идея, они также совершенно не нужны.
Ответ №2:
Просто добавьте в ссылку
amp;callback=?
или
?callback=?
(если это первая и единственная получаемая переменная)
Это превратит ваш вызов в вызов JSONP, у которого нет проблем с политикой того же источника.
Комментарии:
1. IE устанавливает catch на ajax. добавьте это перед getJSON. $.ajaxSetup({ cache: false });
Ответ №3:
Не уверен, но разве для этого не требуются аргументы get? Попробуйте это:
$.getJSON(weblink, {}, function(data){
Ответ №4:
Используете ли вы платформу MVC? По-видимому, по умолчанию блоки MVC 2.0 ПОЛУЧАЮТ запросы к действиям, которые возвращают JsonResult. Проверьте:
http://mhinze.com/2010/04/13/json-hijacking-in-asp-net-mvc-2/
У меня была такая же проблема при обновлении существующего приложения (написанного на MVC v1), которое использовало вызовы .getJSON для извлечения данных из контроллера MVC для просмотра (через jquery / javascript) и не смог понять, почему они не работают Я пробовал разные версии jquery, но безуспешно, затем я нашел приведенную выше ссылку. Вместо этого я перешел на POST (а также немного изменил способ отправки данных из используемого контроллером словаря) и заставил его работать — наконец-то!!
Удачи! JayD
Ответ №5:
Я хотел бы добавить еще одну причину, по которой jQuery.getJSON() может реагировать не так, как ожидалось в среде разработки под управлением IIS для Windows.
Следуя всем приведенным здесь процедурам, я не смог получить никаких данных из файла *.json, только если я изменил расширение на *.js, статус ответа вернулся
{"status"="404", "statusText"="Not Found"}
Затем я вспомнил, что в IIS есть некоторые MIME / типы, которые не указаны. Добавление MIME / Типа application / json для файлов с расширением .json решило мою проблему.
Для получения информации о том, как добавить MIME / типы в iis7.