在 dragstart 事件处理程序中 event.dataTransfer 和 event.originalEvent 始终为 null

Posted

技术标签:

【中文标题】在 dragstart 事件处理程序中 event.dataTransfer 和 event.originalEvent 始终为 null【英文标题】:event.dataTransfer and event.originalEvent are always null inside dragstart event handler 【发布时间】:2014-09-01 05:08:05 【问题描述】:

我正在尝试通过以下帖子为 angularJS 创建拖放指令:http://jasonturim.wordpress.com/2013/09/01/angularjs-drag-and-drop/

但我无法发送任何数据,因为在 dragstart 事件处理程序内部 dataTransferoriginalEvent 始终为空。

我的拖动指令如下所示:

directives.directive('draggSrc', ['$rootScope', 'UuidService', function ($rootScope, UuidService) 
    var directive = ;

    directive.restrict = 'A';

    directive.link = function (scope, el, attrs) 
        el.attr("draggable", "true");
        var id = attrs.id;
        if (!attrs.id) 
            id = UuidService.new();
            el.attr("id", id);
        

        el.bind("dragstart", function (evt) 
            console.log(evt);
            console.log(evt.dataTransfer);
            console.log(evt.originalEvent);
            evt.dataTransfer.setData('text', id);

            $rootScope.$emit("DRAG-START");
        );

        el.bind("dragend", function (evt) 
            $rootScope.$emit("DRAG-END");
        );
    ;

    return directive;
]);

我也给$.event.props.push('dataTransfer')打过电话。

【问题讨论】:

【参考方案1】:

为了解决我的问题,我从使用 jQuery 的 bind 切换到使用 javascriptaddEventListener 并且一切都按预期工作:

directives.directive('draggSrc', ['$rootScope', 'UuidService', function ($rootScope, UuidService) 
    var directive = ;

    directive.restrict = 'A';

    directive.link = function (scope, el, attrs) 
        el.attr("draggable", "true");
        var id = attrs.id;
        if (!attrs.id) 
            id = UuidService.new();
            el.attr("id", id);
        

        el.get(0).addEventListener("dragstart", function (evt) 
            evt.dataTransfer.setData('text', id);
            $rootScope.$emit("DRAG-START");
        );

        el.get(0).addEventListener("dragend", function (evt) 
            $rootScope.$emit("DRAG-END");
        );
    ;

    return directive;
]);

【讨论】:

遇到了同样的问题。非常感谢。【参考方案2】:

通过不同的修复遇到了同样的问题:如果您的放置处理程序中有 alert()confirm() 对话框,则会清除 event.dataTransfer

【讨论】:

0 反对票它对我有用。我尝试了一整天,最后这个解决方案对我有用。删除您的代码的警报。非常感谢。 类似地,看到这个答案:***.com/a/49492200/57624 在 Firefox 中调试时,dataTransfer 为空。 (啊!-我至少花了一个小时!)

以上是关于在 dragstart 事件处理程序中 event.dataTransfer 和 event.originalEvent 始终为 null的主要内容,如果未能解决你的问题,请参考以下文章

绑定原生 html5 dragstart 事件处理程序并使用 jQuery 访问 dataTransfer

拖拉事件

event.preventDefault 如何在无法停止的事件处理程序上工作?

Event Handler 事件处理程序 2 ---跨浏览器事件对象《高程3》

将“dragstart”事件附加到“mouseup”以获得可拖动体验

JavaScript中的Event事件对象详解