基础算法
数据库
Javascript
HTML 编程
SVG
附录
假如有这样一个应用场景,如果对 INPUT 输入框的值进行控制,要求获取或设置时必须全部转成大写字母。当然,实现这个功能的方式太多了,这里只介绍一种大家最不可能用到的实现方式:当获取或设置时对逻辑进行拦截,增加一些自己的处理逻辑。
这里仅提供一种编程思路,真实情况应该不对这么玩。实现思路如下:
value
属性。getter
和setter
,可以由使用者自己添加切面逻辑。value
逻辑中执行切面逻辑。在之前的一篇笔记中介绍了扩展原生标签属性的方法,请参阅 扩展 HTML 原生标签(上),里面的一些注意事项不再重复。
先上代码。
代码解释如下:
HTMLInputElement.valueDescriptor
用于保存 INPUT 标签value
属性原生的 getter 和 setter。不能在value
重定义逻辑中使用this.value
这样的操作,会造成堆栈溢出。HTMLInputElement.executeAopFunction
用于执行自定义的 getter 或 setter 函数,支持函数或字符串。HTMLInputElement.prototyoe.getter
和HTMLInputElement.prototyoe.setter
分别定义了一个getter
和setter
属性。Object.defineProperty
用于重新定义 INPUT 标签的value
属性。value = HTMLInputElement.valueDescriptor.get.call(this)
用于执行原生的 getter 逻辑,即原来是value = this.value
。HTMLInputElement.valueDescriptor.set.call(this, value)
用于执行原生的 setter 逻辑,即原来是this.value = value
。$('#UPPER').getter
假设有一个文本框 id 为UPPER
,这里为这个文本框定义了一个 getter 逻辑,函数形式。$('#UPPER').setter
为文本框定义了一个 setter 逻辑,字符串形式。这一节跟切面没什么关系。
每个标签都有一个getAttribute
方法,用于获取自定义标签属性的值。属性名称如attr-name
和attrName
都是合法的属性值(其实任意字符都可以),且不区分大小写,建议属性值使用第一种的连字符格式。但是元素属性都是 Camel 格式,现在要求无论传入的是 Camel 格式还是连字符格式,都能获取到相应的属性值。
解决思路如下:
getAttribute
方法。getAttribute
方法。getAttribute
方法添加逻辑并执行原生getAttribute
方法。上代码。
代码解释:
getAttribute
属性是所有元素标签都有的,所以在 HTMLElement 类中。HTMLElement.prototype.getAttribute
是getAttribute
属性的原生逻辑。将逻辑保存在自定义全局变量HTMLElement.getAttribute
中,其中的getAttribute
是变量名,HTMLElement
是保存这个变量的类,其实命名成什么保存在哪里无所谓。HTMLElement.prototype.getAttribute = function ..
是通过原型来重新定义 HTMLElement 类的getAttribute
属性。HTMLElement.getAttribute.call(this, attrName)
是调用原生的getAttribute
方法。toCamel
和toHyphen
是自定义的字符串方法,分别将属性名转成 Camel 或连字符格式,代码略。??
是空值合并运算符,当左面的值为null
或undefined
时才取右面的值。这里当所有类型的属性都检查一次后,如果都为null
则说明没有设置这个属性,则返回默认值。好像就这么多。有问题请提交反馈。
(本文完)