Jquery Droppable 不适用于文件上传拖放,抛出错误:预期的 DOM 元素或视图

Posted

技术标签:

【中文标题】Jquery Droppable 不适用于文件上传拖放,抛出错误:预期的 DOM 元素或视图【英文标题】:Jquery Droppable not working for file upload drag and drop, throws Error: Expected DOM element or View 【发布时间】:2018-04-23 12:08:26 【问题描述】:

我一直在开发https://github.com/wekan/ fork,我尝试在其中实现额外的拖放功能。 开箱即用的 wekan 已经提供了标签/成员拖放功能,其中悬停覆盖是通过 droppable hoverClass 完成的:

    const selector = $cards.find(itemsSelector);
    selector.droppable(
      hoverClass: 'draggable-hover-card',
      accept: '.js-member,.js-label',
      'drop'(evt, ui) 
        evt.preventDefault();
        evt.stopPropagation();
        const cardId = Blaze.getData(this)._id;
        const card = Cards.findOne(cardId); //get current card I am hovering
        //stuff
      ,
    );

我添加了附件拖放功能,它不会像上面的代码一样工作,并且会产生我无法干净地添加 hoverClass 的问题。 当我如下所示实现它时,执行 addClass 的逻辑是合理的,但我得到一个错误:

Exception from Tracker afterFlush function:
debug.js:41 Error: Expected DOM element or View
at Object.Blaze.getData (view.js:757)
at list.js:116
at Object.Tracker._runFlush (tracker.js:511)
at onGlobalMessage (setimmediate.js:102)

我的代码中我想获得一张卡片的覆盖/悬停功能,我将其悬停在一个文件上:

    const cardId = Blaze.getData(this)._id;
    const card = Cards.findOne(cardId); //get current card I am hovering
    selector.on('': (evt) =>  //.droppable as above does not work
      evt.preventDefault(); //prevent default browser behavior
      evt.stopPropagation();
    ,
    dragover(e)  // pulled out of selector.on() to add/removeClass
      e.preventDefault();
      e.stopPropagation();
      card.addClass('is-selected'); //add overlay on hover
    ,
    dragenter(e) 
      e.preventDefault();
      e.stopPropagation();
    ,
    dragleave(e) 
      e.preventDefault();
      e.stopPropagation();
      card.removeClass('is-selected');
    ,
    drop(evt, ui) 
      card.removeClass('is-selected');
      if(!ui) // prevent complications with other drop events
        evt.preventDefault();
        evt.stopImmediatePropagation(); // prevent x -times actions
        evt.target.files = evt.dataTransfer.files; // working file upload
        _.each(evt.dataTransfer.files, (f) => 
          const file = new FS.File(f);
          file.boardId = card.boardId;
          file.cardId = card._id;
          Attachments.insert(file);
        );
    ,
    );  

当我移动时

const cardId = Blaze.getData(this)._id;
const card = Cards.findOne(cardId);

回到第一个代码块中的 drop 事件并尝试/测试,例如selector.addClass('') 相反,覆盖工作,但不正确(选择器基本上返回整个卡片列表而不是单个卡片)。 我是一名新手,目前正在接受培训,但我无法理解自己在犯什么错误。


Template.currentData() 代替 Blaze.getData() 不起作用。 当我尝试 selector.droppable() 时,我删除的文件不被接受,并且所有其他事件也不会触发。 在尝试了不同的品种之后,我很确定 Blaze.getData() 是这里的问题。我不知道如何替换它的功能。

【问题讨论】:

【参考方案1】:

问题是我这边的语法和逻辑错误。虽然我知道Blaze.getData() 中的this 会指向我想要的div,但this.addClass() 会抛出错误。所以我认为我需要整个 Blaze-Block,这会导致上述问题。

正确的语法:

$(this).addClass('');

【讨论】:

以上是关于Jquery Droppable 不适用于文件上传拖放,抛出错误:预期的 DOM 元素或视图的主要内容,如果未能解决你的问题,请参考以下文章

JQuery AJAX 上传文件不适用于超过 10 MB 的文件

Droppable 不适用于克隆元素

PHP/jQuery S3 上传不适用于带空格的文件

验证不适用于引导文件上传

jQuery 事件委托不适用于某些按钮

拖放不适用于缩放