2012-01-04 2 views
13

У меня есть 2 сценария jQuery - один, прежде чем я добавил .preventDefault и копию того же скрипта после добавления .preventDefault. JQuery работает в начальной, но не после того, как я добавить .preventDefault()jQuery .preventDefault();

Первоначальный сценарий, который работает

$(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 

скрипт, который не работает ...

$(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 

Единственное изменение, которое я сделал является исходным оператором if, который становится if/else, который вызывает .preventDefault(). Первый скрипт отлично работает, но второй скрипт терпит неудачу. Зачем? Я вызываю метод .preventDefault(), если значение элемента организации равно idk в ​​существующей записи.

: @ Андрей Чтобы уточнить на вашем редактировать ... Должен ли я пересмотреть мой сценарий: ...

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 

... б/с я отметил TAHT он будет работать правильно, если я меняю $ (это) .preventDefault(); e.preventDefault();

Возможно, вы пытаетесь показать, как записать его, если я хочу приложить метод к объекту $ (this), как я его изначально написал?

ответ

31

Вы хотите вызвать preventDefault на объект события, не this

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

Просто для полноты картины, отметим, что preventDefault предотвращает действие по умолчанию этого элемента-навигации страницы к значению атрибут href для привязки, например (я не уверен, что действие по умолчанию для фокуса выбора, или даже там). preventDefaultне предотвратить пузыри.

Если вам небезразлично пузыриться, и я не говорю, что вы обязательно должны возвращать false из обработчика события jQuery, оба будут препятствовать действию по умолчанию, а также предотвращать барботирование.

+0

Спасибо Адаму.Я знаю, что preventDefault не останавливает событие от пузырьков, однако я не уверен, что я не хочу пузыриться. Возможно, это остановило работу всего сценария jQuery? – jg100309

+2

@ jg100309 - нет, ваша первоначальная проблема заключалась в том, что вы вызывали preventDefault для этого вместо объекта события. Передайте объект события вашему обработчику и вызовите preventDefault на * it *, как в моем ответе –

+1

* Примечание стороны: вам не нужно скрывать символ '' ', если он находится между двумя символами' '' s. * – SeinopSys

8

Функция preventDefault() связана с событием. То, что вы должны называть это:

e.preventDefault(); 

редактировать, чтобы выяснить, основываясь на ваш комментарий, вам нужно добавить e в качестве переменной в вызове функции:

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

Вы можете прочитать больше о в на странице jQuery preventDefault.

+0

Хорошо, поэтому он ВСЕГДА будет e.preventDefault(); – jg100309

4

Метод preventDefault должен применяться к объекту события, а не к объекту DOM, как вы это делаете.

Ваш код должен быть:

$("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 

Позвольте мне знать, если это помогает!

Смежные вопросы