收藏此站 联系我们 网站
当前位置:首页» 行业网站案例 » 【建站服务】汶上网站优化【汶上开通400电话】汶上网站搭建、汶上微信公众号推文外包、汶上开通京东拼多多设计、汶上淘宝装修-域名申请

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

作者: 风兰 . 阅读量: 6 . 发表时间:2022-09-20 15:39:29

网站建设

上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


汶上网站优化【汶上开通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"></script>');</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 手机微信同号:18118153152(各城市商务人员可上门服务)


关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站

全国服务热线
18114747181
二维码
手机端二维码
上往建站
地址:全国各地都有驻点商务 |  网站建设上往建站
在线咨询QQ:1120768800
 
QQ在线咨询
售前咨询热线
18114747181
营销顾问
营销顾问
售后服务热线
400-000-1116
售后服务
售后服务