YUI经验谈 - 自定义事件默认行为

纵观主流JS库和框架,YUI在自定义事件方面做的尤为出色。如果需要挑出一个代表性的feature,那么非事件默认行为莫属。

是什么

YUI自定义事件在总体上模仿了DOM事件的设计思想。DOM中的一些事件是有默认行为的,详细见DOM3 Event - Default actions and cancelable events一节。简单来说,所谓默认行为,是指该事件在通常情况下所表现出来的动作,例如:

  • 一个链接节点的click事件,默认行为是转向该链接href属性对应的地址
  • 表单的submit事件,默认行为是将表单包含的数据提交给表单的action

说通常情况下,是因为有时开发者会在事件的回调函数中调用

e.preventDefault();

来阻止默认行为的发生。

Event Default Action

YUI自定义事件遵循了同样的思路,甚至API也和DOM完全一致。

有啥用

事件默认行为,本质上,是一种管理事件和行为的对应关系的机制。这种机制既不像回调那样死板,也不像消息那样开放。通过将通用处理逻辑作为事件默认行为,满足常见需求的同时,为定制化需求提供了一定开放性,整体上更加灵活。

在DOM事件中,和默认行为相关的场景并不少见:

  • 监听到链接的click事件时,在链接地址中加入追踪参数,利用默认行为跳转到新地址
  • 阻止表单submit事件默认行为,改为异步提交表单,提供更好的用户体验

在自定义事件的应用中,也会遇到一些类似的例子。例如:

  • 注册时,有一些邮箱虽然是可用的,但对于EDM不给力,在这种情况下,阻止表单项验证成功的默认行为,展示建议用户使用其它邮箱的提示
  • 表单验证组件在检查表单项失败后触发failure事件,对应的默认行为是在表单项下方显示错误信息。这样的处理在大部分情况下是完全OK的。不过有一天,交互设计师在一个特定场景下提出所有提示都应该放在整个表单顶部,得益于这种灵活的机制,实现这种定制化逻辑十分轻松
  • 字符计数插件在输入变化时会默认更新字符数提示。在评价内容中,有更复杂的提示逻辑和展示效果,这时阻止默认行为,实现定制化内容即可

怎么用

下面以表单项验证组件为例,展示如何使用事件默认行为。

首先创建FieldValidator组件,并使其具备EventTarget的功能,实现自定义事件机制:

var FieldValidator = function (ndField, validateFn) {var instance = this;// ...
};
Y.augment(FieldValidator, Y.EventTarget);

使用publish声明检查成功和失败的自定义事件,主要目的是定义事件的默认行为:

var FieldValidator = function (ndField, validateFn) {// ...// 声明检查成功事件,设置默认行为instance.publish('success', {emitFacade: true,defaultFn: function (e) {e.field.next('.tip').setHTML('ok');}});// 声明检查失败事件,设置默认行为instance.publish('failure', {emitFacade: true,defaultFn: function (e) {e.field.next('.tip').setHTML('error');}});
};

接下来注册表单项的focusblur事件,在blur触发时检查表单内容,并触发自定义事件:

var FieldValidator = function (ndField, validateFn) {// ...ndField.on({focus: function (e) {ndField.next('.tip').setHTML('');},blur: function (e) {if (validateFn(this.get('value'))) {// 检查通过,触发检查成功事件instance.fire('success', { field: ndField });} else {// 检查未通过,触发检查失败事件instance.fire('failure', { field: ndField });}}});
};

现在就可以使用这个组件了,一般情况下,我们不需要阻止默认行为,下面是一个具体示例:

// 检查邮箱
new FieldValidator(Y.one('[name="email"]'), function (value) {return /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(value);
});

一切看起来都很美,直到有一天你接到一个需求:Yahoo邮箱在检查通过时需要展示EDM不给力的提示,这时候默认行为就可以来拯救你了:

