当前位置: 首页 > news >正文

免费网站安全/优化大师官方网站

免费网站安全,优化大师官方网站,网站公司优势,濮阳哪里做网站本版本对循环绑定做了巨大改进,感谢soom, limodou, ztz, Gaubee 提供的大量测试文件。 fix scanNodes, 在循环绑定(ms-each)扫描元素节点时必须 nextTick,否则旧式IE会忙碌不过来。 fix ms-css ,旧式IE style[name] value, 当value为NaN &am…

本版本对循环绑定做了巨大改进,感谢@soom, @limodou, @ztz, @Gaubee 提供的大量测试文件。

  • fix scanNodes, 在循环绑定(ms-each)扫描元素节点时必须 nextTick,否则旧式IE会忙碌不过来。
  • fix ms-css ,旧式IE style[name] = value, 当value为NaN ,不带单位或不是数值什么会抛异常,需要try catch。
  • 旧式IE下有些元素的innerHTML是只读的, 因此不能一律使用innerHTML,并且有些元素的生成,如script标签是不会执行,为此我引入新的parseHTML模块来处理此事。
  • fix AMD 加载因为手误进错分支的BUG
  • fix scanExpr bug, 它在IE10有时会多生成一个绑定对象,异致不渲染错误。
  • 重构Collection内部对象与ms-each绑定,引入“事务”的概念,让其插入节点时更加智能高效。

我们看最后一条,我们可以类似纯JS操作为内存操作,DOM操作为IO操作,执行一万次前者所需的时间可能还比不上一次后者的。DOM操作的开销就是这么大。有的DOM操作还会引起reflow,这危害更大。因此明智的做法就是将要操作的节点移出DOM树。更好的办法是,此多个DOM操作合成一个,全部在文档碎片中搞完才插入DOM树。

我们看下面的注解:


<div ms-controller="box"><div ms-each-el="array" id="aaa"><p>{{$index}}----{{el}}</p></div>
</div>
avalon.define("box", function(vm) {vm.array = [1, 2, 3, 4, 5]
})实现过程
当扫描到div#aaa 将div#aaa的所有子节点复制一份到文档碎片vTemplate执行begin命令,将vTemplate复制一个空的文档碎片vTransation( cloneNode(false) ), 设置全局变量flagTransation = true;开始循环数组执行insert命令将vTemplate复制一个文档碎片vEl( cloneNode(true) ), 将对应的子VM与它进行扫描此时它的内容应为 <p>0 --- 1</p>将vEl appendChild到 vTemplate.....重复执行array.length次执行commit命令,将vTemplate append到div#aaa节点中, 设置全局变量flagTransation = false
重新排列所有$index

在数组有关添加元素的push, unshift, splice这三个方法中,都调用了add方法,它里面就默认使用事件进行处理。

        array._splice = array.splicearray.add = function(arr, insertPos) {insertPos = typeof insertPos === "number" ? insertPos : this.length;notifySubscribers(this, "begin")for (var i = 0, n = arr.length; i < n; i++) {var el = convert(arr[i])var pos = insertPos + ithis._splice(pos, 0, el)notifySubscribers(this, "insert", pos, el)}notifySubscribers(this, "commit", insertPos)if (!this.stopFireLength) {return dynamic.length = this.length}}

notifySubscribers会向上通知updateListView方法,然后让它执行相关的DOM操作

case "begin":list.vTransation = data.vTemplate.cloneNode(false)flagTransation = truecase "insert"://将子视图插入到文档碎片中var tmodel = createVModel(pos, el, list, data.args)var tview = data.vTemplate.cloneNode(true)tmodel.$view = tviewvmodels = [tmodel].concat(vmodels)tmodels.splice(pos, 0, tmodel)scanNodes(tview, vmodels);data.group = ~~tview.childNodes.length //记录每个模板一共有多少子节点list.vTransation.appendChild(tview)breakcase "commit":pos = ~~pos//得到插入位置 IE6-10要求insertBefore的第2个参数为节点或null,不能为undefinedvar insertNode = parent.childNodes[ data.group * pos] || nullparent.insertBefore(list.vTransation, insertNode)flagTransation = falseresetItemIndex(tmodels)break

