За последние 24 часа нас посетили 22675 программистов и 1221 робот. Сейчас ищут 775 программистов ...

Как избавиться от автообновления скрипта?

Тема в разделе "JavaScript и AJAX", создана пользователем GTank, 27 окт 2018.

  1. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Дело такое, пишу простой поиск, но столкнулся с проблемой автообновления страницы при каждом нажатии на кнопку формы.

    Мне нужно чтобы при клике на кнопку "НАЙТИ" было совершено перенаправление на страницу где должна выводиться найденная инфа. Для этого в jq я использую эту сроку:

    !!!
    Код (Javascript):
    1. window.location.href = '/search?'+ search;
    Но данные пропадают каждый раз как я нажимаю на кнопку. Потому что срабатывает вот это пере направление. Не знаю что делать. Как мне этого избежать? Что нужно сделать? Может быть написать проверку чтобы строка срабатывала только на главной странице?, но у меня такое не вышло или я просто не знаю как её написать в данном случае!

    В принципе скрипт рабочий. Данные с формы отправлятюся и в итоге я поучаю ответ, но появляется на миг и сразу же исчезает из-за функции перенаправления.

    Форма:
    HTML:
    1. <form action="" method="get" name="search" id="search_form">
    2.     <input type="text" name="s" id="search"/>
    3.     <input type="submit" value="Поиск">
    4. </form>
    Скрипт:
    Код (Javascript):
    1. $('#search_form').on('submit',function () {
    2.         var search = $(this).serialize();
    3.  
    4.         window.location.href = '/search?'+ search;
    5.  
    6.         $.ajax({
    7.             url:"/search/dd",
    8.             method:"GET",
    9.             data:search,
    10.             success:function (data) {
    11.                 $('#test2').html(data);
    12.             },
    13.             error: function () {
    14.                 console.log('Error');
    15.             }
    16.         });
    17.     })

    Я понимаю, что оно мешает (window.location.href = '/search?'+ search;), но как мне сделать редирект? Ведь форма поиска находиться в шапке дефолтного шаблона, а весь основной контент погружается в отдельных вьюшках в соответствии с маршрутом из строки браузера.

    Я уже не знаю что делать. Помогите =)
     
  2. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Может не совсем понял что ты спрашиваешь.

    Но думаю тебе стоит попробовать поменять
    Код (Text):
    1. <input type="submit" value="Поиск">
    на
    Код (Text):
    1. <input type="button" value="Поиск">
    При этом ловить не сабмит , а клик на кнопку:
    Код (Text):
    1. $('#search_form').on('click',function () {
     
  3. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    У меня есть форма поиска в шапке сайта. Задумка такая, что когда я ввожу данные и наживаю на кнопку ПОИСК, то перехожу с главной страницы "/", на страницу где должны уже быть результаты поиска т.е. "/search".

    У меня получается так что прокис работает только на самой странице search, а если на главной ввожу данные в форму и жму кнопку ПОИСК, то перенаправления не происходит =(

    Ладно. Пёс с ней. Сделаю отдельную страницу поиска. Может быть когда по лучше разберусь с этим всем - переделаю.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    @GTank, все от неутолимого желания прикручивать аякс и т.п. ко всему подряд. В поиске аякс может потребоваться только для «живого поиска». Для всего остального даже JS не нужен. Порядок такой:
    1) из формы POST-запрос на /search;
    2) редирект методом GET на /search/поисковый_код;
    3) в ответ на послед. запрос вывод первой страницы результатов поиска (или, возможно, предупреждение, если пользователь вручную вписал в адрес некорректный поисковый код).
     
    GTank нравится это.
  5. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Всё не так. Я хотел как лучше. Да и вообще мне нужно практиковаться. Вот и решил реализовать это именно так.
    Не понял насчёт второго пункта. Я просто представить это не могу, как сделать редирект методом ГЕТ. Можете дать похожий пример или подскажите что гуглить =)
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    зачем используешь аякс, если достаточно отправиться по <form action="url"> на другую страницу с результатом как ты и хотел ?
     
  7. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Вариантов в сети много. В основном все асинхронные. Пытался реализовать свой поиск на основе того что нашел в сети. В итоге я реализовал так:

    Форма из шапки стандартного шаблона:
    HTML:
    1. <form action="/search" method="post" name="search" id="search_form">
    2.     <input type="text" name="s" id="search_input"/>
    3.     <input type="submit" name="bsearch" value="Поиск">
    4. </form>
    Контроллер:
    PHP:
    1. class SearchController extends AppController
    2. {
    3.     public function indexAction()
    4.     {
    5.         if (isset($_POST['bsearch'])){
    6.  
    7.             $search_model = new Search();
    8.  
    9.             $search_data = $_POST['s'];
    10.  
    11.             $result = $search_model->search($search_data);
    12.         }
    13.         $this->set(compact('data', 'result'));
    14.     }
    15. }
    Модель:
    PHP:
    1. class Search extends Model
    2. {
    3.     public function search($word){
    4.         $word = htmlspecialchars($word);
    5.  
    6.         if($word === ''){ return false; };
    7.  
    8.         $query = '';
    9.  
    10.         $array_words = explode(' ',$word);
    11.  
    12.         foreach ($array_words as $key => $value){
    13.             if (isset($array_words[$key-1])){
    14.                 $query .= ' OR ';
    15.             }
    16.             $query .= 'title LIKE "%'. $value .'%"';
    17.         }
    18.  
    19.         $query_reruslt =  $this->selectData($query);
    20.  
    21.         return $this->sortData($query_reruslt);
    22.  
    23.     }
    24.  
    25.     public function selectData($query){
    26.         return $this->db->query("SELECT * FROM products WHERE {$query}");
    27.     }
    28.  
    29.     public function sortData($query_reruslt){
    30.         $data = [];
    31.         foreach ($query_reruslt as $item){
    32.             $data[$item['id']] = $item;
    33.         }
    34.         return $data;
    35.     }
    36. }

    Во вьюшке так чисто для теста:
    PHP:
    1. <?php foreach ($debug as $item):?>
    2.  
    3. <?php echo  $item['title']?>
    4.  
    5. <?php endforeach; ?>
    В целом всё работает как я и хотел. Запрос разбивается на части и находятся все имеющиеся записи по словам из формы =)
    Вопрос решен! Всем спасибо =)
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Обычный заголовок Location (со статусом 302). Браузеры в ответ на него будут делать запрос методом GET.
     
  9. GTank

    GTank Новичок

    С нами с:
    21 июл 2018
    Сообщения:
    31
    Симпатии:
    1
    Понятно. Почитаю, но уже переделывать не буду. Как сделал, так сделал. На данный момент меня устраивает.
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    GTank нравится это.