UPDATE The following problem occurs even after trying out the suggestions here https://stackoverflow.com/questions/18078871/hide-check-radio-button-with-css. The latest code snippet demonstrates all 3 approaches of hiding a Radio Button and breaking ↓ / ↑ (Up/Down arrow keys) keyboard navigation in the radio group in Firefox & IE.
假设我有一个单选组,每个单选按钮及其标签位于 DIV 中。一旦至少其中一个单选按钮获得焦点,我就会使用箭头键(向上/向下)浏览单选按钮。
我的无线电组中的单选按钮之一被隐藏。它位于一个 DIV 中,其中有display:none;
(但我也尝试过visibility:hidden
and position:fixed;opacity:0
作为可能的替代方案)。
我注意到,在 Chrome 中,我仍然可以使用向上/向下箭头毫无问题地遍历焦点列表,但在 Firefox 和 IE 中,当焦点应该转移到隐藏按钮上的单选按钮时,我的导航会中断。
要查看这一点,请在此代码段中执行以下操作:
1) 在 Firefox 或 IE 与 Chrome 中,首先用鼠标选择单选按钮 #1(在每列中,查看每种方法)
2) Now use the ↓ key to navigate to the end of the list: see that it breaks in Firefox and IE, but works in Chrome. The group is deselected and you lose focus in Firefox and IE.
3)你也可以按照相反的顺序从头开始尝试,同样会失败。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
<table>
<tr>
<td>
<span style="font-weight:bold;">With display:none</span>
</td>
<td>
<span style="font-weight:bold;">With visibility:hidden</span>
</td>
<td>
<span style="font-weight:bold;">With position:fixed;opacity:0;</span>
</td>
</tr>
<tr>
<td>
<div>
<input id="opt1a" type="radio" name="group" value="option1">
<label for="opt1a">Option 1</label>
</div>
<div>
<input id="opt2a" type="radio" name="group" value="option2">
<label for="opt2a">Option 2</label>
</div>
<div>
<input id="opt3a" type="radio" name="group" value="option3">
<label for="opt3a">Option 3</label>
</div>
<div style="display:none;">
<input id="optSecret" type="radio" name="group" value="optionSecret">
<label for="optSecreta">Secret Option</label>
</div>
<div>
<input id="opt5a" type="radio" name="group" value="option5">
<label for="opt5a">Option 5</label>
</div>
</td>
<td>
<div>
<input id="opt1b" type="radio" name="group2" value="option1">
<label for="opt1b">Option 1</label>
</div>
<div>
<input id="opt2b" type="radio" name="group2" value="option2">
<label for="opt2b">Option 2</label>
</div>
<div>
<input id="opt3b" type="radio" name="group2" value="option3">
<label for="opt3b">Option 3</label>
</div>
<div style="visibility:hidden;">
<input id="optSecretb" type="radio" name="group2" value="optionSecret">
<label for="optSecretb">Secret Option</label>
</div>
<div>
<input id="opt5b" type="radio" name="group2" value="option5">
<label for="opt5b">Option 5</label>
</div>
</td>
<td>
<div>
<input id="opt1c" type="radio" name="group3" value="option1">
<label for="opt1c">Option 1</label>
</div>
<div>
<input id="opt2c" type="radio" name="group3" value="option2">
<label for="opt2c">Option 2</label>
</div>
<div>
<input id="opt3c" type="radio" name="group3" value="option3">
<label for="opt3c">Option 3</label>
</div>
<div style="position:fixed;opacity:0;">
<input id="optSecretc" type="radio" name="group3" value="optionSecret">
<label for="optSecretc">Secret Option</label>
</div>
<div>
<input id="opt5c" type="radio" name="group3" value="option5">
<label for="opt5c">Option 5</label>
</div>
</td>
</tr>
</table>
Status:
-
display:none;
打破了隐藏的单选按钮的循环,但折叠了空间;
-
visibility:hidden
打破隐藏单选按钮的循环,但保留空间;
-
position:fixed;opacity:0
打破循环once(临时陷阱),但按向上/向下箭头继续后恢复。但正常的骑行仍然被打破。
我只是通过手动解决方法解决了这个问题,其中我拦截了向上/向下键并使其跳过隐藏元素。适用于所有 3 种浏览器(FF/IE/Chrome),并在必要时环绕。令人惊讶的是,需要进行黑客攻击,并且在任何地方都没有其他信息可用。
$('#container').on('keydown', 'input', function(e) {
var groupname = $(this).attr('name');
var groupindex = $('[name="' + groupname + '"]').index($(this));
var groupsize = $('[name="' + groupname + '"]').length;
// For Down Arrow, if subsequent input in group is hidden, focus the one after it (wrap around if necessary)
if (e.keyCode == 40 &&
$('[name="' + groupname + '"]').eq(groupindex + 1).length &&
$('[name="' + groupname + '"]').eq(groupindex + 1).is(':hidden'))
{
e.preventDefault();
$('[name="' + groupname + '"]').eq((groupindex + 2) % groupsize).focus();
$('[name="' + groupname + '"]').eq((groupindex + 2) % groupsize).prop('checked', true);
$('[name="' + groupname + '"]').trigger('change'); // Trigger Change Event manually for any dependencies
return false;
}
// For Up Arrow, if preceding input in group is hidden, focus and select the one before it (wrap around if necessary)
else if (e.keyCode == 38 &&
$('[name="' + groupname + '"]').eq(groupindex - 1).length &&
$('[name="' + groupname + '"]').eq(groupindex - 1).is(':hidden'))
{
e.preventDefault();
$('[name="' + groupname + '"]').eq((groupindex - 2) % groupsize).focus();
$('[name="' + groupname + '"]').eq((groupindex - 2) % groupsize).prop('checked', true);
$('[name="' + groupname + '"]').trigger('change'); // Trigger Change Event manually for any dependencies
return false;
}
return true;
});
完整演示片段
$('#container').on('keydown', 'input', function(e) {
var groupname = $(this).attr('name');
var groupindex = $('[name="' + groupname + '"]').index($(this));
var groupsize = $('[name="' + groupname + '"]').length;
// For Down Arrow, if subsequent input in group is hidden, focus the one after it (wrap around if necessary)
if (e.keyCode == 40 &&
$('[name="' + groupname + '"]').eq(groupindex + 1).length &&
$('[name="' + groupname + '"]').eq(groupindex + 1).is(':hidden'))
{
e.preventDefault();
$('[name="' + groupname + '"]').eq((groupindex + 2) % groupsize).focus();
$('[name="' + groupname + '"]').eq((groupindex + 2) % groupsize).prop('checked', true);
$('[name="' + groupname + '"]').trigger('change'); // Trigger Change Event manually for any dependencies
return false;
}
// For Up Arrow, if preceding input in group is hidden, focus and select the one before it (wrap around if necessary)
else if (e.keyCode == 38 &&
$('[name="' + groupname + '"]').eq(groupindex - 1).length &&
$('[name="' + groupname + '"]').eq(groupindex - 1).is(':hidden'))
{
e.preventDefault();
$('[name="' + groupname + '"]').eq((groupindex - 2) % groupsize).focus();
$('[name="' + groupname + '"]').eq((groupindex - 2) % groupsize).prop('checked', true);
$('[name="' + groupname + '"]').trigger('change'); // Trigger Change Event manually for any dependencies
return false;
}
return true;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
<div id="container">
<div>
<input type="radio" id="opt1" value="1" name="group">
<label for="opt1">Option 1</label>
</div>
<div>
<input type="radio" id="opt2" value="2" name="group">
<label for="opt2">Option 2</label>
</div>
<div>
<input type="radio" id="opt3" value="3" name="group">
<label for="opt3">Option 3</label>
</div>
<div style="display:none;">
<input type="radio" id="optSecret" value="secret" name="group">
<label for="optSecret">Option Secret</label>
</div>
<div>
<input type="radio" id="opt5" value="5" name="group">
<label for="opt5">Option 5</label>
</div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)