嘛,不过这次改动太大了,有关Collection与bindingHandlers["each"]的代码都几乎改清光。另一个值得一提的是VM数组在腓序时,与视图的同步。这里涉及如何让一个数组基于另一个数组进行排序,我的解决方式如下:

  var aaa = [1, 2, 3, 4, 5, 1]var bbb = [{v: 2}, {v: 3}, {v: 1}, {v: 1}, {v: 5}, {v: 4}]var swapTime = 0var isEqual = Object.is || function(x, y) {//主要用于处理NaN 与 NaN 比较if (x === y) {return x !== 0 || 1 / x === 1 / y;}return x !== x && y !== y;};for (var i = 0, n = bbb.length; i < n; i++) {var a = aaa[i];var b = bbb[i]var b = b && b.v ? b.v : bif (!isEqual(a, b)) {console.log(++swapTime)var index = getIndex(a, bbb, i);var el = bbb.splice(index, 1)bbb.splice(i, 0, el[0])}}function getIndex(a, bbb, start) {for (var i = start, n = bbb.length; i < n; i++) {var b = bbb[i];var check = b && b.v ? b.v : bif (isEqual(a, check)) {return i}}}console.log(JSON.stringify(bbb))
//在框架中,aaa为数据模型M中的数组,bbb为视图模型VM中的数组

如果有更好的算法,请多多指教。

经过这次大重构后,avalon在API上基本没有变化了,未来的v0.9就是fix BUG然后发布正式版。

迷你MVVM框架在github的仓库https://github.com/RubyLouvre/avalon

官网地址http://rubylouvre.github.io/mvvm/

大家可以加入QQ群:79641290进行讨论,此群为技术群,禁水!

http://www.lbrq.cn/news/1313659.html

相关文章:

  • 宁波建网站报价/企业网站优化方案
  • 网站建设军成/百度云网盘资源搜索引擎入口
  • 用flask做网站/合肥seo优化公司
  • 山东手机网站建设公司/莱阳seo排名
  • 建设厅安全员证书查询网站/开淘宝店铺怎么运营推广
  • 在统计局网站上如何做图表/企业培训课程视频
  • 网络营销网站建设知识/深圳seo公司
  • 临淄区建设局网站/竞价推广代运营服务
  • 网站可以个人做吗/如何广告推广
  • 企业网站 建设 外包/电子商务是干什么的
  • 网站产品展示怎么做/互联网运营推广是做什么的
  • 科技信息网站建设的背景/桂林seo顾问
  • 网站开发 沈阳/品牌推广活动策划案例
  • 无锡网站建设公司排名/百度开户联系方式
  • 网站怎么更换服务器/西安关键字优化哪家好
  • 企业网站色彩/百度搜索趋势
  • 问卷调查网站JAVA怎么做/客服外包平台
  • 酷炫网站源码/通州区网站快速排名方案
  • 中原区网站建设/seo裤子的关键词首页排名有哪些
  • 同一个公司可以做几个网站吗/活动推广
  • 31省市今天新增疫情最新消息/百度seo优化推广
  • 网站快速收录的方法/线上广告接单平台
  • 杭州企业网站/湖南网站建设加盟代理
  • 同性男做的视频网站/百度收录快的发帖网站
  • 网站建设网站公司/seo和sem是什么
  • 设计师推荐网站欣赏/怎么做网站广告
  • 恒华大厦做网站公司/中国互联网公司排名
  • 用织梦做网站费用/怎么样把广告做在百度上
  • 做租凭网站是经营性吗/百度浏览器官网入口
  • 网站建设发展史/企业推广视频
  • 【开源.NET】一个 .NET 开源美观、灵活易用、功能强大的图表库
  • 工作第一步建立连接——ssh
  • 个人笔记(linux/sort与uniq命令)
  • 网络安全初级(XSS-labs 1-8)
  • LVS集群搭建
  • 电脑安装 Win10 提示无法在当前分区上安装Windows的解决办法