#php #jquery #ajax
#php #jquery #ajax
Вопрос:
У меня чертовски много времени, чтобы заставить ajax-вызовы и ответы корректно работать в IE8 (да, к сожалению, это версия, на которой застряла моя рабочая группа), Firefox и Chrome.
У меня есть запросы ajax, идущие к одному PHP-скрипту на серверной части. Поскольку в прошлом я сталкивался со странными проблемами, когда IE внезапно жаловался / вел себя так, как будто некоторые из наших внутренних / интрасетевых серверов на самом деле являются «междоменными», я удостоверяюсь, что PHP-скрипт переносит объект данных в функцию обратного вызова:
echo $callback_name.'('.$jsondata.');';
(Однако все запросы ajax от внешнего интерфейса передают одно и то же имя обратного вызова, просто чтобы упростить задачу: jsonpCallback.)
Все мои интерфейсные запросы соответствуют этому же формату:
$.ajax({
type: 'GET',
url: 'ajax_fetcher.php',
data: { action: 'fetchexecmsg', incident_id: incident_id_number},
dataType: 'jsonp', // doing this because it should avoid cross-domain issues
jsonp:'callback_name',
jsonpCallback: 'jsonpCallback',
success: function(data){
console.log("Ajax call to fetchexecmsg was successful.");
Parse_JSON_object_into_Exec_Msg_Div(data);
}
});
Я делал большую часть сборки / тестирования с помощью Chrome. Итак, сегодня я решил протестировать Firefox и IE8.
К моему удивлению, Firefox жаловался, что ‘jsonpCallback’ не является реальной функцией??
TypeError: jsonpCallback is not a function (red text in the console)
Я понимаю, что если бы у меня была уже предопределенная функция «success», не было бы необходимости в том, чтобы эта функция действительно существовала?
Итак, я ввел это глобально как пустую функцию… и теперь Firefox жалуется:
Error: jsonpCallback was not called
и за этим немедленно следует ошибка синтаксического анализа ajax, где jqXHR.responseText = undefined .
И теперь я вижу, что Chrome также регистрирует этот parseerror -> undefined .
Кто-нибудь может дать какие-либо рекомендации по этому поводу? Я думаю, что сейчас мое внимание должно быть сосредоточено на этой вещи ‘jsonpCallback’. Я подумал, что мне нужно, чтобы это возвращалось из серверной части, чтобы «обмануть» браузер, думая, что он получает Javascript, а не данные с какого-то удаленного сервера.
И затем, на стороне интерфейса, мне нужно было установить эти переменные jsonp и jsonpCallback в ajax-запросе. Но я ДУМАЛ, что фактическая функция обратного вызова, определенная с помощью этой переменной jsonpCallback, НЕ нужна?
Спасибо!
-= Дейв =-
Комментарии:
1. У меня есть связанный с этим вопрос … который может быть частью основной причины здесь … это… что серверная часть PHP должна отправлять обратно, когда данных практически нет? Прямо сейчас я отправил обратно «jsonpCallback ();»
2. Ну, как бы то ни было, я заставил все три браузера прекратить выдачу ошибок для ОДНОГО из моих запросов ajax. (Надеюсь, я смогу настроить другие запросы и исправить их.): Я удалил функцию jsonpCallback, которую я фактически выписал в ответ на ошибку одного из браузеров. Затем я настроил свой скрипт на серверной части так, чтобы при отсутствии данных вместо отправки обратно «jsonpCallback();» он отправлял бы json_encoded массив $ msg_object= array(‘status’ => false);
3. Есть ли причина, по которой вы принудительно определили значение jsonpCallback? jQuery обычно настраивает его сам, чтобы избежать конфликтов в собственном коде. Как можно прочитать из api.jquery.com/ajax : Предпочтительно, чтобы jQuery генерировал уникальное имя, поскольку это упростит управление запросами и обеспечит обратные вызовы и обработку ошибок
4. Аааа…. Кажется, я понимаю, о чем вы говорите. ‘jsonp’ = ‘имя’ переменной (для функции обратного вызова jsonp), которую мы хотим передать в GET или POST в серверный скрипт. Я присвоил значение ‘jsonpCallback’, думая, что мне нужно вручную назначить это, чтобы оно было передано на серверную часть. И вы говорите, что это не так, верно? Это имело бы смысл, потому что я только что увидел кое-что необычное: я вставил строку кода для выгрузки объекта в один из моих вызовов ajax. И все же, когда я выполнял функцию, я иногда видел, как печатается объект из какого-то ДРУГОГО запроса ajax!
5. Эрик, ты должен опубликовать свой ответ в качестве ответа, чтобы я мог отдать тебе должное. По-видимому, я не могу отдать вам должное за «комментарий». Но удаление моего ручного назначения ключа ‘jsonpCallback’ устранило мои проблемы. (Неудивительно, что я был смущен тем фактом, что мои вещи работали 25% времени!)
Ответ №1:
Дэйв, убери ключ «jsonpCallback» из параметров, которые ты установил для jQuery.Ajax.
Как видно из http://api.jquery.com/ajax ,
Предпочтительно, чтобы jQuery генерировал уникальное имя, поскольку это упростит управление запросами и обеспечит обратные вызовы и обработку ошибок.