Нужна помощь, чтобы заставить Ajax работать: jsonpCallback и php на серверной части

#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 генерировал уникальное имя, поскольку это упростит управление запросами и обеспечит обратные вызовы и обработку ошибок.