西红柿爱番茄

Feed Rss

文章标签 ‘Javascript’

按需加载,顾名思义就是在用户需要这个功能的时候就初始化这个功能,加载相关的脚本和样式文件等等。普通我们使用的方式,就是在需要的时候,就添加一个文件的url进行加载,并且用一个对象来记录已经加载过的文件。这种方式有些散乱,对于是随意加载的,那倒是不可避免,但是对于一个项目来说,页面的的功能和相应的文件是确定的,那么还是使用上面的方式的话,那么在后期的维护上会比较混乱,增加了成本。 对项目之外的文件加载,使用普通的方式散乱在代码中,也不太合适,那么就需要一个封装的加载器,统一加载文件的接口和调用方式。我下面将要讲的“加载器”,不是传说中的模块化中的加在方式,我更多的是从代码维护方面来考虑,使得一目了然的看到页面本身的功能需要按需加载一些什么文件列表,并且可以标记已经加载的文件,而不会使得url散乱在页面中。 //需要按需加载的内部文件列表映射 mis.classFiles = { ‘AjaxEvent’: ‘includes/ajax.lib.js’, ‘AjaxRequest’: ‘includes/request.lib.js’, ‘colorFade’: ‘includes/effects.lib.js’ } //标记已经include的内部文件 mis.includedFiles = {}; //对内的文件加载 mis.include = … 了解更多

条件表达式通常有两种表现形式,第一种:所有分支都是属于正常行为;第二种:条件表达式提供的答案只有一种是正常行为。其他都是不常见的情况。如果两条分支都是正常行为,就应该使用if~else的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。 function getPayAmount(){ var result; if(isDead) result = deadAmount(); else{ if(isSeparated) result = separatedAmount(); else{ if(isRetired) result = retiredAmount(); else … 了解更多

检测外联js是否加载完毕,这个相对来说比较简单,只需要处理onload和onreadystatechange在非IE和IE下做兼容,但是需要检测外联的CSS文件是否加载完毕,这个就有点恶心了,大致分成了三类:IE和Opera;Chrome和Safari、FF,这时候FF没有跟着大部队走了,这或许也是FF中的一个bug。 最理想的方式,无非就是统一使用onload来检测link元素是否加载完毕。但是事不与程序猿人愿~ 但是兼容办法还是有的。 在IE、Opera下,可以直接使用onload、onreadystatechange这两种方式都可以检测link元素是否加载完成,跟检测script一样的原理。 在Chrome、Safari等基于Webkit内核的浏览器下,估计就要监控document.styleSheets.length的变化了。Webkit内核的浏览器在处理document.styleSheets.length的方式是这样的,当加载完了一个link之后,length就会加1,那么这样的话,就可以使用setInterval的方式来检测length的变化了,对于同时检测多个link是否加载完成的方式也可以利用这个,看length增加了多少。《测试用例》示例如下: [javascript] var link = document.createElement("link"); var cn = document.styleSheets.length; var ti = setInterval(function() { if … 了解更多

网上看到的一篇文章,说的是js脚本优化的十条细则,看了下文章,优化的知识都很普通,搞前端的人都知道,罗列一下,增强记忆吧: 定义局部变量。对于当前函数作用域内,如果需要使用这个作用域外部的一些变量,那么就尽量使用局部变量储存外部的变量吧,特别是对于嵌套多级的作用域查询,这个耗时也是比较严重的。还有就是获取DOM节点、NodeList、HTMLCollection等等,可以将NodeList、HTMLCollection转化为数组的形式进行操作,减少DOM即时更新所造成的性能消耗。 不要使用with语句。with语句会在当前作用域下面增加作用域链,造成当前作用域下面变量的遍历性能消耗更大。 对于闭包的使用,节省点,不要太过多了。闭包就是提供一个所谓的“封闭式”的作用域,只允许向包含它向别人访问,而不允许别人访问它。但是声明一个闭包的代价比声明普通的函数的代价是要更高的,况且还有IE下内存泄漏的危险。 获取字面量对象的属性和数组的项比获取变量更慢。如果你要获取一些数据的时候,使用变量比用数组、字面量对象的索引来访问来的更快。在循环中经常会需要访问数据,使用变量存储一下,来的更快。 在数组中不要嵌套的过深。js中没有二维数组的概念,但是可以自己编写一个二维数组,并且可以无限的嵌套下去,json很经常就是这么干的。但是嵌套的越深,访问数组中的项就更难了,级数和性能消耗成正比的。 少用for-in循环。众所周知,for-in用于遍历对象的属性和方法,它所要消耗比for、while、do-while更多的性能。在for-in循环中,对于每一个循环,javasript需要创建一个函数来处理每一个循环,这就带来这么两个性能问题:函数创建、销毁的过程;这个函数在创建之后,又会储存它直接上级的作用域的活动对象。 对于循环,合并控制循环的语句,以及控制变量变化方式。在一个控制循环的语句中,比如循环结束条件、索引的递增等等,如果可以优化这些操作,那么对于整个循环的性能是有帮助的。比如对于结束循环条件:for(var i =0;i

javascript的加载方式,总得来说是在页面上使用script来声明,以及动态的加载这些方式,而动态的加载,在很多js库中都能够很好的去处理,从而不至于阻塞其他资源的加载,并与其并行加载下来。这样的动态异步的加载方式罗列起来有:Ajax的方式、DOM Element Insert、Iframe、document.write、defer等等。这些都能够很好的处理js在加载的时候不会阻塞资源加载的问题,但是,js的执行仍然会阻塞浏览器的渲染。或许这是不得不需要付出的代价,有没有一些方式去缓解js在执行的时候对浏览器的渲染所造成的延迟的影响呢? 首先,让我们从UI Thread、UI Queue、UI Upate的角度去分析整个页面和javascript的行为。浏览器在加载HTML到最后呈现出来的这段过程,整个就是一个UI Thread进程,这个UI Thread里是一个浏览器的响应队列,而UI Queue则是浏览器的行为队列,包括UI Update,javascript的执行行为。那么在页面加载的过程中,UI Queue里面就储存了UI Update、js加载、js解析、js执行等。不管是UI Thread,还是UI Queue,都是按照顺序来的。页面在刚开始未遇到js的加载和执行的时候,是UI Update的一个过程,一旦遇到js,就会等待js的加载、解析、执行完毕之后,接着又开始UI Update,如此这样的一个相应顺序。

今天逛网的时候,看到一种技巧是将js代码和css代码混合在一起,利用CSS parser和Js parser的解析原理,来区分两种不同的代码。这个技巧估计老早就有人知道并讨论的乱套了,我又凹凸了一回。(合并javascript和css作为一个文件,Combine CSS with JS and make it into a single download!,Squeeze CSS and JS into one file) 起初看到这个标题觉得很惊奇,细看了上面罗列的文章之后,发现也只是利用了解析器的原理(解析器本来就是这么设计的,或许不是bug吧),对<!- … 了解更多