我创建了一个自定义指令来解决应用程序中一些与焦点相关的问题。
指令代码:
(function() {
angular.module("FocusNextModule", []).directive("focusNext", function() {
return {
restrict: "A",
link: function($scope, elem, attrs) {
elem.bind("focus", function(e) {
var code = e.which || e.keyCode;
var nextElem = document.getElementById(attrs.focusNext);
if (nextElem === null || nextElem === undefined) {
var altElem = document.getElementById(attrs.focusNextAlt);
if (angular.element(altElem).hasClass('ng-hide') === false) {
altElem.focus();
} else {
var selfElem = document.getElementById(attrs.focusSelf);
selfElem.focus();
}
e.preventDefault();
} else {
nextElem.focus();
e.preventDefault();
}
});
}
};
});
})();
如何在模板中使用in template
<md-button id="idOfElementC">MyButton</md-button>
<div tabindex="0" focus-next="idOfElementA" focus-next-alt="idOfElementB" focus-self="idOfElementC"></div>
注:
id为“idOfElementC”的元素将刚好位于使用focus next指令的div之上。
指令是如何工作的?
当我们用“idOfElementC”id(此处按钮)在元素上按tab键时,focus将使用focus next指令转到div。div将使用以下情况将焦点重定向到其他元素:
a)首先它将检查是否有任何id为“idOfElementA”的元素。如果元素存在,则该元素将接收焦点。
b)如果ID“IDFoelEntA”元素不存在,则“IdoFelEngB”将接收焦点。
c)如果ID“IDFoelEntB”元素也不存在,那么最终“IdoFeleMeta”(在哪个标签被按下)将接收焦点。
该指令运行良好,解决了我所有的问题。但是,我需要为这个指令编写jasmine测试用例。
有人能教我怎么写吗
茉莉
聚焦测试用例?
更新:
根据@PetrAveryanov的评论,这个指令看起来很糟糕,我完全同意。
更新指令:
(function() {
angular.module("FocusNextModule", []).directive("focusNext", function() {
return {
restrict: "A",
link: function($scope, elem, attrs) {
elem.bind("focus", function(e) {
var elemToFocus = document.getElementById(attrs.focusNext) || document.getElementById(attrs.focusNextAlt);
/*jshint -W030 */
angular.element(elemToFocus).hasClass('ng-hide') === false ? elemToFocus.focus() : document.getElementById(attrs.focusSelf).focus();
e.preventDefault();
});
}
};
});
})();