使用Jquery.on()进行拖放操作,但不使用VanillaJS

kmb7vmvb  于 2023-08-04  发布在  jQuery
关注(0)|答案(1)|浏览(92)

我正在尝试将我的jQuery代码转换为Vanilla JS解决方案:它与jQuery一起工作,但当我尝试将其与vanilla JS切换时出现问题
完美的工作代码:

function readURL(input) {
  if (input.files && input.files[0]) {
    let reader = new FileReader();
    reader.onload = function(e) {
      let listIcon = e.target.result;
      document.getElementById("list-image").src = listIcon;
      document.querySelector(".image-upload-wrap").classList.remove("image-dropping");
    };
    reader.readAsDataURL(input.files[0]);
  }
}

let dragTimer;
$(document).on("dragover",
function(e) {
  let dt = e.originalEvent.dataTransfer;
  if (dt.types && (dt.types.indexOf ? dt.types.indexOf("Files") != -1 : dt.types.contains("Files"))) {
    document.querySelector(".image-upload-wrap").classList.add("image-dropping");
    window.clearTimeout(dragTimer);
  }
});
$(document).on("dragleave",
function(e) {
  dragTimer = window.setTimeout(function() {
    document.querySelector(".image-upload-wrap").classList.remove("image-dropping");
  },
  25);
});

字符串
不起作用的代码。我正在使用JS addEventListener,也许这就是问题所在。我在最后添加了工作codepen,它可以工作(但使用jQuery)

let dragTimer;
document.addEventListener("dragstart",
function(e) {
  ev.dataTransfer.setData("image", e.target.id);
});
document.addEventListener("dragover",
function(e) {
  e.preventDefault();
  let dt = e.originalEvent.dataTransfer;
  if (dt.types && (dt.types.indexOf ? dt.types.indexOf("Files") != -1 : dt.types.contains("Files"))) {
    document.querySelector(".image-upload-wrap").classList.add("image-dropping");
    window.clearTimeout(dragTimer);
  }
});
document.addEventListener("dragleave",
function(e) {
  e.preventDefault();
  dragTimer = window.setTimeout(function() {
    document.querySelector(".image-upload-wrap").classList.remove("image-dropping");
  },
  25);
});


Working Codepen

y4ekin9u

y4ekin9u1#

代码中的问题在于dragover事件侦听器中e.originalEvent的使用。在Vanilla JS中,事件对象本身包含必要的属性,因此您不需要访问originalEvent。

let dragTimer;
document.addEventListener("dragstart", function (e) {
  e.dataTransfer.setData("image", e.target.id);
});

document.addEventListener("dragover", function (e) {
  e.preventDefault();
  let dt = e.dataTransfer;
  if (
    dt.types &&
    (dt.types.indexOf
      ? dt.types.indexOf("Files") != -1
      : dt.types.contains("Files"))
  ) {
    document
      .querySelector(".image-upload-wrap")
      .classList.add("image-dropping");
    window.clearTimeout(dragTimer);
  }
});

document.addEventListener("dragleave", function (e) {
  e.preventDefault();
  dragTimer = window.setTimeout(function () {
    document
      .querySelector(".image-upload-wrap")
      .classList.remove("image-dropping");
  }, 25);
});

字符串
jQuery规范化了跨不同浏览器的事件处理,提供了一致的接口来处理事件。当一个事件被触发时,jQuery用它自己的事件对象 Package 浏览器提供的原始事件对象。此jQuery事件对象包含用于跨浏览器兼容性的其他属性和方法。
originalEvent属性允许您访问jQuery事件对象中的底层特定于浏览器的事件对象。它提供对原始事件的属性和方法的直接访问。当您需要访问特定于浏览器的功能或以非标准方式处理事件时,这可能很有用。

相关问题