gpt4 book ai didi

javascript - slim 长按

转载 作者:行者123 更新时间:2023-11-28 12:54:45 26 4
gpt4 key购买 nike

我需要一个长按事件来绑定(bind)到 svelte 3 中的按钮。我想以尽可能少的“boilerplaty”方式来完成此操作。

我尝试过长按功能,但这看起来有点复杂和老套,也看起来有点慢。

function longPress(node, callback) {
console.log(node)
function onmousedown(event) {
const timeout = setTimeout(() => callback(node.innerHTML), 1000);

function cancel() {
clearTimeout(timeout);
node.removeEventListener("mouseup", cancel, false);
}

node.addEventListener("mouseup", cancel, false);
}

node.addEventListener("mousedown", onmousedown, false);

return {
destroy() {
node.removeEventListener("mousedown", onmousedown, false);
}
};
}
</script>

<div>
<Video />
{#each Object.entries(bindings) as [id, value]}
<button on:click = {()=>longPress(this,addImage)}> {id} </button>
{/each}
</div>

这可行,但我确信有更好的方法。

最佳答案

对于这种事情,我会使用一个 Action ,它是一个在创建元素时运行的函数(并且可以返回在参数更改或元素被销毁时运行的函数) ):https://svelte.dev/tutorial/actions

在这种情况下,您可以创建一个可重用的 longpress 操作,就像上面的函数一样,它会在您可以监听的目标元素上调度一个自定义的 longpress 事件,例如原生 DOM 事件:

<script>
import { longpress } from './actions.js';
let pressed;
</script>

<button use:longpress on:longpress="{e => pressed = true}">
longpress me
</button>
export function longpress(node, threshold = 500) {
// note — a complete answer would also consider touch events

const handle_mousedown = () => {
let start = Date.now();

const timeout = setTimeout(() => {
node.dispatchEvent(new CustomEvent('longpress'));
}, threshold);

const cancel = () => {
clearTimeout(timeout);
node.removeEventListener('mousemove', cancel);
node.removeEventListener('mouseup', cancel);
};

node.addEventListener('mousemove', cancel);
node.addEventListener('mouseup', cancel);
}

node.addEventListener('mousedown', handle_mousedown);

return {
destroy() {
node.removeEventListener('mousedown', handle_mousedown);
}
};
}

这种方法的优点是,您将“longpress”的定义与处理它的事物分开,因此 addImage/node.innerHTML 逻辑可以完全分离,您可以在应用程序的其他地方重复使用该操作。

完整演示,包括将参数传递给操作:https://svelte.dev/repl/f34b6159667247e6b6abb5142b276483?version=3.6.3

关于javascript - slim 长按,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56844807/

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