瘦长按

Gre*_*his 0 javascript reactive-programming dom-events svelte

我需要一个长按事件来绑定到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>
Run Code Online (Sandbox Code Playgroud)

这可行,但是我敢肯定有更好的方法。

Ric*_*ris 5

对于这种事情,我将使用action,它是在创建元素时运行的函数(并且可以返回在更改参数或销毁元素时运行的函数):https : //svelte.dev/教程/动作

在这种情况下,您可以创建一个可重用的longpress操作,就像上面的函数一样,该longpress操作在目标元素上分派一个自定义事件,您可以像本地DOM事件一样侦听该事件:

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

<button use:longpress on:longpress="{e => pressed = true}">
  longpress me
</button>
Run Code Online (Sandbox Code Playgroud)
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);
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您已经将'longpress'的定义与处理它的事物分开了,因此addImage/ node.innerHTML逻辑可以完全分开,并且可以在应用程序的其他地方重用该动作。

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

  • setTimeout 是正确的。setInterval 会重复它。 (2认同)