2012-04-30 3 views
1

Этот код должен очищать флажки, когда я нажимаю кнопку. Он работает, если я удаляю теги <form></form>, но я думал, что .find() должен был найти всех потомков?jquery .find() не работает

<script type="text/javascript"> 
$(document).ready(function(){ 

     var clearCheckboxes = function() {  
     $('.outerbox').find('input').each(function() { 
      $(this).attr('checked', false); 
     }); 
     } 

     $('input.myButton').click(clearCheckboxes); 
}); 
</script> 

<div class="outerbox">  
    <form> 
    <input type="checkbox" checked="" /> checkbox1 
    <input type="checkbox" checked="" /> checkbox2 
    </form>  
</div> 
<input class="myButton" value="clear checkboxes now" type="button"/> 
+3

Попробуйте использовать .prop вместо .attr – kinakuta

+2

Это, по-видимому, работает хорошо - http://jsfiddle.net/gYHKA/ –

+1

работает для меня: HTTP: // jsfiddle .net/CgsEu/ –

ответ

2

Этот код прекрасно работает для меня: http://jsfiddle.net/CgsEu/

Во всяком случае, если вы используете последнюю версию JQuery, попробуйте изменить .attr к .prop. Также .each не нужен. .attr и .prop работают со всеми элементами в объекте jQuery.

var clearCheckboxes = function() {  
    $('.outerbox').find('input').prop('checked', false) 
} 

DEMO: http://jsfiddle.net/CgsEu/1/

Если есть другие входы, попробуйте ограничивая .find для всего флажков.

var clearCheckboxes = function() {  
    $('.outerbox').find('input:checkbox').prop('checked', false) 
} 

ДЕМО: http://jsfiddle.net/CgsEu/2/

+1

Это работает и намного опрятно, спасибо! Я думаю, что это не сработало, потому что я пытался отправить форму одновременно:/ – JYX

+0

Хотя во вторых соображениях, которые не объясняют, почему это сработало, когда флажки были детьми (1 уровень вниз), но перестали работать всякий раз, когда я добавил любой промежуточный слой ..... любые идеи были бы очень желанными, но если нет, о, хорошо! – JYX

+0

@ user1199713: Представление '

' может происходить до того, как ваш код будет выполнен. Если вы покажете нам свой * настоящий * код, мы можем вам помочь. Вам просто нужно добавить 'e.preventDefault()' к вашему обработчику, чтобы исправить это. –

1

Там нет необходимости использовать каждый(), у вас уже есть коллекция элементов и может применить изменения ко всем из них, например, так:

var clearCheckboxes = function() {  
    $('input', '.outerbox').attr('checked', false); 
} 

$('input.myButton').click(clearCheckboxes); 

FIDDLE

Там есть много предложений по использованию prop() над attr(), и это, вероятно, разумный совет.

В соответствии со спецификацией W3C форм, проверяемый атрибутом является логическим атрибутом, который означает, что соответствующее свойство является истинным, если атрибут присутствует на всех, даже если, например, атрибут не имеет значения или пустым строковым значением. Предпочтительным кросс-браузер, совместимый способ, чтобы определить, если флажок установлен в , чтобы проверить наличие «truthy» значение на имущество элемента с использованием одного из следующих действий :

, если (elem.checked)

если ($ (эль) .prop ("проверено"))

если ($ (эль). (": проверено"))

Для поддержания обратной совместимости, метода .attr() в jQuery 1.6.1+ получит и обновит свойство для вас, поэтому код для атрибутов boolean требуется изменить на .prop(). Тем не менее, предпочтительным способом получения проверенного значения является prop().

1
$(document).ready(function(){ 
    var clearCheckboxes = function() {  
     $('.outerbox').find('input[type="checkbox"]').each(function(){ 
      $(this).prop('checked', false); 
     }); 
    } 

    $('input.myButton').click(clearCheckboxes); 
});​ 

DEMO.

Обновление:

$('.outerbox').find('input[type="checkbox"]').prop('checked', false); 

или

$('.outerbox input:checkbox').prop('checked', false); 

DEMO.

0

Использование опоры, например,

$(this).prop('checked', false); 

вместо этого, если attr

0
var clearCheckboxes = function() {  
    $('input[type="checkbox"]', '.outerbox').prop('checked', false); 
} 

$('input.myButton').click(clearCheckboxes); 
Смежные вопросы