我有一個包含一行的表。該行有一個TD(帶有一個複選框),在TD上我有一個點擊功能。因此,當點擊TD時,複選框將被選中/取消選中。knockoutjs複選框,然後單擊父項td
當我點擊了TD,但該複選框,當點擊複選框的(視覺)值不會更改(它沒有得到選中/取消)
的通緝的情況是它工作正常:
當我點擊複選框的複選框的變化(視覺)值,我可以調用一個函數(例如,使一個AJAX調用)
當我點擊了TD的(可視化)複選框的值發生變化,我可以調用一個功能。 (例如進行AJAX呼叫)
我們該如何做到這一點?
我有一個包含一行的表。該行有一個TD(帶有一個複選框),在TD上我有一個點擊功能。因此,當點擊TD時,複選框將被選中/取消選中。knockoutjs複選框,然後單擊父項td
當我點擊了TD,但該複選框,當點擊複選框的(視覺)值不會更改(它沒有得到選中/取消)
的通緝的情況是它工作正常:
當我點擊複選框的複選框的變化(視覺)值,我可以調用一個函數(例如,使一個AJAX調用)
當我點擊了TD的(可視化)複選框的值發生變化,我可以調用一個功能。 (例如進行AJAX呼叫)
我們該如何做到這一點?
爲了避免click事件的問題,使用label
元素做出更大的區域點擊。在這裏,我製作的標籤塊元素所以它佔據了整個td
:
<td>
<label style="display: block">
<input type="checkbox" data-bind="checked: checkBox" />
</label>
</td>
Td的事件似乎是壓倒一切的,輸入的檢查點擊事件
的問題是,對於TD
火災單擊處理也當您單擊checkbox
,這意味着checkbox
被雙方默認的點擊處理程序改變checkbox
和您的自定義點擊處理程序TD
(它們相互抵消)。解決方案是防止點擊checkbox
冒泡到TD
。您可以使用此綁定在Knockout中執行此操作:click:function(){return true}, clickBubble:false
。
這是在行動:http://jsfiddle.net/mbest/Eatdh/12/
我認爲,然而,使用label
是一個更好的方法(見我的其他答案)。
我更喜歡這個,因爲它可以防止額外的HTML混亂。 – Tyrsius
'label'可能是問題中場景的更好方法,但這正是我需要的解決方案,因爲我的點擊處理程序在整個'tr'上。 –
這是不是很乾燥,而且其快速和功能:fiddle
<td data-bind="click:tdClick">
<input type="checkbox" data-bind="checked: checkBox, click:tdClick" />
</td>
下面是另一種方法,也可以工作:將複選框上的數據綁定更改爲'checked:checkBox,click:function(){return true;},clickBubble:false'。在你的複選框被檢查然後取消選中,然後在你點擊它時再次檢查。 –
@MichaelBest我認爲這是迄今爲止最好的解決方案。爲什麼不把它作爲答案? – Tyrsius
沒錯。我會將其添加到我的答案中。 –
謝謝!這是訣竅。我已經通過添加點擊功能進行了一些編輯。 [http://jsfiddle.net/LsxSh/4/](http://jsfiddle.net/LsxSh/4/) – Blottt