JavaScript框架设计
上QQ阅读APP看书,第一时间看更新

4.4 jQuery一些常用特征的含义

jQuery在support模块列举了一些常用的DOM特征的支持情况,不过它们的名字起得很奇怪,这里逐一揭开它们的谜底。由于这些特征在jQuery不同版本变动很大,本书以jQuery1.8为准。

leadingWhitespace:判定浏览器在进行innerHTML赋值时,是否存在trimLeft操作。这个原本是IE出来搞的,应该遵循IE的游戏规则才对。结果其他浏览器一直认为要忠于用户的原始值,最前的空白不能省掉,要变成一个文本节点。最后微软不得不服软,IE6、IE7、IE8返回false,其他浏览器返回true。

tbody:指在用innerHTML动态创建元素时,浏览器是否会在table内自动补上tbody。jQuery是希望浏览器不要自作多情,要补jQuery会补!判定浏览器是否智能插入tbody。在表格布局的年代,这个特征非常受用。因为如果没有 tbody,table 会在浏览器解析到闭合标签时才显示出来,如果起始标签与闭合标签相隔很远,换言之,这个表格很大很长,用户会看什么也看不到。但有了tbody分段识别和显示,避免了页面长时间一片空白后突然一下子内容全部出来的局面。看下面实验。

      var div = document.createElement("div");
      div.innerHTML = "<table></table>"
      alert(div.innerHTML)
      //IE678返回 "<TABLE><TBODY></TBODY></TABLE>" ,其他返回"<table></table>"

htmlSerialize:判定浏览器是否完好支持用innerHTML转换一个符合html标签规则的字符串为一个元素节点,此过程jQuery称为序列化。但IE支持不完好,包括script、link、style、meta在内的 no-scope 元素http://qbaok.blog.163.com/blog/static/101292652013022296590/都转换失败,需要在它前面添加一些字符,如"x<script src="xxx"><\/script>","&shy;<script src="xxx"><\/script>"或者"<br class='remove'><script src="xxx"><\/script>" 。像HTML5的新标签,当然也支持不好。侦测结果同上。

style:这个命名很难懂,不看源码不知道是什么意思。真相是判定getAttribute能否返回style的用户预设值。IE6、IE7、IE8没有区分特性属性,返回一个CSSStyleDeclaration对象。

hrefNormalized:同样莫名其妙,意为判定getAttribute能否返回href的用户预设值。IE会多此一举,补充为完整路径给你。

opacity:判定是否支持opacity样式值。IE6、IE7、IE8不支持,要用透明滤镜。

cssFloat: 判定float样式值在DOM的名字是哪个,W3C为cssFloat,IE6、IE7、IE8为styleFloat。

checkOn:在大多数浏览器中checkbox的value默认为on,唯有Chrome返回空字符串。

optSelected:判定能否正确地取得动态添加的 option 元素的 selected。IE6~IE10 与老版本的Safari对动态添加的option没有设置为true。解决办法为,在访问selected属性前,先访问其父节的selectedIndex属性,强制它计算option的selected。

      <select id="optSelected">
      </select>
      <script type="text/javascript">
          var select = document.getElementById('optSelected');
          var option = document.createElement('option');
          select.appendChild(option);
          alert(option.selected);
          select.selectedIndex;
          alert(option.selected);
      </script>

optDisabled:判定select元素的disabled属性是否影响到子元素的disabled取值。在Safari中,一旦select元素被disabled,它的孩子也被disabled,导致一个值也取不到。

checkClone:是指,如果一个checkbox元素,如果设置了checked=true,且在多次克隆后,它的复制品能否保持为true。这个只有在Safari4中返回false,其他为true。

inlineBlockNeedsLayout:判定是否使用 hasLayout方法让 display:inline-block 生效。这个只有IE6、IE7、IE8为true。

getSetAttribute:判定是否区分特性属性。只有IE6、IE7、IE8为false。

noCloneEvent:判定在克隆元素时是否克隆attachEvent绑定的事件,只有旧版本IE及其兼容模式返回false。

enctype:判定浏览器是否支持encoding属性,IE6、IE7要用encoding属性代替。

boxModel:判定浏览器是否在content-box盒子模型的渲染模式下。

submitBubbles,changeBubbles,focusinBubbles:判定浏览器是否支持这些事件,一直冒泡到document。

shrinkWrapBlocks:判定元素是否会被子元素撑开。在IE6、IE7、IE8中,非替换元素http://hi.baidu.com/flowerszhong/item/4b773f0b3522107ebfe97e60在设置了大小与hasLayout的情况下,会将其父级元素撑大。

html5Clone:判定能否使用 cloneNode 克隆 HTML5 的新标签,旧版本 IE 不支持,需要用到outerHTML。

deleteExpando:判定能否删除元素节点上的自定义属性,这用于jQuery缓存系统。旧版本IE不支持,直接置为undefined的。

pixelPosition:判定getComputedStyle能否转换元素的top、left、right、bottom的百分比值。这个webkit系出现问题,需要用到 Dean Edwards大神的hack。

reliableMarginRight:判定getComputedStyle能否正确取得元素的marginRight。Safari的早期版本总是取回一个很大的数。

clearCloneStyle:IE9、IE10 出现的奇葩 BUG,当复制一个指定了 background-*样式的元素,对复制品的背景进行清空时,也会清空原来的。

目前就是这么多了,随着浏览器疯狂更新版本,标准浏览器引发的各种BUG已超越IE了。特征侦测不退反进,越来越重要了。