
发表日期: 2021-05-19 17:03:26 浏览次数:90
汶上网站优化【汶上开通400电话】汶上网站搭建、汶上微信公众号推文外包、汶上开通京东拼多多设计、汶上淘宝装修

汶上地处山东省西南部,东临古城兖州,西接水泊梁山,南依微山湖,北枕东岳泰山。东经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]
Safari浏览器不支持build-in自定义元素,只支持匿名自定义元素。
兼容性如下图所示:
也就是Safari默认仅支持下面这种HTML格式的UI组件:
<ui-tips></ui-tips> <ui-drop></ui-drop> <ui-tab></ui-tab> <ui-lighttip></ui-lighttip>
不支持下面这种通过is属性在原生HTML元素上扩展的web components组件。
<input is="ui-color"> <select is="ui-select"></select> <form is="ui-form"></form> <table is="ui-table"></table>
这就麻烦了,本来很帅气的UI组件,如果只能使用匿名自定义元素实现,就很啰嗦与乏味。
或者,狠狠心,无视Safari浏览器用户群体,可以的,等着被解雇就行。
所以,最好的解决方法就是让Safari浏览器也支持内置自定义元素组件的开发。
怎么办呢?
解决方法比较简单,有专门polyfill,只要引入就可以了。
项目地址:
https://github.com/WebReflection/custom-elements-builtin
适用于支持自定义元素,但是不支持内置自定义元素的场景,主要就是针对Safari浏览器。
其中的index.js是非压缩版,es.js是压缩版。
使用的时候可以直接这么使用:
<!-- HTML文档的顶部 --><script>if (!(self.chrome || self.navigator))
document.write('<script src="//unpkg.com/@webreflection/custom-elements-builtin"><\x2fscript>');</script>不过if判断外加document.write并不是一个好用法,但是,我们直接引用 //unpkg.com/@webreflection/custom-elements-builtin 这个地址也是不行的。
因为这个Polyfill中并没有对浏览器进行区分,按照作者的话,就是浏览器的特性是一直变化的,做浏览器类型判断是不靠谱的。
上面这句话没错,但是,我们可以不进行浏览器区分,直接基于API特性区分就好了。
于是,我对原始的JS代码做了内置的判断处理。
判断逻辑如下代码所示:
class AnyClass extends HTMLBRElement {
constructor () { super(); this.someMethod = true;
}
}if (!customElements.get('any-class')) {
customElements.define('any-class', AnyClass, { extends: 'br'
});
}// 是否支持 build-in custom elementconst isSupportBuildIn = document.createElement('br', {
is: 'any-class'}).someMethod;基于特性判断是很安全的,如果浏览器支持内置自定义元素,则 isSupportBuildIn 的返回值就是 true,如果浏览器不支持,则会是 undefined。
优化后的JS代码我已经开源了,放在了gitee上,详见:https://gitee.com/zhangxinxu/build-in-custom-element-polyfill
欢迎大家关注我的这个gitee账号。
这段Polyfill真的挺神奇的,原来的Web Components代码无需任何修改,组件功能在Safari浏览器下完美支持,所有组件都运行良好。
然后,真正到业务代码中,进行组件传参处理的时候,发现问题了。
例如,引用代码如下:
<script src="safari-polyfill.js"></script><script type="module" src="my-components.js"></script><script type="module">myComponent.someMethod();</script>
在原生支持内置自定义元素的浏览器下,myComponent.someMethod() 方法是可以正常执行的。
但是在Safari浏览器下,就会报错,undefined不能作为function函数执行。
原因在于,safari-polyfill.js 由于实现机制的限制,会让自定义元素初始化的时机比原生浏览器更靠后。
也就是在Safari浏览器下,myComponent.someMethod() 方法执行的时候,myComponent这个元素还没有变成内置自定义元素。
因此,执行会出错。
我的解决方法是这样的,在 connectedCallback 生命周期函数中触发一个自定义的 'connected' 事件,这样,就可以通过绑定 'connected' 事件的方式保证业务代码执行的时候,元素已经完成了组件化。
代码示意,组件中的代码部分:
connectedCallback () { this.dispatchEvent(new CustomEvent('connected'), { detail: { type: 'my-components'
}
});
}然后,业务代码改造成这样就可以了:
<script src="safari-polyfill.js"></script><script type="module" src="my-components.js"></script><script> myComponent.addEventListener('connected', function () { this.someMethod();
});</script>这样就可以保证 someMethod() 方法执行的时候,组件一定已经完成了初始化。
服务热线
顶部
备案号: 苏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