2012-01-30 25 views
11

Tôi hiện đang sử dụng jquery để bẫy việc gửi biểu mẫu và hiển thị cho người dùng hộp thoại xác nhận. Nếu người dùng nhấp vào có, thì biểu mẫu sẽ gửi. Nếu người dùng nhấp không, sau đó đóng hộp thoại.Hình thức bẫy Jquery gửi()

Tất cả đều hoạt động tốt nhưng đối với một vấn đề: khi người dùng nhấp vào có, điều này sau đó kích hoạt lại mã đó và hộp thoại được mở lại.

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

Tôi hiểu tại sao điều này xảy ra, chỉ cần không chắc chắn về cách tốt nhất để vượt qua nó. Tôi nhận ra rằng tôi có thể hiển thị các phương thức trên nút bấm, thay vì gửi mẫu, nhưng điều này không nhận được xung quanh vấn đề của người dùng nhấn nút enter trên bàn phím để gửi biểu mẫu.

+0

Rất thú vị! Tôi không nghĩ rằng có một cách rõ ràng xung quanh nó, mặc dù tôi hy vọng ai đó có thể chứng minh tôi sai! Bạn đã thử tích hợp chức năng 'preventDefault()' chưa? –

Trả lời

12

Bởi vì khi bạn submit hình thức, sự kiện submit gây nên một lần nữa và do đó xử lý sự kiện. Bạn cần phải unbind số submit trình xử lý sự kiện khi người dùng nói OK. Hãy thử điều này

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        //Check this line - unbinding the submit event handler 
        $("#myform").unbind('submit').submit(); 
        return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 
+0

Tuyệt vời, cảm ơn vì giải pháp.Tôi đã học được điều gì đó mới mẻ hôm nay - phương pháp unbind()! – JonoB

+0

FYI khi người dùng nhấp vào 'OK' đây là sự kiện khác so với gửi biểu mẫu, vì vậy việc trả về false không thực sự quan trọng trong trình xử lý cho nút 'OK'. –

+0

@MelStanley - Yup nhận ra sau nhưng cảm ơn. Đã xóa phần đó khỏi câu trả lời. – ShankarSangoli

5

Bạn nên trả về false khi OK:

$("#myform").submit(function (event) { 
    if (something) { 
     var $dialog = $('<div></div>').dialog({ 
      buttons: { 
       "OK": function() { 
        $dialog.dialog('close'); 
        $("#myform").submit(); 
        return false; // <=== not just return; 
       }, 
       Cancel: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     $dialog.dialog('open'); 
     event.preventDefault(); 
     return false; 
    } else { 
     $("#myform").submit(); 
    } 
}); 

Hoặc xóa hướng dẫn nộp:

buttons: { 
"OK": function() { 
    $dialog.dialog('close'); 
    //$("#myform").submit(); <-- delete it 
    return; 
}, 
0

tôi sẽ làm something hoặc là một namespaced toàn cầu, hay một giá trị từ một số đầu vào ẩn như vậy:

var something = nameSpaced.something || $('#hiddenInput').val(); //your choice 
if (something) { 
    ... 
} ... 

Logic của bạn nên làm việc bình thường sau đó.

0

Intstead sử dụng đối tượng jQuery để gửi biểu mẫu, bạn có thể sử dụng phần tử DOM mà đối tượng jQuery đề cập đến để gửi biểu mẫu. Điều này bỏ qua trình xử lý sự kiện jQuery. Hàm OK của bạn sẽ trông giống như sau:

"OK": function() { 
    $dialog.dialog('close'); 
    $("#myform").get(0).submit(); // use the underlying DOM element to sumbit 
    return false; 
}, 
Các vấn đề liên quan