Javascript html容器中的陷阱焦点
我正在建立一个可访问的网站,并试图管理焦点。我需要打开一个模态,然后将焦点放在模态中的第一个元素上,然后捕获焦点,直到模态关闭(“取消”或“接受”) HTMLJavascript html容器中的陷阱焦点,javascript,angularjs,angularjs-directive,angularjs-scope,focus,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Focus,我正在建立一个可访问的网站,并试图管理焦点。我需要打开一个模态,然后将焦点放在模态中的第一个元素上,然后捕获焦点,直到模态关闭(“取消”或“接受”) HTML 有一个名为ngBlur的指令,当元素失去焦点时触发事件。尝试在ng blur上执行聚焦功能 在这里: 例如: 您永远无法选择第二个输入框,因为ng blur语句有多种可能捕捉焦点 一种解决方案是在显示模态时,在模态背景中的所有元素上手动临时设置tabindex=“-1”(并删除此tabindex,或在离开模态时恢复为原始tabinde
有一个名为ngBlur的指令,当元素失去焦点时触发事件。尝试在ng blur上执行聚焦功能 在这里: 例如:
您永远无法选择第二个输入框,因为ng blur语句有多种可能捕捉焦点 一种解决方案是在显示模态时,在模态背景中的所有元素上手动临时设置
tabindex=“-1”
(并删除此tabindex,或在离开模态时恢复为原始tabindex)
另一个解决方案是查看angular bootstrap计划如何解决此问题:
你也可以看看WAI ARIA页面,他们有一个相关的内容:好的,经过太多的搜索,这就是我想到的。基本上,我在模态的最后一个元素和模态后面的下一个元素上创建了ng焦点函数。这样,我可以检查焦点是否存在于模态中,如果不存在,我会将焦点循环回顶部
<a href="" ng-click="modalshow = !modalshow; modal.open();">Open Modal</a>
<div ng-show="modalshow" id="modal">
<h3 id="tofs" >Terms of Service</h3>
<p>Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum </p>
<a href="" ng-focus="modalshow.onFocus($event)">Cancel</a>
<a href="" ng-focus="modalshow.onFocus($event)">Accept</a>
</div>
<h2>Seprate Content</h2>
<a href="" ng-focus="modalshow.onFocus($event)">next link<a>
当模态可见时,您可以添加此代码以将所有焦点事件捕获到h3标记。不要使用任何要求您查找“tabbable”元素的解决方案。相反,使用
keydown
并在有效庄园中单击事件或背景
您需要做的是有一个常规的窗口。使用preventDefault()
的keydown
事件在显示模式时停止所有选项卡,使用stopPropagation()
的keydown.tab
事件处理模式的选项卡
您可以在类似的庄园中使用单击
事件,也可以使用背景来防止单击其后面的元素
对于Angular1,我想这看起来与Asheesh Kumar的答案类似。您可以在此处看到我的Angular2-x解决方案:ng如果事件包括模糊的方向,则模糊将起作用。例如,在模式/对话框中向下移动页面流,而不是进行备份。由于模式/对话框中可能有多个元素,因此不能仅根据元素的模糊程度将焦点发送到开头。
angular.module('app')
.controller('Controller', modalCtrl);
function modalCtrl() {
$scope.modal = {
open: function() {
angular.element('#tofs').focus();
}
}
}
<a href="" ng-click="modalshow = !modalshow; modal.open();">Open Modal</a>
<div ng-show="modalshow" id="modal">
<h3 id="tofs" >Terms of Service</h3>
<p>Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum </p>
<a href="" ng-focus="modalshow.onFocus($event)">Cancel</a>
<a href="" ng-focus="modalshow.onFocus($event)">Accept</a>
</div>
<h2>Seprate Content</h2>
<a href="" ng-focus="modalshow.onFocus($event)">next link<a>
angular.module('app')
.controller('Controller', modalCtrl);
function modalCtrl() {
$scope.modal = {
open: function() {
angular.element('#tofs').focus();
},
onFocus: function(){
var modal = angular.element('#modal')[0];
if (!modal.contains( event.target ) && $scope.modalIsOpen) {
event.stopPropagation();
angular.element('#tofs').focus();
}
}
}
}
angular.element("html").on("focusin", "body", function (event) {
if(angular.element("#modal:visible").length>0){
event.preventDefault();
event.stopPropagation();
angular.element('#tofs').focus();
}
});