Вызов AJAX не выполняет функцию JavaScript. Почему? Обходной путь?

#php #javascript #ajax

#php #javascript #ajax

Вопрос:

Я * ОТПРАВЛЯЮ * запрос на PHP-скрипт входа через AJAX-вызов. После успешного выполнения мне нужно вызвать функцию JavaScript loggedIn() . Я попытался распечатать его…

<script type="text/javascript">loggedIn();</script>

… в качестве .innerHTML элемента div, а также при попытке onload="" события в теге div. Ни один из методов не позволил мне вызвать функцию JavaScript. Я могу напечатать букву внутри div и выполнить ее в onclick="" событии, но все, от чего я пытаюсь избавиться, на самом деле заключается в необходимости нажимать на что угодно. В принципе, я хочу header("...") перенаправление (которое также не будет работать).

Во-первых, кто-нибудь может объяснить, что на самом деле происходит? Моя ставка делается на асинхронный характер AJAX. Во-вторых, кто-нибудь знает обходной путь, который я мог бы использовать, для обновления страницы после успеха?

Как всегда, спасибо, Z@K!

Комментарии:

1. Используете ли вы какой-либо конкретный фреймворк? (jQuery, прототип?)

Ответ №1:

Сброс некоторого фрагмента javascript в div не приведет к его автоматическому запуску. Такая вещь работает только во время генерации страницы. Вам нужно было бы определить функцию перед обработкой, они выполняют простой loggedIn() вызов в вашем обработчике ajax, когда он получает уведомление об успешном завершении от сервера.

Комментарии:

1. Это правильно 1!!! Я проверил свой собственный ответ ниже, только чтобы помочь людям найти его. Я выписал фактический код, который я использовал, и дал подробное описание ниже. Спасибо Marc B!

Ответ №2:

Взгляните на jQuery, и это функция $.ajax(). Он будет делать именно то, что вы ищете, с обработчиком onSuccess.

Ответ №3:

Вы спрашиваете, что происходит — и я не могу вам этого сказать, не видя вашего кода. Вот что я ожидал бы, что произойдет.

Ваша домашняя страница (index.php ) может включать форму, содержащую поля имени пользователя и пароля, и кнопку для отправки формы. Index.php может содержать только экран входа в систему, или форма может быть небольшой опцией сбоку.

a) Пользователь вводит свое имя пользователя и пароль и нажимает кнопку входа. Затем данные отправляются на сервер по URL, указанному в теге формы.

б) Этот php-скрипт проверяет имя пользователя и пароль (соблюдая осторожность при шифровании пароля перед поиском записи пользователя в базе данных, поэтому пароль не сохраняется в виде обычного текста).

c) Если пользователь и пароль приемлемы, переменные сеанса сохраняются и генерируется экран «Пуск». В противном случае экран входа в систему генерируется снова с сообщением об ошибке (в котором не указывается, что неверно).

d) Поскольку код существует, сеанс сохраняется, и сгенерированный экран отправляется в браузер (автоматически).

e) Все страницы, которые должны быть защищены логином, должны выполнять session_start() и отображать экран входа в систему, если флаг logged_in не установлен. Простой способ сделать это — перенаправить на домашнюю страницу.

Не используйте AJAX для обработки экрана входа в систему, потому что вам нужно показать другой экран, если проверка завершится неудачей, когда она завершится успешно. AJAX означал бы, что вы должны были бы уже отправить защищенный паролем экран пользователю до того, как он войдет в систему, а это плохая идея. Для входа в систему AJAX ничего не дает.

Где AJAX полезен, так это когда вам нужно отправить данные на сервер для хранения, в случае сбоя клиента. AJAX также полезен, когда клиенту требуются дополнительные данные после некоторого пользовательского ввода. Например, при оформлении заказа пользователь вводит свою страну, и затем страница извлекает почтовые расходы с помощью AJAX.

Ответ №4:

 // Create a callback handler
xmlHttp.onreadystatechange = function () {
    // readyState == 4 | The request is complete
    // status == 200 | Request completed successfully.The page is found and displayed.
    if ( xmlHttp.readyState == 4 amp;amp; xmlHttp.status == 200 ) {
        if (xmlHttp.responseText == "SUCCESS") {
            document.location.href = redirect_url;
        } else {
            var elemObj = document.getElementById(div_id);
            elemObj.innerHTML = xmlHttp.responseText;
        }
    }
}
  

В моем обычном обработчике обратного вызова я добавил…

         if (xmlHttp.responseText == "SUCCESS") {
            document.location.href = redirect_url;
        }
  

Поскольку HTML — это строка, а «SUCCESS» — это строка, мне действительно не нужно было делать ничего другого, кроме проверки результатов действия входа в систему на «SUCCESS». Затем используйте document.location .href для перенаправления страницы на соответствующий URL.

Это идеально подходит для моего приложения. Спасибо всем за ваш вклад!

~ Z@K!