优雅兼容之理想与现实
infinte 总是能给我们带来一些新思路新想法:更优雅的兼容
很不错的思路。不过实际操作时,并不好组织。比如:getOffset (获取 elem 相对 page 的偏移量)方法,对于高级浏览器,直接 getBoundingClientRect + win.scrollLeft/Top 即可。对于低级浏览器,比如 Safari 2, 得利用 offsetParent 不断向上回溯叠加。至此,利用文中提及的优雅兼容,可构造:
nullDriver = {};
dhtmlDriver = derive(nullDriver);
w3cDriver = derive(dhtmlDriver);
if(supportsGetBoundingClientRect) {
w3cDriver.getOffset = function() { ... }
} else {
dhtmlDriver.getOffset = function() { ... }
}
看起来很美妙,可是问题不这么简单。w3cDriver.getOffset 里,依旧还有浏览器差异,比如在同是 webkit, 桌面版和 ipad 版是有差异的,并且郁闷的是,这个差异不大,就那么一两行代码。传统写法:
w3cDriver.getOffset = function() {
...
if(isAppleMobileWebkit) { // bug fix }
else { // go on }
...
}
按照优雅思路,上面的代码很 ugly, 一个可能的重构: 阅读全文 »

