西红柿爱番茄

Feed Rss

思路:使用一个储存器,将不同“职责”的处理函数储存起来,之后通过一个统一入口,来处理储存器中的的“职责”函数,将执行有效的结果,立即返回,到此,职责处理完毕。

应用

  1. 在对于传递不同的参数来处理不同的功能;
  2. 将功能分“职责”,结构清晰,功能分明;
  3. 使用函数的方式,来代替了函数 内部的if逻辑过于负责的判断,可以无限的扩展,最重要的是,可以在不不动原来的函数的基础上,就可以添加其他的“职责”处理函数;
/**职责链模式的思维*/

//储存器
var middleware = [];

function turning(){
  var ret;
  if(arguments.length > 0){
    for(var i = 0,len = middleware.length; i < len; i++){
	  //执行每一个“职责”处理函数
      ret = middleware[i].apply(turning,arguments);
	  //如果有返回结果,表示middleware当前item的执行有效,就立即返回结果
	  if(ret){
	    return ret;
	  }
    }
  }
}

//添加“职责”处理函数
turning.init = function(fn){
  middleware.unshift(fn);
}

//在这里可以添加非常多的类似职责的处理函数
turning.init(function(a){
  if(a === "hello"){
    return a + " world";
  }
});

turning.init(function(a,b){
  if(typeof a === 'number' && typeof b === 'number'){
    return a + b;
  }
});

//开始应用了
alert(turning("hello"));
alert(turning(5,9));

重构–改善既有代码的设计》这本书是去年买的了,利用晚上空闲时间看了大部分的内容,包括一些重构的技巧、良好代码的特点、代码可读性和提高语义化等。这本书改变了很多我之前所持有的观念,包括代码性能、模块化设计、结构样式逻辑分离等的思维。下面粗略的罗列几点目前自己从这本书中所理解到的其中一些知识:

重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地进行。
第一次做某件事情时只管去做;第二次做类似的事情会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构。 ——“事不过三,三则重构。”

了解更多

检测外联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 (document.styleSheets.length > cn) {
alert("CSS loaded");
clearInterval(ti);
}
}, 10);

link.href="http://www.ilovejs.net/lab/css.php";
link.rel = "stylesheet";
document.getElementsByTagName("head")[0].appendChild(link);
[/javascript]

但是在Firefox下,情况就有些恶心了,所使用到的方式跟上面的两类浏览器的处理方式都不太相同。对于document.styleSheets.length的处理也不同于Webkit,它的处理方式是只要link元素一附加到document之后,length就会立即加1,而不管css文件是否加载完毕(测试用例如上面的链接)。为此,对于Firefox的处理方式,使用style标签,而不是link,并且使用传统的@import的方式,通过判断style.sheet.cssRules是否存在来检测css文件是否加载完成,具体如下所示《测试用例》:

[javascript]
var head = document.getElementsByTagName("head")[0];

var style = document.createElement(‘style’);
//加载css.php文件,需要2秒之后才会返回响应内容
style.textContent = ‘@import "http://www.ilovejs.net/lab/css/css.php"’;
style.rel="stylesheet";

var fi = setInterval(function() {
try {
style.sheet.cssRules; // 这句是关键,在css加载完成的时候,style元素就会有这么个对象。

alert("CSS loaded");

clearInterval(fi);

} catch (e){}

}, 10);

head.appendChild(style);
[/javascript]

为此,想要写一个兼容性的检测CSS文件是否加载完成的代码,估计看起来会比较丑陋,差异大,处理的方式各异,期待onload统一的那一天咯~~

最近发现自己的代码产出率下降多了,在编码期间会不断的去推敲代码是否合适,是否做到了该有的优化、语意化、代码分离、提高代码复用、增强代码的可读性。该让HTML做的事情,就尽量让HTML去做;能用HTML、CSS去帮助JS一起实现的功能,就尽量依赖于HTML、CSS,来减少JS的代码量,同时也不失代码的分离,各司其职,互相独立,这或许是一个极端,让三者(HTML、CSS、JS)互相帮助,互相辅助(减少JS动态生成HTML的代码;较少多个样式设置的次数;减少HTML中包含CSS、JS代码;尽量少去删除和增加DOM树的节点;是用innerHTML来代替内容,还是简单的使用显示隐藏,或者replaceChild代替原来的节点。。。),而又不能互相在代码上互相嵌入,依赖过大,保持必要的分离,从而达到一个平衡的状态,那么在性能、代码量等等上就是一个很好的权衡。

有句话说的好:“当你感觉一个功能的代码已经无法再增加和删除代码了,那么就行了”。但是这种感觉以及代码的质量的如何,那就是个人的功底和经验是否丰富了。自我感觉良好有时候也是一种自我封闭,应该保持学习和改变的心态。

但是这样做的后果很明显,项目开发时间拉长了一些(除非在相同的开发时间里,加班加点完成),所以在代码质量、开发时间上是不能成正比的,需要一个权衡。而这个权衡很大的一部分在于上头对于代码质量是否有一定程度的要求,而在开发时间上能够尽量的放宽,当然开发者本身的功底对于实现该需求在质量和时间上是否能够达到一个平衡,也是其中的一点。关键还是看上头是否重视该需求吧。

对于一些小需求来说,可能要求是尽快的产出,上头对此的重视程度不高,只要实现了功能,对于是否影响用户体验没有过大的要求,那么这样也去反复推敲代码的质量,是否有必要呢?更多的是从习惯以及对自己以后的发展负责去考虑这个问题了,养成一定的良好的开发习惯,这或许对自己本身来说是非常重要的。

出于这样的一种开发想法:页面中可能会包含很多script、style行内标签用于各种细粒化控制的目的,在发布的时候,这些行内的script标签的代码并没有自动的合并为一个,这样导致已发布的页面中script标签过多,而且这样代码看起来也比较凌乱。这只是从代码组织方面的考虑,还有一个想法就是多人维护一个页面的代码,在添加新功能的时候,就无须考虑是否从已有的script标签中添加代码,放心的使用一个独立的script标签来编写代码,在开发编译之后,会将页面的这些script合并为一个。尽可能的减少赘余的script、style标签。

了解更多

对于压缩HTML的好与坏、利与弊,网上也已经谈论的很多,自己也搜集了一下,毕竟自己最近也在做这样的一个工具来压缩HTML代码,提出一下自己的见解以及一些设想。

支持不压缩HTML的原因有这样的一些考虑:去掉换行、多个空白之后可能会对样式有影响;pre标签形式压缩之后会失去原有的意义;IE条件注释不能够删除;只是压缩空白和注释收益不大,特别是在gzip压缩之后;压缩了代码,看源码不方便;性价比低,付出的技术成本跟收到的效果不成正比…。原因很多哎,所以造成了大部分的站点对于HTML都是未压缩的状态发布了。为什么不压缩 HTML

这几天思前想后,HTML压缩的意义在哪里?

了解更多