我正在尝试将我的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);
});
1条答案
按热度按时间y4ekin9u1#
代码中的问题在于dragover事件侦听器中e.originalEvent的使用。在Vanilla JS中,事件对象本身包含必要的属性,因此您不需要访问originalEvent。
字符串
jQuery规范化了跨不同浏览器的事件处理,提供了一致的接口来处理事件。当一个事件被触发时,jQuery用它自己的事件对象 Package 浏览器提供的原始事件对象。此jQuery事件对象包含用于跨浏览器兼容性的其他属性和方法。
originalEvent属性允许您访问jQuery事件对象中的底层特定于浏览器的事件对象。它提供对原始事件的属性和方法的直接访问。当您需要访问特定于浏览器的功能或以非标准方式处理事件时,这可能很有用。