首先书中提到了可视化反馈的重要性,一个很常见的例子就是进度指示器:
在我们这里,HTML页面就相当于进度指示器,当浏览器逐步的加载页面时,页头,导航栏等,所有这些为等待页面的用户提供视觉反馈。按照作者的意思:在IE中将样式表放在底部,可能会导致白屏或者是无样式内容的闪烁。白屏是由于浏览器要等待css下载完再显示页面的组件,所以在等待css下载的时候页面就是白屏。无样式的闪烁是由于先下载页面的组件比如文字图片,并逐步显示,等css下载完则需要应用新的css样式渲染,就产生了这种无样式的闪烁现象。
Css在底部:http://stevesouders.com/hpws/css-bottom.php
Css在顶部:http://stevesouders.com/hpws/css-top.php
用@import方式:http://stevesouders.com/hpws/css-top-import.php
无样式内容的闪烁:http://stevesouders.com/hpws/css-fouc.php
但按我的测试,虽然说白屏现象只有在ie下页面加载时偶尔才会出现,但是前两个我测试不出他说的这种情况。这条规则的说服力对我来说不是很大。后两个效果还是很明显的。
需要说明的一点是,不管样式放在那里并不会影响加载页面的时间,而影响的是浏览器对这些组件顺序的反应,如下图:
有些用户感觉缓慢的页面反而加载的更快,这就是视觉化反馈的重要性。如果真的产生了白屏,用户就会因为不知道发生了什么而离开,去投奔竞争对手。
还有,根据上面第三个连接,作者提出:
1. 使用@import方法必须放在<style>标签的顶部。
2. 即使@import方法放在了<head>标签中,它所指定的样式表文件却依然是最后下载的。
所以,不推荐使用@import方法加载CSS样式表,而推荐使用<link>标签将CSS样式表放在文档的<head>中。推荐使用shtml页面,这样我们在修改样式以后就不用修改页面了。
我们知道最简洁的数字转字符串方法是:
var string = num + "";
也就是在数字后面加上一个空字符。那么最简洁字符串转数字方法呢?
字符串只能进行加法(拼接)
字符串进行加法(拼接)是很常见的,但是字符串进行减法、乘法、除法呢?
这似乎很难定义,实际上字符串没有减法、乘法、除法操作。
但Javascript是动态语言,如果你拿两个字符串进行这三种操作的时候,他会尝试将其转成数字再进行相应的操作。例如:
但这种转换操作和parseInt不太像,而和Number比较像,比如:
alert(parseInt("123a") - parseInt("2bc")); //121
alert(Number("123a") - Number("2bc")); //NaN
也就是说,这种转换和Number一样,会将非纯数字型字符串转成NaN,表示其是非数字。
而parseInt则会取出字符串中取出前面的能表示成数字的部分,而忽略掉后面不能表示成数字的部分。
最简洁的字符串转数字方法
借助字符串在进行其不能进行的运算时会先尝试转成数字这个特性。我们可以对字符串前加上正符号来将字符串转成数字。如:
alert(typeof num); //number
jQuery中有一个这个方法的应用,比如我们得到一个字符串怎么判断他是不是只有数字呢?jQuery的方法:
alert(+string + "" === string); //true表示是数字字符串,否则不是
进制问题
0x开头的是16进制,所以Number和parseInt都会对16进制进行相应的转换,字符串的自动转换也是这般:
alert(Number("0x10")); //16
alert(+"0x10"); //16
但是悲剧的是0开头却非如此,我们知道0开头可以用来表示8进制,在Number和字符串自动转换中,0开头会当成十进制来获取,如:
alert(+"010"); //10
而parseInt中却很悲催,ECMAScript中并未对此进行强制规定所以出现了下面的情况:
╮(╯_╰)╭ 难怪很少见到Javascript中用到8进制,如果要确保8进制只能使用parseInt的第二个参数了:
本文链接
js:
var posX;
var posY;
fdiv = document.getElementById("divBody");
document.getElementById("divHead").onmousedown=function(e)
{
if(!e) e = window.event; //IE
posX = e.clientX - parseInt(fdiv.style.left);
posY = e.clientY - parseInt(fdiv.style.top);
document.onmousemove = mousemove;
}
document.onmouseup = function()
{
document.onmousemove = null;
}
function mousemove(ev)
{
if(ev==null) ev = window.event;//IE
fdiv.style.left = (ev.clientX - posX) + "px";
fdiv.style.top = (ev.clientY - posY) + "px";
}
html:
<div class="divBody" id="divBody" style="left: 29px; top: 14px;"> <!--这里要加style="left: 29px; top: 14px;" 否则有问题-->
<div class="divHead" id="divHead" style="cursor: move;">
</div>
<div class="content">
</div>
<div class="tail">
</div>
</div>
css:
.divBody{
//margin-top:20px;
border: solid #CCC 1px;
width:500px;
height:400px;
position:relative;
z-index:0;
margin-left:auto;
margin-right:auto;
}
.divHead{
width:500px;
height:50px;
background-color:#CCC;
}
.content
{
width:500px;
height:300px;
}
.tail{
background:#CCC;
height:50px;
width:500px;
display:table-cell;
vertical-align:middle;
}