Скрипт работает только тогда, когда в скрипте есть окно предупреждения - PullRequest
2 голосов
/ 27 января 2010

Если я возьму предупреждение из следующего скрипта, firebug скажет, что результаты не определены? `

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
    <head>
        <title>Inventory Management</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Untitled Document</title>
        <script src="json.js" type="text/javascript"></script>
        <script src="prototype.js" type="text/javascript"></script>
    </head>
    <body>
        <div id="content">
            <div id="header">   
            </div>

            <script type="text/javascript">
                var xhr;
                var results=getPlants(xhr,results);
                var plants=[];

                function getPlants(xhr,results){
                    try {
                        xhr=new XMLHttpRequest();   
                    }catch(microsoft){
                        try{
                            xhr=new ActiveXObject("Msxml2.XMLHTTP");                
                        }catch(othermicrosoft){
                            try{
                                xhr = new ActiveXObject("Microsoft.XMLHTTP");               
                            }catch(failed){
                                xhr=false;
                                alert("ajax not supported");
                            }
                        }               
                    }

                    xhr.onreadystatechange= function () {
                        if(xhr.readyState==4 && xhr.status==200) {
                            results = xhr.responseText;                     
                        }
                    }

                    xhr.open("GET","db_interactions.php",true);     
                    xhr.send(null);
                    alert("sent");
                    return results;
                }

                plants.inv=[];
                plants.split = results.split("~");

                for (var x=0;x<=plants.split.length-2;x++){
                    plants.inv[x]=plants.split[x].evalJSON();
                }

                document.write(plants.inv[1].scientific_name);
            </script>
        </div>
    </body>
</html>

Ответы [ 5 ]

8 голосов
/ 27 января 2010

Причина, по которой он не работает, заключается в том, что XmlHttpRequest является асинхронным . Это означает, что вы не можете сделать return results;

Вот график времени с вашим окном оповещения:

  1. Создать XmlHttpRequest
  2. Отправить
  3. Окно оповещения всплывает и некоторое время сидит там
  4. Результат XmlHttpRequest возвращается и устанавливает переменную results в вашей onreadystatechange функции
  5. Вы нажимаете кнопку ОК в окне предупреждения
  6. функция возвращает (строка return results)
  7. Другой код выполняется и работает с переменной results.

Вот график без окна предупреждения:

  1. Создать XmlHttpRequest
  2. Отправь
  3. функция возвращает (строка return results)
  4. Другой код запускается и работает с переменной results. Это терпит неудачу, потому что это еще не было установлено
  5. Результат XmlHttpRequest возвращается и устанавливает переменную results в вашей onreadystatechange функции

Вместо этого вы должны поместить код растений (расщепление и т. Д.) В обратный вызов onreadystatechange или поместить его в свою собственную функцию и вызвать эту функцию из onreadystatechange

2 голосов
/ 27 января 2010

Вам следует изменить переменную plants в функции обратного вызова, назначенной свойству onreadystatechange.

xhr.onreadystatechange = function(){
    if(xhr.readyState==4 && xhr.status==200) {
        results = xhr.responseText;
        // Populate the "plants" variable here, then call a function
        // that does something with the plants variable.
    }
}

Для получения дополнительной информации: https://developer.mozilla.org/en/AJAX/Getting_Started

1 голос
/ 27 января 2010

Функция обратного вызова, которая устанавливает переменную 'results', является асинхронной - это означает, что она, скорее всего, будет установлена ​​ после оператора return, если нет чего-то, что могло бы задержать оператор возврата (например, вызов alert () ).

1 голос
/ 27 января 2010

при звонке

xhr.open("GET","db_interactions.php",true);

вы говорите XMLHttpRequest для асинхронной работы . Вы говорите ему, чтобы он ушел и выполнил свою работу, вызывая функцию обратного вызова в какое-то неопределенное время в будущем, когда запрос будет полностью обработан. Измените это true на false, и оно будет работать так, как вы ожидаете. С другой стороны, эта функция может зависать на неопределенный срок в случае замедления работы сети и т. Д., Поэтому caveat programmor .

0 голосов
/ 27 января 2010

XMLHttpRequest.send () является асинхронным. Без предупреждения функция выполняется быстрее, чем вызов ajax, и результаты никогда не инициализируются. Вы можете исправить это, изменив true в вашем открытом вызове на false, чтобы сделать его синхронным или установить глобальную переменную в вашей встроенной функции

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