после 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 вызывать, всё равно НЕ работает :( |
парни, идей нет совсем?
|
Слишком мало информации
Цитата:
Как именно обновляется таблица? Что в ней обновляется? Что делает ajaxGET? И что? Так menuShowTimer = setTimeout( function() { ajaxGET(e, $(e.currentTarget).attr('data-ajax'), $(e.currentTarget).attr('data-ajax-qs')); } , wait_time) Нет задержки? На вскидку можно только предположить, что если ссылка (<a>) находится в таблице и меняется (создается новый элемент), то конечно к нему уже не привязаны обработчики событий hover |
Цитата:
<a href='#' class='ajax_hover' data-ajax='/logs_tbl/8744158/ajax' data-ajax-qs='ent=7&id=8744158'>link</a> Цитата:
Цитата:
Цитата:
|
Надо смотреть, как вы обновляете таблицу и как потом перепривязываете обработчики к элементам.
|
А вообще странное решение.
Мышь приходит на эту ссылку и остается. Вы обновляете ее, новая ссылка оказывается под мышью. К ссылке привязывается обработчик, и малейшее движение мышью, хоть на пиксель, вызывает его срабатывание и все по новой... |
так, стоп, я попутал...
эта ссылка с ajaxGET() вызывает fancybox с инфой а таблицу обновляет поиск в отдельном <input ...> это вообще отдельная история но вот когда таблица обновилась (обновляется так же - через AJAX jQuery, там никакой магии), то походу и слетают все привязки и потом почему-то не привязываются... |
Цитата:
Процессы асинхронны. Нужно ждать, пока сервер ответит, ссылки создадутся, подключатся к DOM и только после этого привязывать обработчики. Не видя кода обновления трудно сказать, что не так. |
ну ф-я то вот:
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`)' |
Вот-вот.
Тут то и магия. ajaxPOST(id, qs) там идет обращение к серверу. И асинхронное получение результата и его обработка, каким нибудь обратным вызовом success. Но никто не ждет пока success выполнится. Оно выполнится потом, когда с сервера придет ответ. А ajaxPOST спокойно завершается и начинает выполняться set_ajax_hover_cb(). Данные еще с сервера не пришли, таблицы и линки не обновились, и обработчики вешаются на старые линки. Вызов set_ajax_hover_cb() надо ставить в ту функцию, которая формирует новые линки, сразу после того, как они вставляются в DOM/ |
так "та функция", это как раз ф-я ajaxPOST(), которая через jQuery вставляет новую таблицу.
там есть: success: function(data) {ajaxRESULT(data);} туда чтоли вставлять? сейчас она стоит ПОСЛЕ неё... и всё равно не работает ^^ |
Почему бы не $(родитель).on('mouseenter', 'a.ajax_hover' , ..., без надобности в set_ajax_hover_cb() ?
|
Цитата:
Вот представьте, что вы сейчас после вызова set_ajax_hover_cb() поставите вызов какой-нибудь функции foo(). Вызовется set_ajax_hover_cb(), затем foo(). А те функции, которые описаны в set_ajax_hover_cb(), как реакция на наведение мыши когда вызовутся? Когда нибудь потом, когда мышь наведется. Так же и тут. в ajaxPOST() есть функция function(data) {ajaxRESULT(data);} которая работает "когда нибудь потом", когда придет ответ от сервера. Вот там, после изменения таблицы и надо делать вызов set_ajax_hover_cb() Так можно сделать success: function(data) {ajaxRESULT(data); set_ajax_hover_cb();} |
Цитата:
$( selector ).hover( handlerIn, handlerOut ) это ведь сокращённая версия для: $( selector ).mouseenter( handlerIn ).mouseleave( handlerOut ); а вы хотите set_ajax_hover_cb() в handlerOut ? Что это даст? |
Цитата:
и запихнуть туда ф-ю как? |
Цитата:
Цитата:
|
таймер, потому что это может быть "мышь проехала мимо", а выводить ничего не надо
а вот когда мышь остановилась на ссылке и прошло 0.5 сек, тогда уже точно надо в предыдущей версии (которая рабочая, кстати, там нет этой проблемы) там в конце таблицы так: $('.tbl1 a.waitFB').hover(abc1,abc2); и после обновления таблицы ничего не надо вставлять вроде но я придумал не вставлять каждый раз 2 ф-и, а заменить на одну |
В таком случае таймер очищать можно и по ответу сервера, то есть обрабатывать нужно только заход на ... А делегирование решит остальные проблемы.
|
Цитата:
|
Точно. Хотя не мала ли задержка в таком случае, в смысле насколько это полезно?
|
Цитата:
Хотя, как он писал >> эта ссылка с ajaxGET() вызывает fancybox с инфой То вполне нормально |
Может быть, ну тогда таймер->очистка и запрос/нет по условию, то есть уход в общем то можно и не обрабатывать.
PS. То есть просто проверить по срабатываю над кем в это время находимся. |
там 300ms, этого достаточно, чтобы на "промах" мышки не реагировать.
так, вопрос: почему даже при том, что я сначала гружу аяксом таблицу, а в конце таблицы ставлю вызов set_ajax_hover_cb(), даже в этом случае всё равно не прописывается как надо... таблица то уже загружена все ссылки обозначены этот set_ajax_hover_cb() должен выставить events на уже существующие ссылки... но не выставляет :( |
Сложно ответить не видя, как вы формируете таблицу.
Проще самому просто залезть в отладчик и по шагам смотреть, что когда выполняется, Находятся ли новые ссылки. |
ну в смысле как?
сервер отдаёт строку, эта строка втыкается в <div> втыкает её jQuery через AJAX как он там её втыкает... а как отладку по шагам смотреть? |
Цитата:
Это вы должны вставить полученную строку div. Цитата:
Так же можно просмотреть все элементы, которые есть в DOM, посмотреть их стили, какие классы CSS к ним применились... Как можно без отладчика что то делать? |
Цитата:
|
вот этот success: находится в ф-и ajaxPOST(), которая одна для всех
(фиксирована) я её не создаю каждый раз заново и как туда воткнуть внутрь success что-то? success: function(data) {ajaxRESULT(data); set_ajax_hover_cb();} вот так всё работает, кстати... Тогда надо через переменную передать название ф-и и запускать её внутри... |
Цитата:
там опять же нет никакой магии. string с куском кода. Цитата:
|
Цитата:
спасибо всем за участие извините, что столько времени отнял с очевидной проблемой |
Часовой пояс GMT +3, время: 10:10. |