var validator = new FieldValidator(Y.one('[name="email"]'), function (value) {return /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(value);
});
validator.on('success', function (e) {if (e.field.get('value').indexOf('@yahoo.com') !== -1) {// 阻止默认行为e.preventDefault();// 定制化行为e.field.next('.tip').setHTML('换个邮箱吧,yahoo.com邮箱收不到优惠通知哦');}
});

success事件的回调中,通过阻止默认行为,不再执行提示内容为OK的默认逻辑,而是切换成判断雅虎邮箱,并给出特定提示的定制化逻辑。

完整代码展示,请移步JSFiddle。

要注意

一个好的idea,最容易被滥用。默认行为不是万能药,只适合一些这样的场景:

  • 需要通过事件进行消息广播。如果callback就可以解决问题,那么明智之举是使用callback
  • 存在定制化需求的预期,即有些情况下需要中止默认行为的发生,换之以定制化行为

参考

  • DOM3 Event - Default actions and cancelable events
  • YUI EventTarget

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团NLP中心算法实习生招聘

致力于连接最靠谱的算法岗与最强的求职者招聘贴投放请联系微信xixiaoyao-1岗位职责:NLP算法研发,例如文本挖掘、知识预训练、知识&多模态预训练等知识图谱构建核心技术相关论文撰写岗位要求:北京高校在校大学生。(2023年毕业优…

论文浅尝 | 改善多语言KGQA的 Zero-shot 跨语言转换

笔记整理:谭亦鸣, 东南大学博士生来源:NAACL21链接:https://aclanthology.org/2021.naacl-main.465/概述为了扩展多语言知识图谱问答的应用,Zero-shot方法成为一个研究趋势。在Zero-shot的设定下,通过高资源语言的训练…

LeetCode 1172. 餐盘栈(栈 + set)

1. 题目 我们把无限数量 ∞ 的栈排成一行,按从左到右的次序从 0 开始编号。每个栈的的最大容量 capacity 都相同。 实现一个叫「餐盘」的类 DinnerPlates: DinnerPlates(int capacity) - 给出栈的最大容量 capacity。void push(int val) - 将给出的正…

Hive SQL的编译过程

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和性能对我们的数据分析非常关键。 在几次升级Hive的过程中&…

Prompt tuning新工作,五个参数解决下游任务 fine-tuning

文 | 小伟编 | 小轶前言自从Google石破天惊地发布Bert以来,NLP就进入了预训练语言模型的时代。众所周知,我们可以用预训练语言模型来学习各种各样的任务,即使它们的特征空间有比较大的差异。那么预训练语言模型为什么会有这种泛化能力呢&…

会议交流 | 如何将图谱实体与关系更好的向量化,并基于推理扩充知识边界?——DataFun Summit2022知识图谱在线峰会...

背景介绍知识图谱是对人类先验知识的概括,具有重要的学术价值和广泛的应用前景。在深度学习广泛应用环境下,知识图谱的表示学习通过将图谱实体和关系向量化,便于利用深度学习技术实现异质信息融合;同时,基于这种图谱表…

真正的高阶特征交叉:xDeepFM与DCN-V2

文 | 水哥源 | 知乎Saying1. xDeepFM和DCN-V2是真正的高阶交叉,和前面讲的High Order Factorization Machine(HOFM)又有着千丝万缕的联系。某种简化下,都能退化为HOFM的形式2. 如图3. 推荐模型迭代的时候要平衡涨点和复杂度的关系…

学术会议 | 中国杭州举办——第21届国际语义网大会​ISWC2022 Call for Papers

中国杭州举办!ISWC2022 Call for Papers.ISWC(International Semantic Web Conference)是语义网和知识图谱领域的国际顶级学术会议,2022年10月23-27日,ISWC将在中国杭州举行,通过线上线下结合的方式,汇聚全世界相关的科…

LeetCode 82. 删除排序链表中的重复元素 II(链表)

1. 题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5示例 2: 输入: 1->1->1->2->3 输出: 2->3来源:力…

从 ACL’22 投稿情况,速览当下 NLP 研究热点!

文 | Yimin_饭煲编 | 小轶卖萌屋的作者们,最近可真是忙秃了头~,不仅要苦哈哈地赶 ACL 2022 提前了两个月的Deadline,还要尽心尽力为读者们提供高质量的内容。如果大家心疼卖萌屋的作者们的话,还请多多一键三连:)ACL2022 全部转向了…

开源开放 | DeepKE发布新版本:支持低资源、长篇章、多任务的图谱抽取开源框架(浙江大学)...

OpenKG地址:http://openkg.cn/tool/deepkeGitHub地址:https://github.com/zjunlp/deepkeGitee地址:https://gitee.com/openkg/deepkeDeepKE网站:http://deepke.zjukg.org/CN/index.html开放许可协议:GPL 3.0贡献者&…

LeetCode 478. 在圆内随机生成点(概率)

1. 题目 给定圆的半径和圆心的 x、y 坐标,写一个在圆中产生均匀随机点的函数 randPoint 。 说明: 输入值和输出值都将是浮点数。圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。圆周上的点也认为是在圆中。randPoint 返回一个包含随机点的x坐标和y坐标…

11月AI大事件回顾:GPT3开放使用/女娲视觉大模型/AE文艺复兴/...

编 | iven感谢提供本期内容的 ZenMoore、 jxyxiangyu、付瑶大家好~ 11月的新闻速报来啦!上个月不知道大家有没有忙着写文章,反正小编是这样的:好啦,让我们快来回顾上个月的 AI 大新闻吧!学术进展何恺明 Mas…

开源开放 | 开源立体化漏洞情报知识图谱(四维创智)

OpenKG地址:http://openkg.cn/dataset/vuln-sprocket开放许可协议:CC BY-SA 4.0 (署名相似共享)贡献者:四维创智(李德斌,孙基栩,鲍晨阳)1. 前言随着时间的推移&#xff0…

LeetCode 515. 在每个树行中找最大值(层序遍历)

1. 题目 您需要在二叉树的每一行中找到最大的值。 示例: 输入: 1/ \3 2/ \ \ 5 3 9 输出: [1, 3, 9]来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row 著作…

GBDT是如何成为推荐系统顶级工具人的?

文 | 水哥源 | 知乎Saying1. 集成学习的ensemble注意一定要读作昂三姆包而不是印三姆包,一天一个算法工程师装x小技巧2. 区别bagging和boosting的准则是,先训练的模型对于后训练的模型是否有影响3. GBDT中,B(boosting)…

会议交流 | 如何提升推荐系统的可解释性?——DataFunSummit2022知识图谱在线峰会...

背景介绍知识图谱及特征学习结合智能推荐,可解决数据稀疏性及冷启动问题,更好的提升推荐决策场的准确性、多样性及可解释性,进而提升各个场景的推荐决策效率和体验。3月12日13:30-16:50,在DataFunSummit2022:知识图谱在…

LeetCode 143. 重排链表(链表反转+快慢指针)

1. 题目 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为…

论文浅尝 | 采用成对编码的图卷积网络用于知识图谱补全

笔记整理:姚祯,浙江大学在读硕士,研究方向为知识图谱表示学习,图神经网络。论文引用:Liu S, Grau B, Horrocks I, et al. INDIGO: GNN-based inductive knowledge graph completion using pair-wise encoding[J]. Adva…

调研了下 AI 作曲,顺便做了期视频...快进来听歌!

文 | 白鹡鸰编 | 小轶视频 | 白鹡鸰嗨,大家好!这里是卖萌屋,我是白鹡鸰。今天和大家聊聊人工智能作曲。人工智能在音乐领域的应用已经非常常见了,像听歌识曲、曲风分类、自动扒谱等等,而 利用机器来替代人类作曲 &…