
发表日期: 2021-05-19 16:58:41 浏览次数:96
汶上网站推广【汶上办理400电话】汶上SEO优化、汶上微信公众号APP客户端小程序开发、汶上网站托管、汶上APP开发

汶上地处山东省西南部,东临古城兖州,西接水泊梁山,南依微山湖,北枕东岳泰山。东经116°40′—116°18′北纬35°31′—35°36′,大部分地区处于平原地带,汶上县属北温带大陆性季风湿润气候区。 [1]
汶上县境内有大汶河,小汶河流经北部以及西部,又有泉河等河流流经中东部而后汇流到小汶河,包括县域下面的地下水也全部源于汶水的补给,汶上整个县域地处汶水之上,因此得名汶上。
2012年,汶上县地区生产总值完成200亿元。2018年12月13日,汶上县入选中国特色农产品优势区名单。 [2] 2019年2月2日,被国家中医药管理局评为县级全国基层中医药工作先进单位。 [3] 2020年7月29日,入选2017-2019周期国家卫生乡镇(县城)命名名单。 [4]
例如有一个很普通的输入框,HTML代码如下所示:
<input id="input">
此时,用户输入内容,或者粘贴内容,或者拖拽内容到输入框,都会触发input事件,失焦后会触发change事件。
但是有一个是例外,那就是如果使用value属性赋值,无论是input事件还是change事件都不会触发。
例如:
input.value = '张鑫旭'; // 不会触发change事件
需要我们手动触发下change事件,示意:
input.value = 'zhangxinxu';// 手动触发change事件input.dispatchEvent(new CustomEvent('change'));显然,这样的处理就很啰嗦,dispatchEvent,CustomEvent这样的API对不少开发者而言是陌生的。
那有没有办法直接value赋值也能触发change事件呢?
我们组的XboxYan (严文彬)提供了一种解决方案,就是使用getOwnPropertyDescriptor方法先把浏览器原生的value赋值方法存下来,然后重新自定义value赋值方法,在重新自定义的value属性的set方法中注入change事件的触发。
JS代码示意如下:
const props = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(HTMLInputElement.prototype, 'value', {
...props,
set (v) {
let oldv = this.value;
props.set.call(this, v); // 手动触发change事件
if (oldv !== v) {
input.dispatchEvent(new CustomEvent('change'));
}
}
});我们不妨测试下,有如下HTML代码:
<input id="input"> <p id="result"></p>
然后我们绑定change事件,然后再执行value赋值方法,代码如下所示:
input.addEventListener('change', function () {
result.innerHTML += this.value;
});
input.value = 'zhangxinxu';运行后可以看到下面截图所示的效果,p#result元素内自动填充了 ‘zhangxinxu’ 这几个字符。
Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。
所谓自有属性,指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性。
属性描述符也是个对象,英文叫做property descriptor,属性描述符也包含访问访问器函数(getter)的get方法和获取设置器函数(setter)的set方法,因此,上一节示意代码中的props.set其实指的就是浏览器原生的value赋值时候的设置器函数,包含了浏览器原生的行为。
属性描述符对象支持的属性和方法包括:
value
该属性的值。
get
获取该属性的访问器函数,没有返回undefined。
set
获取该属性的设置器函数,没有返回undefined。
writable
当且仅当属性的值可以被改变时为true。
configurable
当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
enumerable
当且仅当指定对象的属性可以被枚举出时,为 true。
还有个类似的静态方法名为 Reflect.getOwnPropertyDescriptor(),大家有兴趣可以访问对应的MDN文档了解一番。
getOwnPropertyDescriptor() 方法自定义value属性后,不仅可以用来触发change事件,我们还可以主动触发输入框元素的渲染。
例如LuLu UI Edge主题中的颜色选择输入框支持 #RRGGBBAA 颜色格式,如下图所示:
原生的color输入框在设置value属性值为#RRGGBB色值时会自动变色,但是这里的color-opacity输入框是自定义的,并不识别#RRGGBBAA色值,此时就需要对value属性进行处理,赋值的时候自动改变输入框的UI,其原理和上面触发change时间类似。
代码示意:
class Color extends HTMLInputElement {
constructor () {
super();
}
...
}
const props = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(Color.prototype, 'value', {
...props,
set (value) {
let strValue = value; // 目前的颜色值
let strOldValue = this.value; // UI同步匹配
this.uiMatch();
// 赋值
props.set.call(this, strOldValue); // change事件触发
if (strOldValue && strValue != strOldValue) {
this.dispatchEvent(new CustomEvent('change', {
'bubbles': true
}));
}
}
});此时给输入框执行 input.value = '#EB46467D' 就可以看到UI变化了。
// zxx: 实际上上面色值不对,和设计不符,左上50%应该是纯色,而不是和黑色的混合色,我这几天抽空处理下。
服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878