表觀模式(Facade),表觀模式有兩個(gè)作用,一個(gè)是簡化類的接口,二是消除類與使用它的客戶代碼之間的耦合。在jQuery教程中總是會(huì)告訴使用者,jquery已經(jīng)消除了瀏覽器之間的差異,只用一個(gè)方法就可以在所有的瀏覽器環(huán)境下使用,背后的原理就是,作者通過表觀模式消除了瀏覽器之間的差異。
在瀏覽器的事件監(jiān)聽中,有事件傳播和阻止事件傳遞的處理上有差異。
所以在各種js庫中都使用表觀模式加以處理
var DED = window.DED || {}; //設(shè)置一個(gè)命名空間
DED.util = { //用名字(util,工具)使命名空間更加明了
stopPropagation: function(e) {
if (ev.stopPropagation) {//源代碼這里是不是多了一個(gè)v?
// W3 interface
e.stopPropagation();
}
else {
// IE's interface
e.cancelBubble = true;
}
},
preventDefault: function(e) {
if (e.preventDefault) {
// W3 interface
e.preventDefault();
}
else {
// IE's interface
e.returnValue = false;
}
},
/* 更具具體傳入的事件對象來判斷使用哪種方法,在使用者眼中,只有stopEvent這一個(gè)方法 */
stopEvent: function(e) {
DED.util.stopPropagation(e);
DED.util.preventDefault(e);
}
};
設(shè)置HTML樣式的表觀模式方法
var element = document.getElementById('content');
element.style.color = 'red';
element.style.fontSize = '16px';
var element1 = document.getElementById('foo');
element1.style.color = 'red';
var element2 = document.getElementById('bar');
element2.style.color = 'red';
var element3 = document.getElementById('baz');
element3.style.color = 'red';
//上面是最原始的方法
setStyle(['foo', 'bar', 'baz'], 'color', 'red'); //使用setStyle的方法
//傳入元素?cái)?shù)組,屬性,屬性值三個(gè)參數(shù)
function setStyle(elements, prop, val) {
for (var i = 0, len = elements.length-1; I < len; ++i) {
document.getElementById(elements[i]).style[prop] = val;
}
}
setStyle(['foo'], 'position', 'absolute'); //setStyle都是類似
setStyle(['foo'], 'top', '50px');
setStyle(['foo'], 'left', '300px');
setCSS(['foo'], { //直接使用setCSS方法,傳入元素?cái)?shù)組和樣式屬性對象
position: 'absolute',
top: '50px',
left: '300px'
});
function setCSS(el, styles) {
for ( var prop in styles ) { //遍歷屬性對象鍵值對
if (!styles.hasOwnProperty(prop)) continue;
setStyle(el, prop, styles[prop]); //使用setStyle方法設(shè)置元素屬性
}
}
setCSS(['foo', 'bar', 'baz'], {
color: 'white',
background: 'black',
fontSize: '16px',
fontFamily: 'georgia, times, serif'
});
以上兩個(gè)例子看著好熟悉,在jquery的api中到處都有這樣的模式。
但是也有性能的損失。要做多余的操作。 jquery 2.x.x的版本沒有直接放棄了IE瀏覽器的兼容性,是不是就是基于對表觀模式的考慮?沒有讀源碼,猜測。