0%

label元素平淡无奇,就是为表单输入元素贴上标签,方便辨识。label有个很重要的属性是for,可以将label与其标识的输入元素绑定在一起,提供更好的操作体验。

显式label

[html]

[/html]

重置和提交按钮,图片按钮以及button元素按钮不用使用显式label,因为它们已经有了隐式标签,如value 和 alt 属性值,button元素的内容。

显式的label对Accessibility是最友好的。

隐式label
将输入元素直接包裹在label标签之内,for属性也可以省略了,甚至输入元素的id也可以省略了。
[html]

[/html]
IE6不支持隐式label

混合式label
即使用label的for特性,又将输入元素包裹在label之内
[html]

[/html]

References:
[1]表单显式LABEL和隐式LABEL对屏幕阅读器用户的影响–更新
[2]HTML 标签的 for 属性

===
[erq]

HTML元素的id属性在一个文档中应该是独一无二的,传统上我们也是这样做的。但是开发SPA单页(Single Page Application)webapp时很容易遇到ID会重复的情况。当SPA多次动态加载同一个模块时,id重复是在所难免了。当前的项目就遇到了这个问题。

ID重复也不是什么大问题,但从语义来讲id(identification)应该是全局唯一的。xml文档严格要求id不能重复,如果html文档中元素有重复的id就无法通过XML校验,不是一个合法的XML文档。id重复虽然现在没有问题,但浏览器并没有保证以后不会出现问题。

当然可以通过动态修改HTML元素的id特性来缓解这个问题。

id重复的元素,通过jQuery或者原生的querySelectorAll方法都可以全部获取到。而且还可以通过指定一个明确的context来选择特定的id。虽然有其他相同id的元素,但只要他们有不同的context,就可以在选择器层面上进行明确的区分。

无论HTML元素的ID如何重复,浏览器生成的DOM对象都是实实在在的不同的。所以ID重复也不是什么大问题,如果实在无法避免重复,那就当class一样来用好了。

但要注意,HTML元素ID重复可能会break一些库或者框架。

References:
[1]HTML id Attribute
[2]HTML中的重复ID问题

===
[erq]

Shadow DOM越来越近了,Chrome 35 已经去掉了Shadow DOM API的供应商前缀。下一个支持Shadow DOM的就是firefox 30了。

HTML中property与attribute是极易混淆的两个概念。大多数时候这两个单词都翻译为“属性”,为了区分二者,一般将property翻译为”属性”,attribute翻译为”特性”。

每一个HTML标签(tag)都对应一个DOM接口HTMLXxxElement,比如Span标签对应的是HTMLSpanElement。这些标签的DOM接口都继承自HTMLElement接口,而HTMLElement又继承自Element。我们知道所有的标签都是一个元素结点,因此Element接口又继承自Node接口。其实HTML文档树中的所有东西都是结点,只不过有不同的结点类型而已。

property就是DOM对象的属性,就像普通的javascript对象的属性一样一样的,因为DOM对象就是一个地道的javascript对象,也有自己的原型链。
而attribute则是HTML标签的特性,比如

1
<div id="div1" title="title1">test<div>

这里id和title是HTML标签div的特性,虽然对应的DOM对象HTMLDivElement也有这两个属性,但它们却是完全不一样的东西。有些特性与属性是同步的。

HTML标签的attribute以类数组的形式存储在对应DOM对象的属性attributes中,attributes属性的类型为NamedNodeMap对象。
DOM对象提供了方法setAttribute,getAttribute和removeAttribute来操纵HTML标签的特性。

1
2
DOMString getAttribute(in DOMString name);
void setAttribute(in DOMString name, in DOMString value) raises(DOMException);

HTML标签attribute的名字和值都必须为字符串类型,而DOM对象的property没有此限制,可以是任何类型。

有些HTML标签的attribute有对应的DOM对象property,但它们的取值却不一定是相同的。一般来说相对应的attribute与property其名字是一样的,但是class特性有所不同,因为class在javascript中为关键字,所以其所对应的property名字为className。

有些简单的特性,比如id,两者的取值是一样的。

1
2
var id1=elem.id;
var id2=elem.getAttribute('id');

但对于input的value,使用getAttribute获取的永远是写HTML标签时指定的那个值,而value属性则获取到的是input当前输入的值。
而另一些特性比如checked,只要checked特性存在,无论其值是什么,DOM对象的checked属性的值都是true。这里checked属性已经不是字符串而是布尔类型了。

还有一些特性比如style和onclick,其对应的DOM属性完全是返回一个对象了,比如elem.style属性就返回一个CSSStyleDeclaration对象。

HTML自定义attribute没有对应的DOM对象property。

References:
[1]attribute和property的区别
[2]JavaScript中的property和attribute的区别
[3]SD9006: IE 混淆了 DOM 对象属性(property)及 HTML 标签属性(attribute),造成了对 setAttribute、getAttribute 的不正确实现
[4]The HTML DOM Element Object
[5]DOM元素的特性(Attribute)和属性(Property)

===
[erq]

jQuery 1.9 删除了一些过时的API,修改了一些API的行为。比如jQuery.browser()已经移除了,推荐使用Modernizr特性检测库,而不是检测特定的浏览器。
从jQuery 2+起,不再支持IE6/7/8。

jQuery提供了迁移插件jquery-migrate来辅助用户平滑升级。
jquery-migrate插件恢复了被删除或变化的API,但会在console给出警告(注意:只有开发版才会给出警告)。
jquery-migrate插件可以用于jQuery 2.x版本,但这只是个过渡,现有产品应该尽快将源代码迁移到jQuery 2.x上来。

这样使用jquery-migrate插件

1
2
<script src="js/jquery-2.1.1.js"></script>
<script src="js/jquery-migrate-1.2.1.js"></script>

抛弃低版本IE浏览器是大势所趋。IE浏览器从版本11开始才真正算是一个现代浏览器。

也可以使用条件注释语句为低版本IE使用低版本的jQuery。

References:
[1]jQuery Core 1.9 Upgrade Guide
[2]jQuery 1.9升级指南
[3]jQuery 1.9 移除了 $.browser 的替代方法
[4]Conditional comments

===
[erq]

instanceof运算符可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链(__proto__属性指向的隐式原型链,真正的继承链)上。语法形式为:
object instanceof constructor

使用vim将代码风格(code style)由蛇形(snake_case)改为驼峰(Camel Case):
:%s/_\([a-z]\)/\u\1/g

1、函数对象创建时会继承当前执行环境的作用域链。也就是当前执行环境会将其创建的函数对象的[[scope]]属性设置为当前作用域链的头,也就是指向当前执行环境的活动对象(Active Object),其实就是一个可变对象(Variable Object),不过因为它是当前激活的VO,所以又叫AO。

References:
[1]Javascript 闭包
[2]深入理解javascript之执行上下文(execution context)
[3]JavaScript中的 变量、作用域链、执行上下文
[4]理解js作用域链及闭包

===
[erq]

变量附加到对象上才叫属性,函数附加到对象上才叫方法。属性是可以删除的,而变量不可以。方法也是属性的一种。