2016-07-13 6 views
2

Lost «нажмите» событие во время AJAX обновления

$(":input").on("change", function(e) { 
 
    console.log("change triggered"); 
 
\t $("#section").html("<button id='order'>Order</button>"); 
 
    registerButtons(); 
 
}); 
 

 
function registerButtons() { 
 
    $("#order").on("click", function(e) { 
 
    \t console.log("click triggered"); 
 
    \t alert("Hello World"); 
 
    }); 
 
    $("#order").on("mousedown mouseup", function(e) { 
 
    \t console.log(e.type + " triggered"); 
 
    }); 
 
} 
 

 
registerButtons();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" value="123"/> 
 
<div id="section"> 
 
    <button id="order">Order</button> 
 
</div>

У меня есть веб-страницу с кнопкой и некоторых полей ввода.

  • На кнопке нажмите событие зарегистрировано
  • На полях ввода изменение событие зарегистрировано

OnChange будет инициировать вызов сервера AJAX, и результат заменит часть веб-страницы - включая кнопку. После обработки результата AJAX все слушатели регистрируются снова.

Теперь проблема. Пользователь меняет значение поля ввода и нажимает кнопку непосредственно, но для замедления (позволяет предположить, что пользователю требуется 500 мс для клика), так что происходит событие onChange, и страница обновляется/заменяется. Теперь «старая» кнопка запускает onMouseDown, а кнопка «новый» запускает onMouseUp событие - но нет onClick.

Мой текущий обходной путь есть, чтобы зарегистрировать два MouseDown/MouseUp событий, получить временную метку мыши вниз, и если мышь вверх приходит в 2 секунды, делать то, что должно быть сделано OnClick , Невозможно удалить часть кнопки из ответа AJAX - в худшем случае кнопка может быть удалена и заменена информацией пользователя.

Надеюсь, что есть лучшее решение ... любые идеи?

+1

Отключить кнопку на клике (возможно, отображать анимацию загрузки). Таким образом, пользователь может только щелкнуть по нему снова после его замены через ajax – empiric

+0

Проблема в том, что события запускаются параллельно (** onChange ** + ** onMouseDown **), но пользователь не достаточно быстро - или перезагрузка сервера/страницы для быстрого доступа. –

+0

О, блин, я неправильно понял это. Поэтому, когда onchange запускает вызов ajax, отключите кнопку с этим событием. Таким образом, у пользователя нет возможности щелкнуть по кнопке, пока содержимое заменяется. – empiric

ответ

0

Вы можете воспользоваться возможностью делегирования событий и установить ваш слушатель на контейнере вместо кнопки.

Вы добавляете прослушиватель кликов к своей старой кнопке и добавляете новую кнопку в дом. Таким образом, клик не будет работать.

Кнопка не работала, потому что по какой-то причине она не может сфокусироваться, когда вы наводите на нее курсор. Поэтому я добавил метод getFocus, и теперь он должен работать.

$("input").on("change", function(e) { 
 

 
    console.log("change triggered"); 
 

 
    $("#section").html("<button id='order'>Order</button>"); 
 

 
}); 
 

 

 
function registerButtons() { 
 
    
 
    $('#section').on("mouseup", '#order', function(e) { 
 
     
 
     alert('Clicked!'); 
 
}); 
 

 
} 
 

 
registerButtons();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" value="123"/> 
 
<div id="section"> 
 
    <button id="order">Order</button> 
 
</div>

Я только что узнал, что JQuery обеспечивает сладкий API, который может использоваться для делегирования событий. Таким образом, нам не нужно вручную проверять цель события. Проверьте это http://api.jquery.com/on/

$("input").on("change", function(e) { 
    console.log("change triggered"); 
    $("#section").html("<button id='order'>Order</button>"); 
}); 


    function registerButtons() { 
     $("#section").on("click", '#order', function(e) { 
      console.log("click triggered"); 
      alert("Hello World"); 
    }); 

    $("#section").on('mouseover','#order', function(e){ 
      $(this).focus(); 
    }); 
} 

registerButtons(); 
+0

Идея выглядит хорошо. Если вы просто замените это в моем коротком примере, вы увидите, что это будет работать не так, как ожидалось. Событие «click» не будет запущено. –

+0

@MichaelS. см. обновленный ответ. –

+0

С технической точки зрения это будет решение, но это решение просто устраняет проблему, что два события запускаются параллельно. С помощью мыши над изменением фокуса сразу будет запущено событие ** onChange **, а затем ** onClick ** уже не проблема. Но, как сказано, технически это нормально, из удобства использования это не решение - если пользователь просто перемещает указатель мыши из текстового поля (ничего не накладывается на вставленные буквы), а в качестве «ошибки» пользователь перемещает указатель на кнопка заказа - текстовое поле потеряет фокус. –