首页 > 代码库 > outsideClick 功能,探索
outsideClick 功能,探索
最近项目中新增了一个功能,需求是一个下拉列表,但是激活元素是 input 标签,对于 uib-dropdown 指令也不难,只是将 button 换成 input 加上 uib-dropdown-toggle 属性标记即可,这不难。
然而,测试提出了另一个需求,input 框可点击,并且下拉框不闪动,意思就是说点击 input 下拉框不要在展开关闭中切换。这个问题直接就难住我了,因为 uib-dropdown-toggle 属性,会导致点击一次激活属性,就改变一次下拉框的开闭状态。
而还有一种方法,将 auto-close 设置成 disabled ,同时 uib-dropdown 同级属性加上 is-open 属性来自己控制下拉框的开合,这样做是实现了测试的需求,但同时引出了另一个问题:点击外部不会关闭,因为之前 auto-close 设置的是 outsideClick ,点击除下拉框外的元素都将关闭下拉框。
因为时间较急,也没仔细看过这个 outsideClick 的实现原理,于是积极找各种方法,寻求新的插件来实现需求,偶然看到了 select2 插件的对 input 下拉框的查询,它巧妙的将 input 放入了下拉框中,这就不会存在点击 激活元素的事件了,于是跟同事商量,改成了这种下拉 input 的实现,插件并没有改变。
现在功能做完,回想起来这么个事,先想出来个 outsideClick 的实现,以后万一有用呢:
<!DOCTYPE html> <html ng-app=‘myApp‘> <head> <meta charset=‘utf-8‘> <script src=‘angular.js‘></script> <script src=‘jquery-1.11.3.js‘></script> <style> .div1 { border: 1px solid #ddd; width: 200px; height: 200px; margin-left: 40%; margin-top: 100px; display:inline-block; overflow-x:scroll; } p { text-align: center; } </style> </head> <body> <div ng-controller=‘myCtrl‘> <div class=‘div1‘ ng-click="eleClickFnc()">ppppppppppppppppppppppppppppppppppp
ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp</div> <p>{{message}}</p> </div> <script> angular.module("myApp",[]) .controller("myCtrl",function($scope, $document){ $scope.message = ‘please click anywhere‘; $scope.isELeClick = false; $scope.eleClickFnc = function () { $scope.isELeClick = true; $scope.message = ‘ele clicked‘; console.log(‘ele‘) } $document.bind(‘click‘, function () { if(!$scope.isELeClick) { $scope.$apply(function () { $scope.message = ‘body click‘; }) } $scope.isELeClick = false; console.log(‘body‘) }) }) </script> </body> </html>
主要思路就是监听点击事件啦:
1、元素自己的事件,可以通过一个开关来控制;
2、document 的监听,点击元素肯定是先触发的元素事件,这样先改变开关状态,触发到 document 后判断是否点击的是目标元素,再进行相应操作。
遗留个小问题:点击滚动条居然不算是点击目标元素 @_@ ?
outsideClick 功能,探索