我需要在弹出窗口(模态)对话框中打开Google最新的reCAPTCHA小部件,在我的情况下使用Dojo Dialog,并且我的工作正常,但我只是意识到用户无法使用键盘导航到它。
当reCAPTCHA小部件显示在主视图中而不是模式对话框时,用户当然可以轻松地将键盘导航到它。
有没有人找到一种方法来专注于reCAPTCHA小部件,以便当reCAPTCHA位于Dojo对话框中时,用户无需鼠标即可访问它?
我确实看到reCAPTCHA是在<iframe>
内生成的。这是障碍的一部分 - 键盘导航无法覆盖iframe中的内容吗?我甚至试图调用document.getElementById(&#34; recaptcha-anchor&#34;),因为我看到<span>
的ID包含&#34;复选框& #34; - 但是返回null。如何在iframe中找到元素?
我有一个jsfiddle示例可用于演示
https://jsfiddle.net/gregorco/xqs8w5pm/5/
<script>
var onloadCaptchaCallback = function() {
console.log("jsfiddle: rendering captcha");
globalRecaptchaWidgetId = grecaptcha.render('captchaDiv', {
'sitekey' : '6LcgSAMTAAAAACc2C7rc6HB9ZmEX4SyB0bbAJvTG',
'callback' : verifyCaptchaCallback,
'tabindex' : 2
});
grecaptcha.reset();
}
var verifyCaptchaCallback = function(g_recaptcha_response) {
console.log("Response validated. Not a robot.");
};
</script>
<script src='https://www.google.com/recaptcha/api.js?onload=onloadCaptchaCallback&render=explicit' async defer></script>
<div id="testDiv">
<button type="dojo/form/Button" onClick="captchaPopup.show();">Open reCAPTCHA</button>
</div>
<div data-dojo-type="dijit/Dialog" data-dojo-id="captchaPopup" title="Human Verification" style="width:350px;">
Cannot keyboard navigate to the checkbox!
<table>
<tr>
<td>
<div id="captchaDiv"></div><br/>
</td>
</tr>
</table>
</div>
答案 0 :(得分:1)
试试这个fiddle。通常,Dijit对话框在iframe中的效果不佳,因为它不知道如何解析iframe中的内容。在这种情况下,我们可以使用Dojo的一些函数来解决它。值得注意的一点是,我已经禁用了Dijit对话框的autofocus
,因此它不会自动将closeNode聚焦在对话框中。
加载对话框后,选项卡&gt;空格将选择验证码。
答案 1 :(得分:0)
这可能会帮助其他面临类似问题的人,但使用Bootstrap模态对话框。我在GitHub上找到了以下解决方案。添加以下Javascript以覆盖Bootstrap:
Bootstrap 3x
$.fn.modal.Constructor.prototype.enforceFocus = function () { };
Bootstrap 4x
$.fn.modal.Constructor.prototype._enforceFocus = function () { };