gpt4 book ai didi

javascript - 使用 JavaScript 在 SortableJS 可排序列表上模拟拖放

转载 作者:行者123 更新时间:2023-12-01 14:51:18 25 4
gpt4 key购买 nike

我正在尝试在使用 Sortable library 创建的可排序 HTML 列表上模拟拖放操作。 .它使用原生 HTML5 API 在列表中实现可拖动元素和排序。
为了模拟这些拖动事件,我找到并修改了以下 JavaScript 代码:

var triggerSortableDragAndDrop = function (selectorDrag, selectorDrop, callback) {
var DELAY_INTERVAL_MS = 10;
var MAX_TRIES = 2;

// fetch target elements
var elemDrag = document.querySelector(selectorDrag);
var elemDrop = document.querySelector(selectorDrop);
elemDrag.setAttribute('draggable',"true");
elemDrop.setAttribute('draggable',"true");
elemDrag.href="#";

var dragItems = document.querySelectorAll('[draggable=true]');


if (!elemDrag || !elemDrop) {
console.log("can't get elements");
return false;
}

var startingDropRect = elemDrop.getBoundingClientRect();

function rectsEqual(r1, r2) {
return r1.top === r2.top && r1.right === r2.right && r1.bottom === r2.bottom && r1.left === r2.left;
}

// function for triggering mouse events
function fireMouseEvent(type, elem) {
var evt = document.createEvent('MouseEvent');
evt.initMouseEvent(type, true, true, window, 1, 1, 1, 0, 0, false, false, false, false, 0, elem);
elem.dispatchEvent(evt);
};

// trigger dragging process on top of drop target
// We sometimes need to do this multiple times due to the vagaries of
// how Sortable manages the list re-arrangement
var counter = 0;
function dragover() {
counter++;
console.log('DRAGOVER #' + counter);

var currentDropRect = elemDrop.getBoundingClientRect();
if (rectsEqual(startingDropRect, currentDropRect) && counter < MAX_TRIES) {
if (counter != 1) console.log("drop target rect hasn't changed, trying again");

// mouseover / mouseout etc events not necessary
// dragenter / dragleave events not necessary either
fireMouseEvent('dragover', elemDrop);

setTimeout(dragover, DELAY_INTERVAL_MS);
} else {
if (rectsEqual(startingDropRect, currentDropRect)) {
console.log("wasn't able to budge drop target after " + MAX_TRIES + " tries, aborting");
fireMouseEvent('drop', elemDrop);
if (callback) callback(false);
} else {
setTimeout(drop, DELAY_INTERVAL_MS);
}
}
}

function drop() {
console.log('DROP');
// release dragged element on top of drop target
fireMouseEvent('drop', elemDrop);
fireMouseEvent('mouseup', elemDrop); // not strictly necessary but I like the symmetry
if (callback) callback(true);
}

// start dragging process
console.log('DRAGSTART');
fireMouseEvent('mousedown', elemDrag);
console.log('mousedown triggered');
fireMouseEvent('dragstart', elemDrag);
console.log('dragstart triggered');

// after a delay, do the first dragover; this will run up to MAX_TRIES times
// (with a delay between each run) and finally run drop() with a delay:
setTimeout(dragover, DELAY_INTERVAL_MS);
return true;
};
我试图拖放的部分的标记如下:
enter image description here
当我尝试在浏览器的拖动事件监听器上设置断点,并在我的浏览器控制台中执行辅助函数时,使用:
triggerSortableDragAndDrop('#bookmarkItems > li:nth-child(2)', '#bookmarkItems > li:nth-child(2)');
我注意到 dragstart 事件从未被捕获,但 mousedown 和 dragover 事件被捕获。
如何让 dragstart 事件触发以触发其监听器?因为我认为这是导致拖放模拟失败的原因。

最佳答案

我可以在您的代码中看到 dragstart创建类型为 MouseEvent 的事件而它的类型是 DragEvent .

var elem = document.getElementById("one");
var mousedown = document.createEvent('MouseEvent');
mousedown.initMouseEvent("mousedown", true, true, window, 1, 1, 1, 0, 0, false, false, false, false, 0, elem);
elem.dispatchEvent(mousedown);
var dragstart = document.createEvent('DragEvent');
dragstart.initMouseEvent("dragstart", true, true, window, 1, 1, 1, 0, 0, false, false, false, false, 0, elem);
elem.dispatchEvent(dragstart);
<div id="one" draggable="true" onmousedown="console.log('mousedown')" ondragstart="console.log('dragstart')">drag me</div>

创建 dragstart作为正确类型的事件,至少在 Chrome 和 Edge 上,它可以工作。
希望这可以帮助。

关于javascript - 使用 JavaScript 在 SortableJS 可排序列表上模拟拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com