Задать вопрос
JackShcherbakov
@JackShcherbakov

Почему alert появляется на несколько секунд в Яндексе, а в остальных браузерах нет?

Здравствуйте! Тега JSONP не было, поэтому поставил просто JSON.

Проблема такая:

Есть скрипт, который отправляет запрос моему серверу на php по протоколу JSONP:
var CallbackRegistry = {};

function scriptRequest(url, onSuccess, onError) {

  var scriptOk = false; 
  var callbackName = 'cb' + String(Math.random()).slice(-6);

  url += ~url.indexOf('?') ? '&' : '?';
  url += 'callback=CallbackRegistry.' + callbackName;

  CallbackRegistry[callbackName] = function(data) {
    scriptOk = true; 
    delete CallbackRegistry[callbackName]; 
    onSuccess(data); 
  };

  function checkCallback() {
    if (scriptOk) return; 
    delete CallbackRegistry[callbackName];
    onError(url); 
  }

  var script = document.createElement('script');

  script.onreadystatechange = function() {
    if (this.readyState == 'complete' || this.readyState == 'loaded') {
      this.onreadystatechange = null;
      setTimeout(checkCallback, 0); 
    }
  }

  script.onload = script.onerror = checkCallback;
  script.src = url;

  document.body.appendChild(script);
}
function ok(data) {
  alert( "Загружен время " + data.time );
}

function fail(url) {
  alert( 'Ошибка при запросе ' + url );
}

scriptRequest("http://comet/php.php", ok, fail);

Вот сам сценарий php:
<?php
$d = new DateTime();
$response = json_encode(array(
	time => $d->format("r")
));
print $_GET["callback"] . "(" . $response . ");";
?>

Если открыть js сценарий в яндексе, то alert появится на мнговение и сразу же исчезнет. Хотя в хроме все окей.

Мои предположения:
1. XMLHttpRequest блокирует основной поток (если он синхронен, не знаю как он работает при загрузки скриптов), то же самое делает и alert. Возможно возникает конфликт из-за того, что сначала alert замораживает основной поток, потом замораживает поток и xmlHttpRequest.

Как исправить? Что вызвало проблему?

Заранее спасибо всем за ответы!
  • Вопрос задан
  • 177 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы