Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.02.2019, 22:04
Новичок на форуме
Отправить личное сообщение для DeepDaft Посмотреть профиль Найти все сообщения от DeepDaft
 
Регистрация: 19.02.2019
Сообщений: 3

Не корректная работа Ajax запроса
Доброго времени суток!

Только начал изучать Ajax и на первых парах сталкиваюсь с проблемой. Ниже код написанный на JS , а так же код который вынесен в отдельный php файл. По результату нажатия на объект, должно вернуться слово Hello, но вместо этого, в алерт выводится весь html код страницы на которой я нахожусь. Подскажите пожалуйста, что конкретно делаю не так.

goods.php
<?php
    HeadCC('Товары', 'v');
?>
        <div class="mainblock">
            <p align="center" class="stafflistheadline">Управление товарами</p>
            <?php
                MessageShow ();
                $Link = "'/ccenter/goods/scooter'";
                if (empty($Submodule)){
                    echo '
                        <table class="catgoods">
                        <tr><th class="stafflisthead1">Номер</th><th class="stafflisthead">Название категории</th><th class="stafflisthead">Краткое описание</th><th class="stafflisthead">Количество позиций</th><th class="stafflisthead">Количество товара в наличии</th></tr>
                        <tr class="stafflisttr" onclick="window.location.href='.$Link.'; return false"><td class="catgoodsid">1</td><td>Самокаты</td><td>Средство передвижения</td><td>56</td><td>1000</td></tr>
                        <tr class="stafflisttr"><td class="catgoodsid">2</td><td>Велобеги</td><td>хз что это</td><td>312</td><td>657</td></tr>
                        <tr class="stafflisttr"><td class="catgoodsid">3</td><td>Рабы</td><td>Полезные ребята</td><td>78</td><td>45</td></tr>
                        <tr class="stafflisttr"><td class="catgoodsid">4</td><td>Конская сперма</td><td>Готовьте жидкий азот</td><td>93</td><td>42</td></tr>
                        <tr class="stafflisttr"><td class="catgoodsid">5</td><td>Шумеры</td><td>По всем вопросам обращайтесь к Владимиру</td><td>11</td><td>60</td></tr>
                        </table>';
                }
                else{
                    echo '
                    <div class="goodstable">
                        <div class="instrumentsline"><img src="/resources/picture/icon/plus.png" style="height: 100%;"><img src="/resources/picture/icon/pancil.png" style="height: 100%;"></div>
                        <div class="goodslist">
                        <table>
                            <tr class="scooter1" id="scooter1">
                            <td>1</td><td>лох</td>
                            </tr>
                            <tr class="scooter2" id="scooter2">
                            <td>2</td><td>пидр</td>
                            </tr>
                        </table>
                        </div>
                        <div class="goodinfo">
                        </div>
                    </div>
                    ';
                }
            ?>  
        </div>
        <script>
            /*function funSuc (data){
                alert(data);
            }
            $(document).ready (function(){
                $("#scooter1").bind("click", function(){
                    $.ajax ({
                        url: 'goodinfo.php',
                        type: 'POST',
                        data: ({'number': 5}),
                        dataType: 'html',
                        success: funSuc
                    });
                });
            });*/
            $('#scooter1').click(function(){
                $.get("goodino/goodinfo.php", function(data) {
                alert(data);
                })
            });
        </script>   
    </body>
</html>


goodinfo.php
<?php
echo 'Hello';
?>


Заранее благодарен!
Ответить с цитированием
  #2 (permalink)  
Старый 19.02.2019, 22:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Логика взаимодействия клиента с сервером у вас не верна в коде. Если асинхронный запрос производится к скрипту, который по мимо обработки запроса выполняет еще какие либо и связанные с выводом, то обработчик запроса должен после ответа завершать работу. В случае вашего кода обработчик вообще должен быть расположен перед любым выводом в браузер, то есть фактически перед тегом <!DOCTYPE HTML> и прочими.

<?
   //обработчик ajax запроса
   if($_POST) {
       //чего-то делаем и завершаем
       exit('Hello');
   } 
?>
<!DOCTYPE HTML>
<html>
.....


В противном случае весь вывод (вся страница) и будет ответом клиенту.
Ответить с цитированием
  #3 (permalink)  
Старый 21.02.2019, 00:03
Новичок на форуме
Отправить личное сообщение для DeepDaft Посмотреть профиль Найти все сообщения от DeepDaft
 
Регистрация: 19.02.2019
Сообщений: 3

Благодарю за Ваш ответ! Но не уверен что правильно Вас понимаю. Что мне нужно изменить, чтобы обработчик был в отдельном файле, но при этом он выдавал нужную инфу при запросе?

Заранее спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 21.02.2019, 01:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Чтобы правильно понять, на время забудем об Ajax. Львиная доля обращений происходит к индексному файлу, который соберет в кучу работу многих файлов и родит страницу клиенту. А результатом этих родов будет являться html код страницы для клиента. Для РНР же, это в общем-то просто строка, длинная предлинная, которая как минимум будет начинаться с тега <html>. А чтобы заставить родить сервер эту строку, пользователь делает GET запросы.

Это понятно же?

