Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2020, 16:14
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

после AJAX перестаёт работать event
function set_ajax_hover_cb()
{
    var menuShowTimer = 0;
    $('a.ajax_hover').hover(
    function(e)
    {
        // время задержки, если указано
        var wait_time = this.getAttribute('data-time')   || 300;

        menuShowTimer = setTimeout(
        (function()
        {
            // без return function() задержка отсутствует ^^
            return function()
            {
                ajaxGET(e,   $(e.currentTarget).attr('data-ajax'),   $(e.currentTarget).attr('data-ajax-qs'));
            }
        }) (this), wait_time)
    },
    // то что должно происходить при hover
    function()
    {
        clearTimeout(menuShowTimer);
        // тут ещё код...
    });
}

код при hover вызывает ф-ю
вызов этого кода (ссылка, по которой происходит hover) находится в таблице, которая может обновляться через AJAX
и вот после обновления код тот же самый, а вызов уже не работает...
есть нюанс - вызов set_ajax_hover_cb() стоит в самом низу, после таблицы, т.е. вызывается 1 раз.
но даже если его вместе с AJAX вызывать, всё равно НЕ работает
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2020, 12:09
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

парни, идей нет совсем?
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2020, 12:34
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,717

Слишком мало информации
Сообщение от greenwar Посмотреть сообщение
вызов этого кода (ссылка, по которой происходит hover) находится в таблице, которая может обновляться через AJAX
Что означает, что вызов кода находится в таблице?
Как именно обновляется таблица? Что в ней обновляется?
Что делает ajaxGET?

И что?
Так
menuShowTimer = setTimeout(
      function()
            {
                ajaxGET(e,   $(e.currentTarget).attr('data-ajax'),   $(e.currentTarget).attr('data-ajax-qs'));
            }
  , wait_time)

Нет задержки?

На вскидку можно только предположить, что если ссылка (<a>) находится в таблице и меняется (создается новый элемент), то конечно к нему уже не привязаны обработчики событий hover

Последний раз редактировалось voraa, 23.04.2020 в 12:48.
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2020, 18:21
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

Сообщение от voraa Посмотреть сообщение
Как именно обновляется таблица? Что в ней обновляется?
вот это:
<a href='#' class='ajax_hover' data-ajax='/logs_tbl/8744158/ajax' data-ajax-qs='ent=7&id=8744158'>link</a>

Цитата:
Что делает ajaxGET?
он и заменяет таблицу на новую, и все вот эти вышеобозначенные линки.
Цитата:
Нет задержки?
есть, ради неё и юзаю такой код.

Цитата:
На вскидку можно только предположить, что если ссылка (<a>) находится в таблице и меняется (создается новый элемент), то конечно к нему уже не привязаны обработчики событий hover
вооот... А как их обратно перепривязать? Я же запускаю ф-ю снова, а толку нет...
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2020, 18:54
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,717

Надо смотреть, как вы обновляете таблицу и как потом перепривязываете обработчики к элементам.
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2020, 19:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,717

А вообще странное решение.
Мышь приходит на эту ссылку и остается.
Вы обновляете ее, новая ссылка оказывается под мышью. К ссылке привязывается обработчик, и малейшее движение мышью, хоть на пиксель, вызывает его срабатывание и все по новой...
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2020, 20:25
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

так, стоп, я попутал...
эта ссылка с ajaxGET() вызывает fancybox с инфой
а таблицу обновляет поиск в отдельном <input ...>
это вообще отдельная история
но вот когда таблица обновилась (обновляется так же - через AJAX jQuery, там никакой магии), то походу и слетают все привязки
и потом почему-то не привязываются...
Ответить с цитированием
  #8 (permalink)  
Старый 23.04.2020, 20:46
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,717

Сообщение от greenwar Посмотреть сообщение
но вот когда таблица обновилась (обновляется так же - через AJAX jQuery, там никакой магии), то походу и слетают все привязки
и потом почему-то не привязываются...
Ну там есть кое-какая магия.
Процессы асинхронны. Нужно ждать, пока сервер ответит, ссылки создадутся, подключатся к DOM и только после этого привязывать обработчики.
Не видя кода обновления трудно сказать, что не так.
Ответить с цитированием
  #9 (permalink)  
Старый 23.04.2020, 21:31
Профессор
Отправить личное сообщение для greenwar Посмотреть профиль Найти все сообщения от greenwar
 
Регистрация: 19.08.2010
Сообщений: 150

ну ф-я то вот:
function tbl_search_func(next_page_div_id, id, qs = '')
{
    $('#' +next_page_div_id).hide();
    ajaxPOST(id, qs);
    set_ajax_hover_cb(); // ф-я из первого поста
}

вызов:
<input type=text name='search_input' id='search_str' value='' onmousedown='$(this).select();return false;' oninput='tbl_search_func(`tbl-next-page-btn-div`, `#tbl_search`, `ent=43`)'
Ответить с цитированием
  #10 (permalink)  
Старый 23.04.2020, 23:27
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,717

Вот-вот.
Тут то и магия.
ajaxPOST(id, qs) там идет обращение к серверу. И асинхронное получение результата и его обработка, каким нибудь обратным вызовом success. Но никто не ждет пока success выполнится. Оно выполнится потом, когда с сервера придет ответ. А ajaxPOST спокойно завершается и начинает выполняться set_ajax_hover_cb(). Данные еще с сервера не пришли, таблицы и линки не обновились, и обработчики вешаются на старые линки.

Вызов set_ajax_hover_cb() надо ставить в ту функцию, которая формирует новые линки, сразу после того, как они вставляются в DOM/

Последний раз редактировалось voraa, 23.04.2020 в 23:31.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра-квест на JS, помогите разобраться в структуре m_lulu Общие вопросы Javascript 1 29.03.2018 14:02
Не работает свое меню после AJAX AnonimS jQuery 6 07.02.2018 21:51
После первого действия скрипт перестает работать cyberx jQuery 6 12.06.2010 22:04
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
перестает работать lightbox после .load(); toha.chan jQuery 1 14.04.2010 16:37