1.HTML5 提供了本地存储,2D绘图,离线支持,套接字和线程等诸多特性。
2.问:这在老式的浏览器上也能用?就像这些新的doctype, meta之类的标记?老式浏览器怎么处理这些新语法呢?
答:对,靠点聪明,也靠点运气。就拿link和script标记上的type属性为例,如今在HTML5中去掉这个属性是合理的,因为CSS和JavaScript现在已经成为标准(当然也是默认的样式和脚本样式)。不过,事实上,浏览器早已经假定默认使用CSS和JavaScript。所以标准一致,真是碰巧,浏览器多年前就已经对这个新标记标准提供了支持。doctype和meta标记也是一样。
3.问:那么新的doctype呢?看起来现在是不是太简单了?甚至连版本或DTD都没有。
答:恩。看起来确实有些神奇,使用了这么多年复杂的doctype之后,现在我们居然可以简单到只指出“我们在用HTML”。事情是这样的:HTML原先基于一个名为SGML的标准,这个标准要求提供复杂格式的doctype和DTD。新标准对SGML有所调整,目的是简化HTML语言,使它更加灵活。所以我们不再需要复杂的格式。不仅如此,正如前面所说,这里还有点运气,几乎所有浏览器都只是在doctype中查找HTML,来确保在解析一个HTML文档。
4.问:你说它不会再变了,不是开玩笑吧?我觉得对于浏览器来说版本非常重要。为什么不使用< !doctype html5 >呢?将来还是有可能有HTML6的吧?
答:doctype的使用意味着浏览器制造商要使用doctype告诉浏览器采用它们自己的“标准模式”表现内容。既然我们已经有了真正的标准,HTML5的doctype完全可以告诉所有浏览器这个文档是标准HTML,不论它是版本5还是版本6,或者是其他任何版本。
5.问:这很重要吗?我完全可以输入一个不带doctype和meta标记的页面,它也能很好地工作。我何必操心它是不是完全正确呢?
答:是的,浏览器很擅长忽略HTML文件中的小错误。不过,通过包含正确的doctype和meta标记,就能确保浏览器确实知道你想要什么,而不用乱猜。另外,对于那些使用老式浏览器的人来说,新doctype意味着他们将使用标准模式,这正是你要的。要记住,标准模式是指:浏览器会认为你编写的HTML符合一个标准,所以它会使用相应的规则来解析你的页面。如果你没有指定一个doctype,有些浏览器可能会进入“古怪模式”,以为你的Web页面是为老式浏览器编写的,如果标准不符合,就可能不正确地解析你的页面(或者认为它编写得不正确)。
6.问:XHTML怎么了?好像好多年前就说它是未来发展方向。
答:原先确实是。不过,后来灵活性超越了严格语法,在这个过程中,XHTML(准确地讲是XHTML 2)夭折了,从而人们编写Web页面的方式(以及浏览器表现页面的方式)来讲,HTML5更能让人接受。不过也不用担心,因为了解XHTML能让你更好地编写HTML5内容。顺便说一句,如果你真的喜欢XML,还有一种办法可以用严格的格式写HTML5.
7.HTML5是HTML的一个超集,对于那些老式的浏览器,我们的目标肯定是只写一个HTML页面,而不是写两个版本的Web页面。
8.HTML5的底层设计原则之一就是允许你的页面妥善地降级。这说明,如果用户的浏览器未能提供一个新特性,你就应当提供有一个有意义的候选功能。
9.问:Web页面和Web应用有什么不同吗?怎么才算是一个Web应用?
答:这两个词之间没有绝对的差别;换句话说,要把一个用HTML,JavaScript和CSS编写的页面变成一个Web应用,并不需要你做任何特殊的工作。所以只是看法不同而已。
如果一个页面表现得像是一个应用,而不只是一个静态文档,我们就可以认为它是一个Web应用,而不仅仅是Web页面。我们认为应用应该具备一些特点,比如维护大量状态,管理与用户复杂的交互,无需页面刷新就能显示不断更新的动态数据,或者甚至可以完成更复杂的任务或计算。
10.JavaScript命名方式,可以使用字母,美元符号和下划线创建变量名,不能有个空格,—,或 +,符号。
例如:var zip code; var first-name; var to+do; 不能这样命名
11.问:能从数组Array删除一个元素吗?如果能,其他元素的索引会有什么变化?
答:当然可以从Array删除一个元素,而且有两种不同的方法来删除。可以将该索引的数组元素值设置为null。例如,myArray[2] = null。不过,这意味着Array的长度保持不变。或者还可以完全删除这个元素(使用函数splice)。在这种情况下,所删除元素后面的所有元素的索引都减1。所以,如果myArray[2] = "dog",myArray[3] = "cat",而你删除了"dog”,那么就会有myArray[2] = "cat",而且数组的长度比原来少1。
12.undefined和null是两个不同的值。undefined表示一个变量未定义;null表示这个变量有一个空值。
13.Math.random会返回一个介于0和1的浮点数(但是不会为1)。
14.Math.floor把一个浮点数小数点后面的所有位去除,将它转换为一个整数。
15.以下是合法的语句
var s = "3-8"; var n = 3 - "none"; var $ = 21.30;
16.,其中的placeholder指示这个输入域中要输入什么。
17.问:我向函数传递了一个变量——如果在函数中改变了相应行参的值,会不会也改变原来的变量?
答:不会,传递一个基本类型值时,它会复制到行参。我们把这称为“传值”。所以,如果在函数体中改变了行参的值,对原来的实参值没有任何影响。不过传递数组或对象是个例外。
18.问:掌握所有这些局部变量和全局变量的作用域很让人糊涂,那么为什么不都用全局变量呢?
答:如果你写的代码很复杂,或者需要在很长一段时间之后维护,你就确实应当好好看一看如何管理变量。如果你过分热衷于创建全局变量,将很难跟踪到变量在哪里使用(以及在哪里对变量值做出了修改),而这可能会导致有bug的代码。与别人合作编写代码时,或者使用了第三方库时,这一点会更为重要(不过,如果这些库编写得很好,则它们应该会有合理的结构来避免这些问题)。所以说,可以在合适的地方使用全局变量,不过一定要适度,另外要尽可能使用局部变量。
19.要枚举一个对象的所有属性,我们使用一个for-in循环,注意属性的顺序是任意的,所以不能依赖一个特定的顺序。
20.可以向函数传入一个对象,就像传入其他变量一样。在函数中,可以正常地访问这个对象的属性,当然要使用行参名作为对象。
function bark( dog )
{
if ( dog.weight > 25 ) alert ( "WOOF" );
else alert ( "yip" );
}
21.将一个对象赋至变量时,这个变量会包含这个对象的一个引用,而不是对象本身。可以把引用想象成是对象的一个指针。改变对象的一个属性时,你修改的是原对象的属性,而不是副本,所以不仅可以在函数内部看到对对象的所有改变,而且在函数外一样能看到所有改变。
22.window是个全局变量,所以即使没有在前面加上window,window的属性或方法名也能顺利解析。另外,你定义的所有全局变量都会放在window命令空间中,所以可以作为window.myvariable来引用。
23.JSON的可读性相当好,而且可以很快,很容易地解析为JavaScript对象。
JSON.stringify();——解析为字符串
JSON.parse();——转换为一个JavaScript对象
24.XMLHttpRequest不能发出跨域请求,跨域的服务器根本没有看到请求,在它看到请求之前,浏览器安全策略已经中止了这个请求。
25.由另一个域提供的JavaScript文件可以调用你的浏览器的一个函数。
26.从另一个域提供的JavaScript文件不仅可以在代码中调用它想要的任何函数,还可以为我们传递它希望的任何数据。我们在通过所引用的JavaScript文件传递数据,而不是使用XMLHttpRequest自己来获取。
27.JSONP是一种使用
对方的服务器向你发回JSON对象之前,会用updateSales包装这个JSON格式化对象。一般地,Web服务将这个参数命名为callback,不过请查看你的Web服务文档,明确Web服务实际使用的参数名。
30.浏览器在加载页面时会进行控制,我们希望先加载页面,这样调用updateSales时就能更新DOM。要处理这个问题,我能想到的唯一办法就是把