Skip to content

为什么浏览器不内建更多选择器

2012年9月6日

来自知乎问题JavaScript 为什么不内建选择器?

首先,与这个问题有关的浏览器中的技术概念其实大致有这些:

  1. BOM,即浏览器对象模型,简单说就是浏览器提供的环境,包括各种对象及其方法,比如window
  2. DOM,即文档对象模型,它是由HTML经解析后生成的一个模型,我们对页面可视部分进行操作实际上就是在操作DOM
  3. JavaScript,浏览器提供了BOM,也解析了DOM,那么,开发者如何去操作它们呢?这时候就轮到JavaScript出场了,所以JavaScript(在这个例子中)是用来操作DOM和BOM的

那么所谓的选择器,getElement(s)ByXXXX实际上是由DOM提供的,而且对DOM的level实现的程度不一样,这些方法也不一样,比如DOM level 0中主要的方法(确切说是属性)就是document.imagesdocument.links之类。而DOM level 3中则提供了querySelector(All)之类更为方便的API。

第二个想说的点是关于为什么没有更精简的API和写法:

  1. 在DOM中,所有的方法必须隶属于DOM对象,所以在非别名实现的情况下,以$函数来实现是不可能的,即使实现,也会是类似document.$之类的方法
  2. 假设使用别名方法实现(即window.$ = document.$),那么会有一个很严重的后果——染污全局空间,即jQuery(或者prototype或者其它的任何类库)再也不能使用$函数
  3. 即使不纠结是否别名实现的问题,假设可以用$classname这样的函数来选择,那么也是有问题的。第一,方法名字不够直观,作为一个浏览器(确切地说,是一份标准),引入一个名称含义不确定的方法是不可以接受的,虽然getElementById很长,但是任何人都能一眼看明白它是做什么的,对不对?第二,使用$开头似乎不符合JavaScript中的要求,$开头的应该是留给机器编译后的代码来避免冲突。(这一点是听说的,我没有自己去看规范。)

第三个想说的是关于jQuery(及风格类似)的选择器。事实上jQuery的选择器的确很方便,但它也引起了很多的争议,包括占用$符号和承载太多重载的jQuery方法(即$),可能跟jQuery的理念有关,“write less, do more”,而一份web标准因为它强大的影响力和不可随意更新(bug就只能bug了,在下一份标准出来前不可能有修复的机会)的特性,显然还要在API设计的方方面面考虑更多的东西。