За последние 24 часа нас посетили 17784 программиста и 1719 роботов. Сейчас ищут 945 программистов ...

Не редиректится после ajax

Тема в разделе "JavaScript и AJAX", создана пользователем fartuk, 20 июл 2014.

  1. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Привет. У меня есть форма, которая посылает данные странице form.php, которая обрабатывает данные и посылает ответ, который вставляется в <div> блок по технолонии аякса. Так вот, если есть какие-то ошибки(пользователь не заполнил поля), то всё нормально, выводится в блоке сообщение об ошибке. А если всё правильно, то я хочу сделать редирект. Но не получается: если вставить '<meta http-equiv='Refresh' content='0; URL=index.php'>' в качестве ответа, то не происходит перенаправления. подскажите пожалуйста, как можно организовать редирект?
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вы же на клиенте обрабатываете полученный ответ ajax-запроса - значит и перенаправляйте соответствующе:
    Код (Text):
    1. location.href = '/path/to/file.php';
     
  3. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Я в ajax чайник, подскажите пожалуйста, вот у меня на странице 1 есть
    <script type="text/javascript">

    /**
    * Функция для отправки формы средствами Ajax

    **/
    function AjaxFormRequest(result_id,form_id,url) {
    jQuery.ajax({
    url: url, //Адрес подгружаемой страницы
    type: "POST", //Тип запроса
    dataType: "html", //Тип данных
    data: jQuery("#"+form_id).serialize(),
    success: function(response) { //Если все нормально
    document.getElementById(result_id).innerHTML = response;



    },
    error: function(response) { //Если ошибка
    document.getElementById(result_id).innerHTML = "Ошибка при отправке формы";
    }
    });
    }




    </script>


    Страница 2 обрабатывает данные, которые отправлены со страницы 1, и посылает ответ. При случае, если все удачно(данные обработались и занеслись в БД) то нужно сделать редирект на страницу 3. Я пытался сделать так: на странице 2 писал мета тег с редиректом, но не сработало. Как сделать, чтобы например страница 2 посылала '0', и редирект производился уже средствами Ajax? Спасибо)
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Ajax не имеет отношения к редиректам и тому подобному. Если сказать очень просто, то он обеспечивает "фоновое общение" между клиентом и сервером. На сервере, получив какой-либо результат (положительный или отрицательный), вы можете передавать ответом сразу имя или весь путь к файлу, на который нужно сделать редирект, а как его делать, я показал в предыдущем ответе.
    Код (Text):
    1. /* ... */
    2. success: function(response) { //Если все нормально
    3.     location.href = '/path/to/' + response; // response - имя файла
    4. }
    5. /* ... */
     
  5. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    У меня например на странице 2(которая обрабатывает данные формы) такой код:
    $search = $_POST['search'];
    if ($search==''){
    пусто, нужно сделать редирект, чтобы пользователь со страницы 1 перенаправился на какую-нибудь страницу 3

    }
    else{
    echo 'не пустой запрос' ;

    }
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    На сервере:
    Код (PHP):
    1. $result = array('found'=>false, 'redirect'=>'');
    2. $search = trim($_POST['search']);
    3. if(!empty($search)){
    4.    // ищем в БД
    5.    if(что-то_найдено){
    6.       $result['found'] = 'результат SQL-запроса';
    7.    } else {
    8.       $result['redirect'] = 'file3.php'; // перенаправляем на страницу 2, т.к. ничего не найдено
    9.    }
    10. } else {
    11.       $result['redirect'] = 'file100500.php'; // перенаправляем на страницу 100500, т.к. запрос пустой.
    12. } 
    В JS обрабатываем ответ:
    Код (Text):
    1. success: function(response){
    2.     if(!response.found) {
    3.         // если ничего не найдено или запрос пустой,
    4.         // то перенаправить на соответствующую страницу
    5.         location.href = response.redirect;
    6.     } else {
    7.         // что-то найдено, выводим результат
    8.         $('#result_id').html(response.found);
    9.     }
    10. }
     
  7. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Спасибо, но у меня страница, на которой находится JS, никак не хочет воспринимать значение found. Поэтому в условии всегда выполняется location.href = response.redirect; Но и он отправляет на страницу undefined. Получается JS не принимает ничего со страницы сервера.

    Добавлено спустя 32 секунды:
    Как думаете, в чём может быть ошибка?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    C телепатией у меня всегда были проблемы. ) Пробуйте следующее:
    1. Изменяете тип данных, в котором ожидается получить ответ от сервера. Вместо dataType: "html" пишем dataType: "json".
    2. На сервере отправляете ответ так:
    Код (PHP):
    1. exit( json_encode($result) );
    3. Консолью, я так понимаю, что вы не пользуетесь. Возьмите за правило - до того, как начали какую-нибудь отладку, открываете консоль и закрываете её только после того, как решили на всё забить и идти на пиво.
     
  9. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Один вопрос: если вам надо редиректить страницу - на кой вам сдался Ajax? Сделайте в php-обработчике получение нужного адреса и через header("Location: ...") уходите на него.
     
  10. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Об этом я не подумал, но да, это решение тоже мне подходит, спасибо. Но советы Deonisa
    тоже помогли. Спасибо

    Добавлено спустя 8 минут 44 секунды:
    И ещё один вопрос, хотя не совсем по теме, просто не хочется плодить сотню чайниковских тем.
    Собственно код
    <script type="text/javascript" >
    //удалить картинку
    $(document).ready(function(){
    $('#getContent').click(function(){
    $.ajax({
    url: "delete_img.php",
    cache: false,
    beforeSend: function() {
    $('#preview').html('Получаем контент');
    },
    success: function(html){
    $("#preview").html(html);
    }
    });
    return false;
    });
    });

    </script>

    он подгружает контент со страницы delete_img.php при нажатии такой кнопки <a href="#" id="getContent">кнопка </a>.
    Всё работает нормально, но мне нужно, чтобы на серверную страницу (delete_img.php) подгружался параметр, указывающий, какой номер у кнопки(их присутствует несколько).
    <a href="#" id="getContent" параметр=1>кнопка 1</a>
    <a href="#" id="getContent" параметр=2>кнопка 2</a>
    <a href="#" id="getContent" параметр=3>кнопка 3</a>
    Как можно такое организовать?
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    fartuk, за использование одинаковый ID у нескольких элементов в пределах одной страницы, делают explode() задницы по молекулам. Для таких целей существуют классы.
    Код (Text):
    1. var paramVal = $(this).attr('name_of_attribute');
    2. $.ajax({
    3.     url: "delete_img.php",
    4.     cache: false,
    5.     beforeSend: function() {
    6.         $('#preview').html('Получаем контент');
    7.     },
    8.     data: { paramKey: paramVal }, // передаём данные
    9.     success: function(html){
    10.         $("#preview").html(html);
    11.     }
    12. });
    На сервере ловим: $_GET['paramKey'] или $_POST['paramKey'], в зависимости от установок
     
  12. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    А что в самих кнопках писать? я одинаковый id ставил потому что они одинаковые, просто отличаются параметром, который я не знаю как указать.
     
  13. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    А зачем вам ссылки?
    Код (Text):
    1. <button onClick="delete_img(1)">1</button>
    2. <button onClick="delete_img(2)">2</button>
    3. А в скрипте
    4. function delete_img(paramVal) {
    5. $.ajax({
    6.     url: "delete_img.php",
    7.     cache: false,
    8.     beforeSend: function() {
    9.         $('#preview').html('Получаем контент');
    10.     },
    11.     data: { paramKey: paramVal }, // передаём данные
    12.     success: function(html){
    13.         $("#preview").html(html);
    14.     }
    15. });
    16. }
    Добавлено спустя 42 секунды:
    В таком случае надо ставить одинаковый класс. Одинаковых id не должно быть никогда!
     
  14. fartuk

    fartuk Новичок

    С нами с:
    29 окт 2013
    Сообщения:
    40
    Симпатии:
    0
    Спасибо, работает. Но получается передать параметр только если он числовой. А можно, например, как-нибудь передавать так:
    <button onClick="delete_img(1text.text)">1</button> ?

    Добавлено спустя 4 минуты 31 секунду:
    Ой, тупанул, надо же было кавычки поставить )