当前位置: 网站首页>小程序开发>网站制作

汶上网站优化【汶上开通400电话】汶上网站搭建、汶上微信公众号推文外包、汶上开通京东拼多多设计、汶上淘宝装修

发表日期: 2021-05-19 17:03:26 浏览次数:90

汶上网站优化【汶上开通400电话】汶上网站搭建、汶上微信公众号推文外包、汶上开通京东拼多多设计、汶上淘宝装修

网站建设.jpg

汶上地处山东省西南部,东临古城兖州,西接水泊梁山,南依微山湖,北枕东岳泰山。东经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又拖后腿了

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 build-in custom element

解决方法比较简单,有专门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() 方法执行的时候,组件一定已经完成了初始化。


汶上网站优化汶上开通400电话汶上网站搭建、汶上微信公众号推文外包、汶上开通京东拼多多设计、汶上淘宝装修

400-111-6878
服务热线
顶部

备案号: 苏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