javascript – 在元素外部单击时触发事件的指令
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 在元素外部单击时触发事件的指令,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2963字,纯文字阅读大概需要5分钟。
内容图文
我知道有很多问题要问类似的事情.但没有人真正解决我的问题.
我正在尝试构建一个指令,当鼠标点击当前元素之外时,该指令将执行表达式.
为什么我需要这个功能?我正在构建一个应用程序,在这个应用程序中,有3个下拉菜单,5个下拉列表(如选中).所有这些都是角度指令.让我们假设所有这些指令都不同.所以我们有8个指令.并且所有这些都需要相同的功能:当单击元素时,需要隐藏下拉列表.
我有2个解决方案,但都有问题:
解决方案A:
app.directive('clickAnywhereButHere', function($document){
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
elem.bind('click', function(e) {
// this part keeps it from firing the click on the document.
e.stopPropagation();
});
$document.bind('click', function() {
// magic here.
scope.$apply(attr.clickAnywhereButHere);
})
}
}
})
以下是解决方案A:click here的示例
当您单击第一个下拉列表,然后单击第二个输入时,第一个应该隐藏但不是.
解决方案B:
app.directive('clickAnywhereButHere', ['$document', function ($document) {
directiveDefinitionObject = {
link: {
pre: function (scope, element, attrs, controller) { },
post: function (scope, element, attrs, controller) {
onClick = function (event) {
var isChild = element.has(event.target).length > 0;
var isSelf = element[0] == event.target;
var isInside = isChild || isSelf;
if (!isInside) {
scope.$apply(attrs.clickAnywhereButHere)
}
}
$document.click(onClick)
}
}
}
return directiveDefinitionObject
}]);
以下是解决方案B:click here的示例
解决方案如果页面中只有一个指令但不在我的应用程序中,则可以正常工作.因为它阻止冒泡,所以首先当我点击dropdown1,显示dropdown1,然后点击dropdown2,点击事件被阻止,所以dropdown1仍然显示那里甚至我点击dropdown1外面.
解决方案B在我的应用程序中工作,我现在正在使用它.但问题是它会导致性能问题.在应用中的任何位置,每次单击都会处理太多的点击事件.在我目前的情况下,有8个click事件与文档绑定,所以每次单击都执行8个函数.这导致我的应用程序非常慢,尤其是在IE8中.
那么有更好的解决方案吗?谢谢
解决方法:
我不会使用event.stopPropagation(),因为它会导致你在解决方案A中看到的问题.如果可能的话,我也会使用模糊和聚焦事件.当您的下拉列表附加到输入时,您可以在输入失去焦点时将其关闭.
但是,处理文档上的单击事件也不是那么糟糕,因此如果您想避免多次处理相同的单击事件,只需在不再需要时将其从文档中取消绑定.除了在下拉列表外单击时评估的表达式,指令还需要知道它是否处于活动状态:
app.directive('clickAnywhereButHere', ['$document', function ($document) {
return {
link: function postLink(scope, element, attrs) {
var onClick = function (event) {
var isChild = $(element).has(event.target).length > 0;
var isSelf = element[0] == event.target;
var isInside = isChild || isSelf;
if (!isInside) {
scope.$apply(attrs.clickAnywhereButHere)
}
}
scope.$watch(attrs.isActive, function(newValue, oldValue) {
if (newValue !== oldValue && newValue == true) {
$document.bind('click', onClick);
}
else if (newValue !== oldValue && newValue == false) {
$document.unbind('click', onClick);
}
});
}
};
}]);
使用该指令时,只需提供另一个表达式:
<your-dropdown click-anywhere-but-here="close()" is-active="isDropdownOpen()"></your-dropdown>
我还没有测试你的onClick功能.我认为它按预期工作.希望这可以帮助.
内容总结
以上是互联网集市为您收集整理的javascript – 在元素外部单击时触发事件的指令全部内容,希望文章能够帮你解决javascript – 在元素外部单击时触发事件的指令所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。