Javascript微模板引擎

1 comment , Tagged : , ,

Javascript微模板引擎,好吧,叫得这么好听其实就一简陋的前端模板。

后端模板大家应该听得比较多吧(Smarty,Velocity等),而前端我们通常是直接在JS里拼接我们需要的html,这种混合写在一起的方式,导致html结构稍微复杂点就很难看清楚,对维护造成一定的不便。所以人们就“发明”了模板这东西,使用一些特殊标记来代表数据循环、值替换等功能,使内容格式尽可能清晰。

模板的核心就是模板解析,下面要展示的引擎也仅有这个功能,没有其它扩展,要求不高的可以拿去试试!!下面我们来看一下该引擎的程序:

Duff’s Device优化循环性能

no comments , Tagged : ,

“Duff’s Device”是一个循环体展开技术,它使得一次迭代中实际执行了多次迭代的操作。它最早是在1983年C上由Tom Duff实现,然后2001年Jeff Greenberg移植到JavaScript上。

我们先来一个典型的实现方式:

//credit: Jeff Greenberg
var iterations = Math.floor(items.length / 8),
     startAt = Items.length % 8,
     i = 0;
do{
  switch(startAt){
    case 0: process(items[i++]);
    case 7: process(items[i++]);
    case 6: process(items[i++]);
    case 5: process(items[i++]);
    case 4: process(items[i++]);
    case 3: process(items[i++]);
    case 2: process(items[i++]);
    case 1: process(items[i++]);
  }
}while(--iterations);

Image.onload在IE下无法获取宽高的问题

no comments , Tagged : ,

今天在IE下想在onload事件获取img的宽高,但一直取不到值,就在网上搜索了一下,原来又是和顺序有关,XXX。我们先来看下面这个例子:

var img = new Image();
img.src = "test.gif";
img.onload = function(){
  alert ( img.width );
};

单纯这样看,并没不会觉得有什么问题。但在IE中存在BUG,第一次打开页面时还正常,之后就没反应了,怎么刷新也无效,这是因为图片已经被缓存在本地了。

var img = new Image();
img.onload = function(){
  alert ( img.width );
};
img.src = "test.gif";

我们现在改成上面这样,问题就解决了。我们还可以通过img.complete先来判断是否已缓存在本地,如果是那就不用用onload去获取了

要注意的是在IE6下,GIF含有多帧的图片会多次加载,所以在onload事件里,记得要把img.onload设置为null

iphone、ipad Web开发小技巧(知识)

6 comments , Tagged : ,

iphone、ipad都水果家的,区别也不是很大(别和我提屏幕!!!),所以放一起不作过多区分,基本都通用。资料都网上收集来的,很多我也还没条件测试,可能有些知识点已经更新了。

如何隐藏iPhone Safari的地址栏

使用meta标签,看一些资料说的,不过我在iphone4下测试没反应,不清楚iphone3是否有效或者是有什么限制。

<meta name="apple-mobile-web-app-capable" content="yes" />

第二个方法就是通过JS处理。原理就是当我们往下滚动时,地址栏会往上收起,所以我们重围一下默认位置就可以了。也因为是使用系统自身的特性,当内容小于可视区域时(没有滚动条),地址栏是不能隐藏的

window.addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false);
function hideURLbar(){
window.scrollTo(0,1);
}

不同的方向对应不同的样式表

<link rel="stylesheet" media="all and (orientation:portrait)" href="portrait.css">
</link><link rel="stylesheet" media="all and (orientation:landscape)" href="landscape.css">
</link>

Javascript里的Array-Like对象

no comments , Tagged : ,

通常我们用 [array].slice()去重组数组或转换数组,但对于arguments就无效了,尽管它有length属性,但它并不是一个真正的数组,而是一个Array-Like对象,所以像Array对象那样写会报”arguments.slice() is not a function“错误。这个时候我们就可以使用Array.prototype.slice.call来把arguments转换为真正的数组。

function foo(){
 var arr=Array.prototype.slice.call(arguments, 0);
 arr.slice(); //现在不会报错了,因为它是一个真正的数组
}
 
foo('pzling','http://pzling.com');

Array.prototype.slice.call()主要用于将方法内的arguments转换成数组,但是它有应用的局限,对于DOM节点集合,它是无能为力的

很老的知识点,作下记录。