2017-04-20 53 views
3

設置:每個複選框顯示了兩次

  • 的jQuery 3.2.1
  • 語義UI 2.1

HTML(基於https://semantic-ui.com/modules/checkbox.html#/definition):

<div id="checkboxes"> 
    <div class="ui checkbox"> 
     <input type="checkbox" name="checkboxes" value="checkbox1"> 
     <label>Branch</label> 
    </div> 
    <div class="ui checkbox"> 
     <input type="checkbox" name="checkboxes" value="checkbox2"> 
     <label>Branch</label> 
    </div> 
    <div class="ui checkbox"> 
     <input type="checkbox" name="checkboxes" value="checkbox3"> 
     <label>Branch</label> 
    </div> 
    ... 
</div> 

*它們全部首先被檢查。**用戶取消選中他們想要停用的。

在我的JS文件,我用下面的函數來獲得該複選框被選中:

$('input:checkbox[name=checkboxes]:checked').each(function() { 
     // Do something with them 
    }); 

然而,每個複選框顯示了在新的狀態兩次(一次 - 選中或取消選中,一旦在原始狀態 - 全部檢查)。這使我的邏輯混淆後,使檢查標記毫無意義。

我進入了Chrome開發者工具,並在控制檯中使用了相同的選擇器。得到這個回:

input#checkbox2, input#checkbox3, input#checkbox1, input#checkbox2, input#checkbox3

(我不得不選中checkbox1

上爲什麼會出現兩次的任何想法,或者什麼,我在這裏失蹤?

+0

嘗試改變'name'屬性'複選框[]'。 – TricksfortheWeb

+0

@TricksfortheWeb'語法錯誤,不能識別的表達式:輸入:複選框[名稱=複選框[]]:checked' - 除非我誤解? – Sagar

+0

不,請將實際元素的名稱屬性更改爲複選框[],而不是jQuery選擇器。 – TricksfortheWeb

回答

0

所以,很多頭撞後,想通了這個問題。 我的答案就在這裏,爲後人:

這是使用語義/途中語義作品

原因

這些複選框是在一個模式的副產品。當語義初始化模式時,它會創建所有項目的副本,並將它們添加到DOM的末尾。

^這會導致兩個副本出現,就像我的問題一樣。

按ID搜索時,將使用具有該ID的DOM元素的最後一個副本;我所做的任何更改(檢查/取消檢查)都會發生在拷貝,而不是原件。

注意:這也適用於模態內的語義下拉。

解決方案

把你的複選框(或下拉菜單)爲div,並給它一個ID,比如我上面的原代碼。

​​

然而,代替參照他們使用inputname於引用它們使用該父div

$('#my_checkboxes').children().each(function() { 
    // do something 
}); 
1

你可以用下面的方法來獲取選中的複選框

$('#checkboxes input:checked').each(function() { 
    console.log($(this)) 
}); 
+0

這仍然打印5個元素,就像以前一樣(其中2個都去查看,然後是所有3) – Sagar

+0

檢查小提琴,它控制檯日誌僅2元 https://jsfiddle.net/v73dbjms/1/ –

+0

難道它固定你的問題? –