Knockout.js 使用我的“DragEnter”和“Dreagleave”功能在 Firefox 浏览器上拖放有问题

Posted

技术标签:

【中文标题】Knockout.js 使用我的“DragEnter”和“Dreagleave”功能在 Firefox 浏览器上拖放有问题【英文标题】:Knockout.js Drag and Drop having issues on Firefox Browser with my "DragEnter" and "Dreagleave" functions 【发布时间】:2015-11-07 19:13:08 【问题描述】:

我在 Firefox 浏览器中遇到了简单的敲除拖放功能的问题。

问题:

在“dragenter”和“dragleave”上,我正在更改 div 内侧的文本。 它在除 Firefox 之外的所有浏览器中都能正常工作。问题是当我在“dragenter”中更改文本时,它会自动更改为“dragleave”状态。

请看下面所有带有“dragenter”和“dragleave”的浏览器。

Fiddle

function ViewModel()
    var self = this;
    this.dropZones = ko.observableArray([
        'elements' : ko.observableArray([])  // just to see that the output is correct
    ]);

    this.dragover = function(e)
        console.log('dragOver');
        e.stopPropagation();
        e.preventDefault();
    

    this.drop = function(e, data)
        console.log('drop');
        e.stopPropagation();
        e.preventDefault();
        var files = e.dataTransfer.files;
        for (var i = 0, f; f = files[i]; i++) 
            data.elements.push(f.name);
        
        $('.drop_zone').css('background-color', '#ffffff');
        $('.drop_zone').removeClass('over');
        $('.drop_zone').text('Drop files here');
    

    this.dragenter = function(e, index)
        console.log('dragEnter');
        $('.drop_zone').eq(index).css('background-color', '#00ff00');
        $('.drop_zone').eq(index).addClass('over');
         $('.drop_zone').text('Over on this text soome thing happened');
    

    this.dragleave = function(e, index)
        console.log('end');
        $('.drop_zone').eq(index).css('background-color', '#ffffff');
                $('.drop_zone').eq(index).removeClass('over');
         $('.drop_zone').text('Drop files here');
    


ko.applyBindings(new ViewModel());
.drop_zone 
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    padding:40px 25px;
    text-align: center;
    font: 20pt bold'Vollkorn';
    color: #bbb;
    height:300px;
    border:1px solid red;

.drop_zone.over
    border: 1px dashed red;
    
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="col-md-12" data-bind="foreach: dropZones">
    <div class="drop_zone" data-bind="event:
                dragover:   function(data, e) $root.dragover(e);,
                drop:       function(data, e) $root.drop(e, $data);,
                dragenter:  function(data, e) $root.dragenter(e, $index());,
                dragleave:  function(data, e) $root.dragleave(e, $index());
            ">Drop files here</div>
    <ul data-bind="foreach: elements" style="height: 100px">
        <li data-bind="text: $data"></li>
    </ul>
</div>

注意: 只需将更改的文本悬停在拖动输入图像即可。然后你就会知道发生了什么。

【问题讨论】:

您对 DOM 的更改应该通过更改 observables 来完成,而不是通过 jQuery 直接操作。 【参考方案1】:

这里有一个基于 jQuery 的解决方案来解决 Firefox dragleave-when-entering-a-child 问题: How to detect the dragleave event in Firefox when dragging outside the window

我已经制作了一个可以在 Firefox 中运行的 Fiddle 版本。基本思想是它保持输入减去叶子的计数,并且当计数 > 0 时您仍处于拖动模式。我还摆脱了 jQuery DOM 摆弄。

最重要的代码位是:

function dropZone() 
    var self = 
        'elements': ko.observableArray([]),
            'style': ko.observable(),
            'text': ko.observable('Drop files here'),
            'enteredCount': ko.observable(0)
        // just to see that the output is correct
    ;
    self.isOver = ko.computed(function () 
        return self.enteredCount() > 0;
    );
    return self;

this.dragenter = function (data, e) 
    data.enteredCount(data.enteredCount() + 1);
    data.text('Over on this text some thing happened');
;

this.dragleave = function (data, e) 
    data.enteredCount(data.enteredCount() - 1);
    data.text('Drop files here');
;

http://jsfiddle.net/hgaow1pq/4/

【讨论】:

以上是关于Knockout.js 使用我的“DragEnter”和“Dreagleave”功能在 Firefox 浏览器上拖放有问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 knockout-kendo.js 和breeze.js 时不显示DropDownList 值

在 Knockout.js 中异步应用绑定

Knockout JS特殊字符验证

段落文本中的 Knockout.js 回车

GroupBy,在 knockout.js 中过滤

将选择列表添加到可编辑网格 Knockout.js