• 指令 键盘上下键移动实现列表数据滚动


    指令

    angular.module('ui.directives').directive('uiKeydown', ['keypressHelper', function(keypressHelper){
      return {
        link: function (scope, elm, attrs) {
          keypressHelper('keydown', scope, elm, attrs);
        }
      };
    }]);

    注入的keypressHelper工厂

    angular.module('ui.directives').factory('keypressHelper', ['$parse', function keypress($parse){
      var keysByCode = {
        8: 'backspace',
        9: 'tab',
        13: 'enter',
        27: 'esc',
        32: 'space',
        33: 'pageup',
        34: 'pagedown',
        35: 'end',
        36: 'home',
        37: 'left',
        38: 'up',
        39: 'right',
        40: 'down',
        45: 'insert',
        46: 'delete'
      };
    
      var capitaliseFirstLetter = function (string) {
        return string.charAt(0).toUpperCase() + string.slice(1);
      };
    
      return function(mode, scope, elm, attrs) {keypressHelper('keydown', scope, elm, attrs);
        var params, combinations = [];
        params = scope.$eval(attrs['ui'+capitaliseFirstLetter(mode)]);
    
        // Prepare combinations for simple checking
        angular.forEach(params, function (v, k) {
          var combination, expression;
          expression = $parse(v);
    
          angular.forEach(k.split(' '), function(variation) {
            combination = {
              expression: expression,
              keys: {}
            };
            angular.forEach(variation.split('-'), function (value) {
              combination.keys[value] = true;
            });
            combinations.push(combination);
          });
        });
    
        // Check only matching of pressed keys one of the conditions
        elm.bind(mode, function (event) {
          // No need to do that inside the cycle
          var altPressed = event.metaKey || event.altKey;
          var ctrlPressed = event.ctrlKey;
          var shiftPressed = event.shiftKey;
          var keyCode = event.keyCode;
    
          // normalize keycodes
          if (mode === 'keypress' && !shiftPressed && keyCode >= 97 && keyCode <= 122) {
            keyCode = keyCode - 32;
          }
    
          // Iterate over prepared combinations
          angular.forEach(combinations, function (combination) {
    
            var mainKeyPressed = (combination.keys[keysByCode[event.keyCode]] || combination.keys[event.keyCode.toString()]) || false;
    
            var altRequired = combination.keys.alt || false;
            var ctrlRequired = combination.keys.ctrl || false;
            var shiftRequired = combination.keys.shift || false;
    
            if (
              mainKeyPressed &&
              ( altRequired == altPressed ) &&
              ( ctrlRequired == ctrlPressed ) &&
              ( shiftRequired == shiftPressed )
            ) {
              // Run the function
              scope.$apply(function () {
                combination.expression(scope, { '$event': event });
              });
            }
          });
        });
      };
    }]);

    使用方式

    <div class="search-content" ui-keydown="{'up down': 'inputCodeTreatBlur()'}" id="treatInfoSearch">
                <table class="table table-striped">
                    <tbody>
                    <tr ng-repeat="treatInfo in treatInfoList"
                        ng-dblclick="selectTreatInfo()" ng-click="activeTreatInfo(treatInfo)"
                        ng-class="{'bg-selected-color': treatInfo==activateTreatInfo}">
                        <td>
                            {{::treatInfo.clinicItemName}}
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
    inputCodeTreatBlur()函数是实现列表滚动条移动
    $scope.inputCodeTreatBlur = function () {
            var scope = angular.element("#treatInfoSearch").scope();
            if (scope.treatInfoList.length !== 0) {
                if (angular.equals(scope.activateTreatInfo, {})) {
                    if (event.keyCode === 40) {
                        scope.activeTreatInfo(scope.treatInfoList[0]);
                        $("#treatInfoSearch").scrollTop(0);
                    } else if (event.keyCode === 38) {
                        var treatInfo = scope.treatInfoList[scope.treatInfoList.length - 1];
                        scope.activeTreatInfo(treatInfo);
                        $("#treatInfoSearch").scrollTop(document.getElementById("treatInfoSearch").scrollHeight - document.getElementById("treatInfoSearch").offsetHeight + 5);
                    }
                    event.stopPropagation();
                    event.preventDefault();
                }
            }
        };
  • 相关阅读:
    多属性量化决策模型
    对称加密与非对称加密
    子网掩码
    网络安全
    万维网WWW、电子邮件email与文件传输FTP
    DHCP协议
    DNS协议
    ARP协议与RARP协议
    springboot WebSocket的使用
    Java调用Python的两种方式
  • 原文地址:https://www.cnblogs.com/ms-grf/p/6739734.html
Copyright © 2020-2023  润新知