JQuery избежать нескольких запросов предотвращать - PullRequest
0 голосов
/ 12 января 2012

Мне нужен способ предотвратить многократные отправки:

$("#myDiv").click(function(e) {
    e.preventDefault();
    console.log('open');

    // submit the form    
    $('#myDiv #myInput').click(function(e){
        e.preventDefault();
        /* ajax call here */
        console.log('clicked');
    });

});

Так что, если при нажатии #myDiv отправляет X раз, нажмите на дочернюю функцию.

например.если вы нажмете 3 раза #myDiv, а затем нажмите #myInput отправит 3 раза форму, а если вы нажмете еще раз, отправит 6.

Есть идеи, как это исправить?

1 Ответ

2 голосов
/ 12 января 2012

Похоже, что вы привязываете обработчик событий клика несколько раз для $('#myDiv #myInput') ..

. Вы должны либо переместить $('#myDiv #myInput').click(function(e){ за пределы обработчика клика $("#myDiv").click(function(e) {, либо использовать .one(.Обратите внимание, что в обоих случаях поведение отличается.

Также использовать следует использовать event.stopPropagation (); , чтобы остановить всплывающее окно события.

Попробуйте следующий код согласно вашему требованию.Приведенные ниже пункты 1. и 2. работают по-разному, поэтому, пожалуйста, поймите код и реализуйте его согласно вашему требованию.

  1. Перемещение события #myInput click вне

    $("#myDiv").click(function(e) {
    e.preventDefault();
    e.stopPropagation();
    console.log('open');
    });
    
    // submit the form    
    $('#myDiv #myInput').click(function(e){
       e.preventDefault();
       e.stopPropagation();
       /* ajax call here */
       console.log('clicked');
     });
    
  2. Обратите внимание, что обработчик щелчка для #myInput будет выполнен один раз.

    $("#myDiv").click(function(e) {
       e.preventDefault();
       e.stopPropagation();
       console.log('open');
    
       // submit the form    
       $('#myDiv #myInput').one(function(e){
        e.preventDefault();
        e.stopPropagation();
        /* ajax call here */
        console.log('clicked');
       });
    });
    
...