簡體   English   中英

Javascript:單擊包裝元素但不是子元素

[英]Javascript: Clicking a wrapper element but not a child element

我正在寫一些javascript(jQuery),它允許一個div包圍一個復選框,當點擊時,將切換復選框元素。 但是,我遇到的問題是,當你點擊復選框時,它不起作用,因為它被切換兩次(至少我認為這是發生了什么)。

這是一個演示。

這是代碼:

$('.checkbox-wrapper').click(function(){
    var $checkbox = $(this).find('input[type="checkbox"]');
    if ($checkbox.is(':checked')) {
        $checkbox.attr('checked', false);
    } else {
        $checkbox.attr('checked', true);
    }
});

如何才能使其單擊復選框正常工作,但如果單擊周圍區域,它會切換復選框?

解:

感謝jAndy的評論,通過檢查event.target屬性來說明如何做到這一點:

$('.checkbox-wrapper').click(function(e){
    if( e.target.nodeName === 'INPUT' ) {
        e.stopPropagation();
        return;
    }

    var $checkbox = $(this).find('input[type="checkbox"]');
    if ($checkbox.is(':checked')) {
        $checkbox.attr('checked', false);
    } else {
        $checkbox.attr('checked', true);
    }
});

正如其他人所指出的那樣,這可能不是最好的例子,因為你通過使用label標簽而不是div標簽包裝復選框來獲得相同的功能(不需要javascript)。 演示

檢查event.target屬性。

target屬性可以是為事件注冊的元素或其后代。 event.targetthis進行比較通常很有用,以確定是否由於事件冒泡而處理了事件。

試試這個

$('.checkbox-wrapper').click(function(e){
   if(!$(e.target).is(":checkbox")){
     var $checkbox = $(this).find('input[type="checkbox"]');
     if ($checkbox.is(':checked')) {
         $checkbox.attr('checked', false);
     } else {
         $checkbox.attr('checked', true);
     }
   }
});

嘗試在其周圍包裹<label>

聽起來你並沒有阻止事件冒泡到父元素

如何在復選框單擊時停止事件冒泡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM