2012-01-04 30 views
13

Tôi có 2 tập lệnh jQuery - một tệp trước khi tôi thêm .preventDefault và một bản sao của cùng một tập lệnh sau khi tôi thêm tệp .preventDefault. jQuery làm việc trong ban đầu, nhưng không phải sau khi tôi thêm .preventDefault()jQuery .preventDefault();

kịch bản ban đầu mà làm việc

$(window).load(function(){ 
     $(document).ready(function(){ 
     $("span[id$='_ff5_1']").each(function() { //returns a collection of elements that must be iterated through using each 
      if ($(this).text() == "Yes") { //test value returned from non-input field 
       clearID(); 
       $("tr.anon").hide(); 
      } else { 
       $("tr.anon").show(); 
      } 
     }); 
     if ($("select[title='action']").val() == "") { 
      $("tr.actDet").hide();  
     } 
     $("select[title='organizationalElement']").focusout(function() {   
      if ($(this).val() === "I don\'t know") {    
      alert("If no organizational element is selected, additional time may be required to route this request");   
      } // close if  
      $("select[title='action']").change(function(){   
       $(".actDet").toggle($(this).val()!= "");  
      }); // close action.change 
     });//close select.focusout 
     }); // close doc.ready 
    }); // close window.load 

Script đó không làm việc ...

$(window).load(function(){ 
    $(document).ready(function(){ 
    $("span[id$='_ff5_1']").each(function() { //returns a collection of elements that must be iterated through using each 
     if ($(this).text() == "Yes") { //test value returned from non-input field 
      clearID(); 
      $("tr.anon").hide(); 
     } else { 
      $("tr.anon").show(); 
     } 
    }); 
    if ($("select[title='action']").val() == "") { 
     $("tr.actDet").hide();  
    } 
    $("select[title='organizationalElement']").focusout(function() {   
     if ($(this).val() !== "I don\'t know") { 
     $(this).preventDefault(); 
     } else {    
     alert("If no organizational element is selected, additional time may be required to route this request");   
     } // close if  
     $("select[title='action']").change(function(){   
      $(".actDet").toggle($(this).val()!= "");  
     }); // close action.change 
    });//close select.focusout-- close edit record stuff 
    }); // close doc.ready 
}); // close window.load 

Sự thay đổi duy nhất tôi làm là câu lệnh if ban đầu sẽ trở thành if/else gọi là .preventDefault(). Tập lệnh đầu tiên hoạt động rất tốt, nhưng tập lệnh thứ hai không thành công. Tại sao? Tôi đang gọi phương thức .preventDefault() nếu giá trị của organizationElement là idk trên một bản ghi hiện có.

@ Andrew: Để làm rõ về chỉnh sửa của bạn ... Tôi có nên sửa lại kịch bản của tôi để: ...

if ($(this).val() !== "I don\'t know") { 
    $(this).click(function(e) { e.preventDefault(); }); 
    } else {    
    alert("If no organizational element is selected, additional time may be required to route this request");   
    } // close if 

... b/c tôi ghi nhận taht nó sẽ làm việc một cách chính xác nếu tôi thay đổi $ (this) .preventDefault(); tới e.preventDefault();

Có phải bạn đang cố gắng thể hiện cách viết nó nếu tôi muốn đính kèm phương thức vào đối tượng $ (this) này như tôi đã viết ban đầu?

Trả lời

31

Bạn muốn gọi preventDefault trên đối tượng sự kiện, không this

$("select[title='organizationalElement']").focusout(function(e) {   
    if ($(this).val() !== "I don\'t know") { 
    e.preventDefault(); 
    } 
}); 

Chỉ cần cho đầy đủ, lưu ý rằng preventDefault ngăn chặn các hành động mặc định này yếu tố-điều hướng trang để giá trị của thuộc tính href cho một neo, ví dụ (tôi không chắc chắn hành động mặc định là gì cho tập trung của một lựa chọn, hoặc nếu có ngay cả một). preventDefaultkhông ngăn ngừa bong bóng.

Nếu bạn tình cờ quan tâm đến bong bóng — và tôi không nói rằng bạn nhất thiết phải - trả về false từ trình xử lý sự kiện jQuery cả hai sẽ ngăn chặn hành động mặc định và cũng ngăn chặn bong bóng.

+0

Cảm ơn Adam.Tôi biết rằng ngăn chặnDefault không ngăn chặn sự kiện từ sủi bọt, tuy nhiên tôi không chắc chắn rằng tôi không muốn bong bóng. Có lẽ đó là những gì đã ngăn chặn toàn bộ kịch bản jQuery hoạt động? – jg100309

+2

@ jg100309 - không, vấn đề ban đầu của bạn là bạn đang gọi preventDefault về điều này, thay vì đối tượng sự kiện. Chuyển đối tượng sự kiện tới trình xử lý của bạn và gọi chặnDefault on * it *, như trong câu trả lời của tôi –

+1

* Side Note: Bạn không phải thoát ký tự ''' nếu nó nằm giữa hai '' 's. * – SeinopSys

8

Chức năng preventDefault() được liên kết với sự kiện. Những gì bạn nên được gọi là:

e.preventDefault(); 

chỉnh sửa để làm rõ dựa trên nhận xét của bạn, bạn cần phải thêm e như là một biến trong cuộc gọi chức năng:

$('selector').click(function(e) { e.preventDefault(); }); 

Bạn có thể đọc thêm về ở trên trang jQuery preventDefault.

+0

OK, vì vậy nó sẽ luôn luôn là e.preventDefault(); – jg100309

4

Phương thức preventDefault nên được áp dụng cho đối tượng sự kiện, không áp dụng cho đối tượng DOM khi bạn đang thực hiện.

Mã của bạn nên là:

$("select[title='organizationalElement']").focusout(function(e) {   
     if ($(this).val() !== "I don\'t know") { 
     e.preventDefault(); 
     } else {    
     alert("If no organizational element is selected, additional time may be required to route this request");   
     } // close if  
     $("select[title='action']").change(function(){   
      $(".actDet").toggle($(this).val()!= "");  
     }); // close action.change 
    });//close select.focusout-- close edit record stuff 

Hãy cho tôi biết nếu điều đó giúp!

Các vấn đề liên quan