javascript ведет себя странно в Chrome - PullRequest
1 голос
/ 30 декабря 2010
var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
alert(check);

в Firefox он просто выскакивает true, в то время как в chrome он выскакивает дважды false и true соответственно.???

большое спасибо

Ответы [ 6 ]

1 голос
/ 30 декабря 2010

Обратный вызов onreadystatechange может быть вызван один раз или может быть вызван миллион раз (на самом деле, миллион ).Ваш «тревожный» звонок происходит независимо от значения «чека».

0 голосов
/ 31 декабря 2010

Хорошо, я объясню это немного подробнее.

После того, как вы выполните запрос readyState проходит 5 этапов:

  • 0) Неинициализированный
  • 1) Соединение открыто
  • 2) Запрос отправлен
  • 3) Получение ответа
  • 4) Передача данных завершена

После завершения передачи данныхсвойство status изменяется в соответствии с кодом ответа сервера.Обычно для успешной передачи используется код 200. Если происходит внутренняя ошибка сервера, этот код изменится, но вы все равно будете получать данные или, по крайней мере, то, что может быть отправлено.

Итак, чтобы предотвратить ваше предупреждение от выстрела несколько раз вам нужно проверить состояние, а затем код ответа:

if (httpReq.readyState == 4) {  // data is received, now we play with it
    if (httpReq.status == 200) {
        // process data
        alert('Data received!');
    } else {
        // handle server-side error
    }
}
0 голосов
/ 31 декабря 2010
function check(){
        var check=httpReq.readyState==4&&httpReq.status==200?true:false;
        alert(check);
}

this.connect=function(frm){
        if (isFirefox() && firefoxVersion() >= 3) {
            httpReq.onload = check;
        } else {
            httpReq.onreadystatechange = check;
        }
       httpReq.open('GET',url(frm),false);
       httpReq.send(null);
}}
0 голосов
/ 30 декабря 2010

Правильный код будет:

var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
if (check) {
   alert("Page done loading and is OK");
}
0 голосов
/ 30 декабря 2010

Почему это было бы удивительно? Я предполагаю, что вы находитесь в обратном вызове Ajax, разные браузеры проходят через разные этапы HTTP-извлечения. Chrome знает о промежуточном состоянии до «готовности» и вызывает обратный вызов, если вы можете сделать что-то полезное с этим фактом; Firefox узнает о запросе только тогда, когда данные готовы. Ничего общего с JavaScript как таковым , только незначительные различия в реализации [XHR][1].

0 голосов
/ 30 декабря 2010

Этот код должен выполняться несколько раз, и ни один вызов не может привести к тому, что три диалога всплывают без контекста этого вызова, на который невозможно ответить.Что если вы измените alert (check) на alert («hello world»), произойдет ли это все еще три раза в chrome и один раз в fire fox, если вы знаете, что с вашим троичным выражением все в порядке, и проблема заключается в обращении к чему угодноэтот код включен, а не что-то не так с самим выражением.То, как события обрабатываются и отправляются браузерами, варьируется, поэтому может случиться так, что, если в каком-то обработчике событий событие отправляется несколько раз chrome против firefox, различная интерпретация спецификации приводит к таким расхождениям между поведением браузера (причина, по которой яВошли в Flex и поработали над ним, по крайней мере, проблемы совместимости браузеров связаны с одним объектом, Adobe, и есть кто-то, кого можно обвинить и подать отчет об ошибке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...