А что если, к примеру, клиенту нужно после загрузки страницы, сделав обычный GET запрос с параметром получить картинку, которую сервер приготовит налету, то есть физически на сервере ее не существует, она рождается по запросу. Что делают? Правильно, делают такой запрос к файлу, который только эту задачу и исполняет.

А что если запросить эту картинку у индексного файла, поместив в его код и вывод этой картинки, что произойдет? Правильно, наряду с выдачей картинки клиент получит опять и длинную строку html кода страницы. При этом как таковая картинка не будет видна, будет ошибка и картинка будет передана как цепь непонятных каракулей текстовых.

Это понятно почему происходит?

Но означает ли это, что нельзя запросить картинку и индексного файла, да вообще у любого иного, который также делает вывод в браузер? Нет не означает, но для этого нужно просто грамотно расположить код на странице. Причина то проблемы ясна, значит и не должно быть затруднений в том как ее устранить. Вот такая структура кода должна быть:

<?
//если запрашиваем картинку у страницы, которая ее же и породила
//то есть отдала клиенту ее код, то обработчик запроса картинки 
//должен быть расположен до любого вывода в браузер
//не считая заголовков
//------------
//обрабатываем GET запрос ?picture=25 на картинку
if($_GET['picture']) {
   //тут код создания картинки и вывода ее клиенту
   //после чего обязательное завершение работы скрипта
   exit;  
}
//а если был просто запрос этой страницы, без указанного параметра
//то будет вывод страницы в браузер, кода ниже
?>
<html>
<head>
......


То же самое происходит и с Ajax, если не соблюдать вышеописанной логики. Разница только в том, что без Ajax страница будет перегружена, а с Ajax нет, ответ будет получен в некий контейнер.

Замените в описанном выше PHP код в начале страницы на свой, который обрабатывает Ajax запрос, и все будет работать без проблем. Никто не запрещает делать запросы и к отдельным страницам, которые будут обрабатывать только их, в этом случае, что понятно, делать выход в скрипте и не потребуется.
Ответить с цитированием
  #5 (permalink)  
Старый 23.02.2019, 17:31
Новичок на форуме
Отправить личное сообщение для DeepDaft Посмотреть профиль Найти все сообщения от DeepDaft
 
Регистрация: 19.02.2019
Сообщений: 3

Благодарю за развернутый ответ! Сделал так, как Вы описывали выше. Работает, и я действительно получаю нужный ответ от сервера! Но код страницы все равно никуда не делся. Вначале я получаю нужный ответ, а за ним сразу идет код. Мой код ниже, но если я заменяю echo на exit, как это было у Вас, то получаю просто пустую страницу. Помогите пожалуйста уже разобраться до конца.

<?php
if ($_POST)
echo '213';
?>
Ответить с цитированием
  #6 (permalink)  
Старый 23.02.2019, 18:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от DeepDaft
Мой код ниже, но если я заменяю echo на exit, как это было у Вас, то получаю просто пустую страницу.
Значит вы не поняли сути из "развернутого" ответа. РНР, это интерпретатор - встретил строку "своего кода" преобразовал ее в байт-код, который будет выполняться, строки инструкций и прочего, строка за строкой. А если анализ находит закрывающий РНР тег ?>, то это не означает, что не будет выведено в браузер (не отдано клиенту) то, что будет находится после ?> Это будет просто вывод в браузер, без всякого компилирования, если нет в нем РНР кода.

Я же писал - если обычный запрос (ajax запрос), который делает клиент, направлен к странице, которая делает некий вывод в браузер (частный пример, это запрос к самой себе), а в ответ нужен только результат этого запроса, то нельзя помещать такой запрос в середину или в конец страницы, так как все это будет выведено также в браузер. Такой обработчик запроса в таких случаях должен быть размещен до любого вывода в браузер!!! При этом передача заголовков не в ходит в это условие, они могут передаваться до обработчика.

И после завершения работы обработчика должно быть обязательное завершение скрипта - exit; !!!

А вы что делаете - экспериментируете с echo? Ну правильно, эта конструкция выплюнет клиенту то что вы ей прописали, а далее будут простой вывод в браузер того, что после ?>

А с exit почему не получается? А потому, что ваш ajax запрос предается методом не POST, а GET:

$.get("goodino/goodinfo.php" .....

Но если вы в коде своем замените $_POST на $_GET, то это будет равносильно как $_POST с echo, а не exit. Причину надо пояснять или сами хотя бы попытаетесь понять?

Если $.get("goodino/goodinfo.php" ....., то не просто if ($_GET), а проверка некоторого параметра, который метод $.get() также должен передавать, тогда

<?php
if ($_GET['mykey'])
exit '213';
?>

и никак иначе. Ну думайте, вникайте.

Последний раз редактировалось laimas, 24.02.2019 в 20:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение функции после выдачи результата AJAX запроса polearmik AJAX и COMET 2 22.04.2017 15:48
как получить результат от ajax запроса (из отдельного файла) 1Feniks1 AJAX и COMET 0 12.03.2017 18:45
Получить данные из ajax запроса AlexTrader AJAX и COMET 6 25.12.2016 05:25
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23