zoukankan      html  css  js  c++  java
  • 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 后判断是否点击的是目标元素,再进行相应操作。

      遗留个小问题:点击滚动条居然不算是点击目标元素 @_@ ?

  • 相关阅读:
    Android Media Playback 中的MediaPlayer的用法及注意事项(二)
    Android Media Playback 中的MediaPlayer的用法及注意事项(一)
    34. Search for a Range
    33. Search in Rotated Sorted Array
    32. Longest Valid Parentheses
    31. Next Permutation下一个排列
    30. Substring with Concatenation of All Words找出串联所有词的子串
    29. Divide Two Integers
    28. Implement strStr()子串匹配
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/guofan/p/7216605.html
Copyright © 2011-2022 走看看