Javascript:firefox 中复选框 + 标签 + preventDefault 的问题
Javascript: Problems in firefox with checkbox + label + preventDefault
我有两个隐藏的复选框,每个都链接到一个标签(每个标签的颜色反映链接的复选框的状态 -- css)。我这样做是出于样式原因;使用纯复选框不会造成问题,顺便说一句。
现在背后有一些逻辑:
1. 只有checkbox B被选中,checkbox A才能被选中;拒绝是通过在 onlick (~preventDefault)
中使用 return 语句完成的
2.这样,如果B正在取消选中,但A被选中,则A将自动取消选中(并且不能再次选中,直到再次选中B)
3.勾选B时,A会自动勾选(但只要B保持勾选状态,可以手动再次取消勾选)
它工作得很好,除了一件事:
1.进入页面(A和B默认不勾选)
2.现在点击A:action会被正确拒绝,因为B没有勾选
3. 现在单击 B:实际上 A 现在也应该被选中,但是提示 'disabled' 而 A 仍未选中 -- 错误
如果您跳过第 2 步,就没有问题。
使用实际的 event.preventDefault 命令不会改变任何东西。
似乎在 Chrome 中工作正常。
<input type="checkbox" id="checkA" unchecked />
<label for="checkA" id="checkALabel" onclick="{
const $ = x => document.getElementById(x);
// Reject if user tries to check checkA although checkB is false
if (!$('checkA').checked && !$('checkB').checked) {
alert('rejected');
return false;
}
return true;
}">[check a]</label>
<input type="checkbox" id="checkB" onchange="{
const $ = x => document.getElementById(x);
// If [checkB is true but checkA not checked] then check checkA
// or if [checkB is false and checkA checked] then uncheck checkA
if ($('checkA').checked ^ $('checkB').checked) {
$('checkALabel').click();
if (!$('checkA').checked) {
alert('disabled')
}
}
}" unchecked />
<label for="checkB">[check b]</label>
如果您将 $('checkALabel').click();
替换为 $('checkA').click();
那么它也可以在 Firefox 中使用。
Firefox 似乎阻止了标签上的程序化 .click
调用选中关联的复选框。
我有两个隐藏的复选框,每个都链接到一个标签(每个标签的颜色反映链接的复选框的状态 -- css)。我这样做是出于样式原因;使用纯复选框不会造成问题,顺便说一句。
现在背后有一些逻辑:
1. 只有checkbox B被选中,checkbox A才能被选中;拒绝是通过在 onlick (~preventDefault)
中使用 return 语句完成的
2.这样,如果B正在取消选中,但A被选中,则A将自动取消选中(并且不能再次选中,直到再次选中B)
3.勾选B时,A会自动勾选(但只要B保持勾选状态,可以手动再次取消勾选)
它工作得很好,除了一件事:
1.进入页面(A和B默认不勾选)
2.现在点击A:action会被正确拒绝,因为B没有勾选
3. 现在单击 B:实际上 A 现在也应该被选中,但是提示 'disabled' 而 A 仍未选中 -- 错误
如果您跳过第 2 步,就没有问题。
使用实际的 event.preventDefault 命令不会改变任何东西。
似乎在 Chrome 中工作正常。
<input type="checkbox" id="checkA" unchecked />
<label for="checkA" id="checkALabel" onclick="{
const $ = x => document.getElementById(x);
// Reject if user tries to check checkA although checkB is false
if (!$('checkA').checked && !$('checkB').checked) {
alert('rejected');
return false;
}
return true;
}">[check a]</label>
<input type="checkbox" id="checkB" onchange="{
const $ = x => document.getElementById(x);
// If [checkB is true but checkA not checked] then check checkA
// or if [checkB is false and checkA checked] then uncheck checkA
if ($('checkA').checked ^ $('checkB').checked) {
$('checkALabel').click();
if (!$('checkA').checked) {
alert('disabled')
}
}
}" unchecked />
<label for="checkB">[check b]</label>
如果您将 $('checkALabel').click();
替换为 $('checkA').click();
那么它也可以在 Firefox 中使用。
Firefox 似乎阻止了标签上的程序化 .click
调用选中关联的复选框。