Firefox не запускает функцию onreadystatechange - PullRequest
4 голосов
/ 22 декабря 2010

Я сделал некоторый код JavaScript для своего сайта, он работает без проблем в Opera и Chrome, но не в Firefox.

Вот скрипт:

function checkstate(who,row,cell)   {
    var zwrot="";
    var mouseEvent='onmouseover="javascript:bubelon(this.id);" onmouseout="bubeloff();"';
    var cellid="";

    ajax=new XMLHttpRequest();
    ajax.onreadystatechange=function(aEvt) {
        if (ajax.readyState===4 && ajax.status===200) {
            alert("im here!");
            }
    };

    ajax.open('GET',"oth/work_prac_stan.php?usr="+who,false);
    ajax.send();
}

function sprawdzstan() {
    var lol="";
    var table = document.getElementById("usery");
    var re = /^<a\shref\=/g;

    for (var i = 1, row; row = table.rows[i]; i ++) {
        if (row.cells[0].innerHTML.match(re)) {
            checkstate(row.cells[1].innerHTML,row,2);
        } else {
            checkstate(row.cells[0].innerHTML,row,1);
        }
    }
}

Проблема в том, что Firefox не запускает функцию, назначенную onreadystatechange.Я проверил в firebug, что ответ из php-файла правильный.

Где проблема?Он работает на Chrome и Opera, Firefox просто нет, нет ошибок в консоли, ничего.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2010

Обновленный ответ

Согласно Документам Mozilla , вы не используете onreadystatechange для синхронных запросов.Какой вид имеет смысл, поскольку запрос не возвращается до тех пор, пока состояние готовности не станет равным 4 (завершено), хотя я, вероятно, не разработал бы его таким образом.

Оригинальный ответ

Ненемедленно увидев дымящийся пистолет, но: ваша переменная ajax не определена внутри функции, и поэтому вы почти наверняка перезаписываете ее на каждой итерации цикла в sprawdzstan.Будет ли это проблемой , еще неизвестно, поскольку вы используете синхронный вызов ajax.В любом случае добавьте var ajax; к checkstate, чтобы убедиться, что вы не стали жертвой Ужаса неявных глобалов .


Не по теме: Если вы можете найти способ изменить свой дизайн, чтобы не использовал синхронный запрос ajax, настоятельно рекомендуем сделать это.Синхронные запросы блокируют пользовательский интерфейс браузера (в большей или меньшей степени в зависимости от браузера, но многие - большинство? - полностью блокируются, включая другие не связанные вкладки).Вместо этого почти всегда можно выполнить рефакторинг и использовать асинхронный запрос.

Не по теме 2 : вы не используете mouseEvent в своем коде, но если вы это сделаете, вы захотитеизбавиться от этих javascript: префиксов в атрибутах onmouseover и onmouseout.Эти атрибуты не являются URL-адресами, префикс не является (там) спецификатором протокола (это метка, которую вы не используете).

0 голосов
/ 24 июня 2013

Для тех, кто все еще сталкивается с этой проблемой ...

Вы можете использовать приведенный ниже код. Что я сделал, так это удалил функцию

ajax.onreadystatechange=function(aEvt) {

и передать предупреждение («Я здесь!»); после ajax.send ();

ajax=new XMLHttpRequest();

ajax.open('GET',"oth/work_prac_stan.php?usr="+who,false);
ajax.send();

alert("im here!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...