【问题标题】:AngularJS: drag and drop directives work on navigator but they dont work on my touch devicesAngularJS:拖放指令适用于导航器,但它们不适用于我的触摸设备
【发布时间】:2017-10-29 16:40:52
【问题描述】:

我在 angularJS 中开发了拖放指令,它在我的导航器(计算机)上运行,但在我的触摸设备上却不起作用。我应该做些什么来调整我的代码以在我的触摸设备上工作?还是我应该更改指令中的代码?在这里你可以找到我的代码的 sn-p

module.exports = angular
  .module('app.dashboard.controller', ['ngTouch'])
  .controller('appDashboard', appDashboard)
  .directive('draggable', draggable)
  .directive('droppable', droppable);
function droppable() {
        return {
            scope: {
            drop: '&',
            bin: '='
        },
        link: function(scope, element) {
            // again we need the native object
            var el = element[0];
      
            el.addEventListener(
                'dragover',
                function(e) {
                    e.dataTransfer.dropEffect = 'move';
                    // allows us to drop
                    if (e.preventDefault) e.preventDefault();
                    this.classList.add('over');
                    return false;
                },
                false
            );
      
            el.addEventListener(
                'dragenter',
                function(e) {
                    this.classList.add('over');
                    return false;
                },
                false
            );
      
            el.addEventListener(
                'dragleave',
                function(e) {
                    this.classList.remove('over');
                    return false;
                },
                false
            );
      
            el.addEventListener(
                'drop',
                function(e) {
                    // Stops some browsers from redirecting.
                    if (e.stopPropagation) e.stopPropagation();
          
                    this.classList.remove('over');
          
                    var binId = this.id;
                    var item = document.getElementById(e.dataTransfer.getData('Text')).cloneNode(true);
                    item.classList.remove('drag');
                    this.appendChild(item);
                    // call the passed drop function
                    scope.$apply(function($scope) {
                        var fn = scope.drop();
                        if ('undefined' !== typeof fn) {            
                            fn(item.id, binId);
                        }
                    });
          
                    return false;
                },
                false
            );
        }
        }
    }
function draggable() {
    return {
      scope: {
        drag: '&' // parent
      },
      link: function(scope, element) {
    // this gives us the native JS object
        var el = element[0];
    
        el.draggable = true;
    
        el.addEventListener(
          'dragstart',
          function(e) {
            e.dataTransfer.effectAllowed = 'move';
            e.dataTransfer.setData('Text', this.id);
            this.classList.add('drag');
            return false;
          },
          false
        );
    
      el.addEventListener(
        'dragend',
        function(e) {
          this.classList.remove('drag');
          return false;
        },
        false
      );
      }
    }
  }

【问题讨论】:

  • 我应该在哪里调用我的代码中的 init() 函数?我的代码中没有 document.ready
  • 为什么不能写成js文件加载?
  • 对不起,我是 angularJS 的新手,所以感谢您的帮助:) 谢谢

标签: javascript angularjs angular-directive


【解决方案1】:
el.addEventListener(
            'touchend',
            function(e) {
                e.dataTransfer.dropEffect = 'move';
                // allows us to drop
                if (e.preventDefault) e.preventDefault();
                this.classList.add('over');
                return false;
            },
            false
        )

您必须使用 touchstart、touchmove 和 touchend 事件并控制位置,或者您可以使用带有 touch Punch 库的 Jquery UI 库。这是链接implementing Drag and Drop for touch Devices

【讨论】:

  • 您需要通过 JQuery lite 获取元素。在属性中传递类名并通过隔离范围访问 var elem =$(class-name); // 类名是链接函数中在隔离范围内传递的属性,并为其添加附加可拖动事件 elem.draggable();链接 - api.jqueryui.com/draggable 如果你添加 touchPunch 库,它会工作,不需要添加额外的代码,但它不会在某些设备上工作,最好使用锤子 JS/Kinetic JS
  • 有什么办法不通过jquery?
  • Jquery UI 使用 Jquery,因此只需利用 JQuery
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2011-07-08
  • 2012-11-01
  • 2011-03-08
  • 2015-02-13
  • 2011-03-20
相关资源
最近更新 更多