[svelte]事件

DOM events
<script>
	let m = { x: 0, y: 0 };

	function handleMousemove(event) {
		m.x = event.clientX;
		m.y = event.clientY;
	}
</script>

<style>
	div { width: 100%; height: 100%; }
</style>

<div on:mousemove={handleMousemove}>
	The mouse position is {m.x} x {m.y}
</div>

on:mousemove 是一个事件绑定的语法,它用于将 handleMousemove 函数与 <div> 元素的 mousemove 事件关联起来。on:mousemove 表示当鼠标在 <div> 元素内发生移动时触发 handleMousemove 函数。

因此,当鼠标在 <div> 元素内移动时,浏览器会触发 mousemove 事件,并调用 handleMousemove 函数来处理该事件。

DOM(文档对象模型)事件是指在浏览器中操作网页元素时触发的事件。这些事件允许 JavaScript 在特定的DOM元素上执行代码,以响应用户的交互或其他操作。以下是一些常见的 DOM 事件:

鼠标事件:

click:当用户点击鼠标按钮(左键、中键或右键)时触发。
mouseover:当鼠标移动到元素上方时触发。
mouseout:当鼠标从元素上移开时触发。
mousedown、mouseup:当鼠标按下或释放任意按钮时触发。


键盘事件:

keydown、keyup:当用户按下或释放键盘上的键时触发。
keypress:当用户按下键盘上的按键时触发,但是在 keydown 之后、keyup 之前触发。


表单事件:

submit:当用户提交表单时触发。
input:当用户输入内容到表单元素(如 <input>、<textarea>)时触发。
change:当表单元素的值发生变化时触发。


窗口事件:

load:当页面加载完成时触发。
resize:当窗口大小调整时触发。
scroll:当用户滚动页面时触发。


触摸事件(移动设备):

touchstart、touchend、touchmove:当用户在触摸屏上触摸时触发。


拖放事件:

dragstart、dragend:当拖动元素开始或结束时触发。
dragenter、dragleave、dragover、drop:当拖动元素进入、离开、悬停在某个区域或在某个区域释放时触发。

要在 HTML 中监听 DOM 事件,通常需要使用 on 前缀。在 HTML 中,可以直接使用 on 加上事件名称的方式来指定事件处理函数

内联函数
<script>
	let m = { x: 0, y: 0 };
</script>

<style>
	div { width: 100%; height: 100%; }
</style>

<div on:mousemove="{e => m = { x: e.clientX, y: e.clientY }}">
	The mouse position is {m.x} x {m.y}
</div>

使用了一个内联的事件处理器,它通过箭头函数来更新 m 对象的 x 和 y 属性,以记录鼠标的当前位置。在这里,e 是事件对象,它包含有关鼠标移动事件的信息,其中 e.clientX 表示鼠标相对于浏览器窗口的水平位置,e.clientY 表示鼠标相对于浏览器窗口的垂直位置。 这样,每次鼠标在 <div> 元素内移动时,都会更新 m 对象的 x 和 y 属性,并且页面上会显示出当前的鼠标位置

事件修饰符

preventDefault:阻止事件的默认行为。通常用于阻止表单的提交或链接的跳转。

<form on:submit|preventDefault={handleSubmit}>
    <!-- 表单内容 -->
</form>

stopPropagation:阻止事件在 DOM 树中进一步传播,即停止事件冒泡。

<div on:click|stopPropagation={handleDivClick}>
    <!-- div 内容 -->
</div>

capture:将事件监听器添加到捕获阶段而不是冒泡阶段。默认情况下,事件监听器是在冒泡阶段触发的。

<div on:click|capture={handleCaptureClick}>
    <!-- div 内容 -->
</div>

once:指定事件只会触发一次,之后便会自动解绑

<button on:click|once={handleClick}>Click Me Once</button>

passive:指定事件监听器不会调用 preventDefault(),可以提升性能。适用于滚动事件等会频繁触发的事件

<div on:scroll|passive={handleScroll}>
    <!-- div 内容 -->
</div>

self:只有事件是由元素本身触发的时候才会触发事件处理器。防止事件冒泡到父元素后再次触发事件处理器

<div on:click|self={handleDivClick}>
    <!-- div 内容 -->
</div>

可以将修饰符组合在一起使用,例如:on:click|once|capture={...}

组件事件

在 Svelte 中,组件可以定义自己的事件,以便在组件内部触发并将其传递给组件外部。组件事件是一种机制,允许组件与其父组件或其他组件进行通信。以下是组件事件的主要特点和用法:

1.定义事件: 组件可以使用 createEventDispatcher 函数创建一个事件分发器。通过这个分发器,组件可以定义自己的事件名称和事件详情。

import { createEventDispatcher } from 'svelte';

const dispatch = createEventDispatcher();

function sayHello() {
    dispatch('message', {
        text: 'Hello!'
    });
}

2.触发事件: 组件内部的逻辑可以通过调用 dispatch 函数来触发自定义事件。在触发事件时,可以传递一些数据作为事件的详情。

3.监听事件: 父组件或其他组件可以监听组件触发的事件,并在事件发生时执行相应的逻辑。

<script>
    import ChildComponent from './ChildComponent.svelte';

    function handleCustomEvent(event) {
        console.log('Received custom event:', event.detail.text);
    }
</script>

<ChildComponent on:message={handleCustomEvent} />

4.传递数据: 组件事件可以携带任意类型的数据作为事件详情,这些数据可以是简单的原始值、对象、数组等

DOM事件转发

DOM 事件转发是指将原生 DOM 事件转发到 Svelte 组件内部的机制。这在某些情况下很有用,特别是当你需要在 Svelte 组件内部处理原生 DOM 事件时。

在 Svelte 中,可以使用 on:eventname 语法来将原生 DOM 事件转发到组件内部。例如,如果你想要将 <button> 元素的点击事件转发到 Svelte 组件内部处理,

<script>
    function handleClick(event) {
        console.log('Button clicked!');
    }
</script>

<button on:click={handleClick}>
    Click me
</button>

在这个例子中,handleClick 函数将会在按钮被点击时被调用,这是通过 on:click 语法将按钮的点击事件转发到组件内部实现的。

在 Svelte 组件中,你可以像处理自定义事件一样处理转发的 DOM 事件。例如,你可以将转发的点击事件与组件内部的逻辑相结合:

<script>
    function handleClick(event) {
        console.log('Button clicked!');
        // 其他逻辑...
    }
</script>

<button on:click={handleClick}>
    Click me
</button>

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值