事件对象

Posted 腐汝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件对象相关的知识,希望对你有一定的参考价值。

1、啥是事件对象

    threading.Event() 是 Python threading 模块提供的一个同步原语,用于在多线程程序中协调线程之间的操作。它非常有用,可以让一个或多个线程等待某个事件的发生,直到该事件被触发后,所有等待该事件的线程会被激活。

      具体来说,可以将 Event 对象看作是一个标志位,当调用 Event.set() 方法时,该标志位变为 True,而调用 Event.clear() 方法则会将其重置为 False。线程可以通过调用 Event.wait() 方法来等待该标志位变为 True,如果在调用 wait() 之前标志位已经为 True,线程可以继续执行;否则,线程将一直等待,直到其他线程调用了 set() 方法使得标志位为 True。

这样,使用 Event 对象就可以实现线程间的同步操作,比如控制线程的启动、暂停、终止等。

2、应用场景

 

  • 线程的同步:可以使用事件对象来确保线程按照特定的顺序执行。例如,你可以创建两个线程,其中一个线程负责初始化某些数据,而另一个线程在初始化完成后才能执行操作。

 

  • 线程的等待:如果你需要一个或多个线程等待另一个线程完成某个任务,你可以使用事件对象来实现。当任务完成时,可以发送一个信号给等待线程。
  • 多线程编程中的信号处理:在多线程应用程序中,有时需要向一个或多个线程发送信号,以指示某个事件已经发生。此时,你可以使用事件对象来实现这种信号处理机制。

3、简单示例

# SuperFastPython.com
# example of using an event object
from time import sleep
from random import random
from threading import Thread
from threading import Event


# target task function
def task(event, number):
    # wait for the event to be set
    mm = f\'我是number\'
    print(mm)
    event.wait()
    # begin processing
    value = random()
    sleep(value)
    print(f\'Thread number got value\')


# create a shared event object
event = Event()
# create a suite of threads
for i in range(5):
    thread = Thread(target=task, args=(event, i))
    thread.start()
# block for a moment
print(\'Main thread blocking...\')
print("我要开始操作了")
sleep(2)
# start processing in all threads
event.set()
# wait for all the threads to finish...




result:
我是0
我是1
我是2
我是3
我是4
Main thread blocking...
我要开始操作了
Thread 1 got 0.37977761175306546
Thread 0 got 0.3833190476814933
Thread 3 got 0.4714273460018731
Thread 2 got 0.5125375655170216
Thread 4 got 0.5952260410080865

 

 

参考文档:https://superfastpython.com/thread-event-object-in-python/#Need_for_an_Event_Object

事件及事件对象

 一、事件对象event

事件触发会生成事件对象event,event对象是跟事件相关的数据集合,比如点击事件中触发事件的元素、鼠标的位值等。input输入事件中用户按下了哪个键等。

事件对象中常用的属性

1、event.type

事件类型

2、event.target

触发事件的目标元素,IE< 8不可用

3、event.srcElement

触发事件的目标元素,IE < 8 专用

4、event.currentTarget

绑定事件的目标元素,IE < 8不可用,相当于绑定的事件处理函数中的this

5、event.pageX/Y

触发事件时,鼠标距离页面的上左边距,IE < 9不可用

6、event.clientX/Y

触发事件时,鼠标距离页面可视区域的上左边距

7、event.screenX/Y

触发事件时鼠标距离屏幕的上左边距

8、event.offsetX/Y

触发事件时鼠标距离触发事件的元素的内填充边(padding edge)在X/Y轴的偏移量。

9、event.key/keuCode

键盘事件中键盘的按键和按键的ASCII值

10、获取鼠标相对于绑定事件的元素的位置

e.pageX/Y - 绑定事件的元素距离页面的左/上边距(offsetLeft/offsetTop)

二、阻止冒泡、默认事件 (存在兼容性问题)

1、阻止冒泡

event.stopPropagation();

event.cancelBubble = true;IE < 10已废弃,慎用event

兼容写法:

event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;

2、阻止默认

event.preventDefault();

event.returnValue = false IE< 9,即将被废弃,慎用

兼容写法: 

event.preventDefault ? event.preventDefault() : event.returnValue = false 

event.defaultPrevented返回一个布尔值,表明当前事件是否调用了event.preventDefault()方法,如果默认动作被阻止,那么event.defaultPrevented属性为true,否则为false,IE9以上可用此属性。

三、键盘事件

keyup  键盘抬起事件

keydown 键盘按下的事件,按着不松会一直触发

keypress和keydown一样,不同的是获取的按键的ASCII值是区分大小写的,另外无法识别功能键。

四、复制黏贴事件

oncut 剪切事件

oncopy 复制事件

onpaste 黏贴事件

五、事件委托

通过监听一个父元素,来给不同的子元素绑定事件,减少监听次数,从而提升速度。由于事件的冒泡机制, 可以使用事件委托的方式给元素添加事件,多用于ul的监听事件更改li的情景。

closest

ele.closest()方法用来获取,匹配特定选择器且离当前元素最近的祖先元素(也可以是当前元素本身)。如果匹配不到,则返回null。换句话说,方法closet在 元素中检查每个父类,如果与选择器匹配,则停止搜索,并返回祖先,IE不支持此方法。

语法:var ele = element.closet(selectors);

六、“行为型”模式 

我们还可以使用事件委托声明式的通过特定属性和类为元素添加“行为”。

模式分为两步:

1、我们向元素添加一个特殊属性

2、用文档范围级的处理器追踪事件,如果事件发生在具有特定属性的元素上——则执行该操作。

 

以上是关于事件对象的主要内容,如果未能解决你的问题,请参考以下文章

事件对象

移动端------移动事件对象

事件对象——DOM中的事件对象

jQuery通过event获取点击事件的事件对象

事件及事件对象

事件及事件对象