/**
* 概念:外觀模式
* 為一組復(fù)雜的子系統(tǒng)接口提供一個更高級的統(tǒng)一接口
* 通過這個接口使得子系統(tǒng)接口的訪問更容易。在Javascrip中有時也會用于對底層結(jié)構(gòu)兼容性做統(tǒng)一封裝來簡化用戶使用
*/
// 案例---使用外觀封裝一個點擊事件,使其兼容IE瀏覽器和常用的瀏覽器,即兼容性封裝
// 外觀模式實現(xiàn)
function addEvent(dom, tyoe, fn) {
// 對于支持DOM2級事件處理程序addEventListener 方法的瀏覽器
if(dom.addEventListener) {
dom.addEventListener(type, fn, false);
// 對于不支持addEventListener方法但支持attachEvent 方法的瀏覽器
} else if(dom.attachEvent) {
dom.attachEvent('on' + type , fn);
// 對于不支持addEventListener 方法也不支持attachEvent方法,但支持on + '事件名'的瀏覽器
}else {
dom['on' + type] = fn;
}
}
// 通過上面的放我對于支持addEventListener 或者 attachEvent 方法的瀏覽器就可以放心地綁定多個事件了
// 用例
var myInput = document.getElementById('myinput')
addEvent(myInput, 'click', function() {
console.log('綁定第一個事件')
})
addEvent(myInput, 'click', function() {
console.log('綁定第二個事件')
})
addEvent(myInput, 'click', function() {
console.log('綁定第三個事件')
})
// 使用外觀模式解決IE 低版本瀏覽器不兼容e.preventDefault() 和 e.target
// 獲取事件對象
var getEvent = function(event) {
// 標(biāo)準(zhǔn)瀏覽器返回event ,IE下 window.event
return event || window.event;
}
// 獲取元素
var getTarget = function (event) {
var event = getEvent(event);
// 標(biāo)準(zhǔn)瀏覽器下 event.target , IE 下event.scrElement
return event.target || event.srcElement;
}
// 阻止默認(rèn)行為
var preventDefault = function(event) {
var event = getEvent(event);
// 標(biāo)準(zhǔn)瀏覽器
if(event.preventDefault) {
event.preventDefault();
// IE瀏覽器
}else {
event.returnValue = false
}
}
// 用例
document.onclick = function (e) {
// 阻止默認(rèn)行為
preventDefault(e);
// 獲取事件源目標(biāo)對象
if(getTarget(e) !== document.getElementById('myinput')) {
//
}
}
// 簡單實現(xiàn)獲取元素的屬性樣式的簡單方法庫
var B = {
// 通過ID獲取元素
g: function(id) {
return document.getElementById(id);
},
// 設(shè)置元素css 屬性
css: function(id, key, value) {
document.getElementById(id).style[key] = value;
},
// 設(shè)置元素的屬性
attr: function(id, key, value) {
document.getElementById(id)[key] = value;
},
html: function(id, html){
document.getElementById(id).innerHTML = html;
},
// 為元素綁定事件
on: function(id, type, fn) {
document.getElementById(id)['on' + type] = fn;
}
}
// 上面封裝了操作元素屬性樣式的代碼庫
// 用例如下
B.css('box', 'background', 'red'); // 設(shè)置css樣式
B.attr('box', 'className', 'box') // 設(shè)置class
B.html('box', '這是新添加的內(nèi)容') // 設(shè)置內(nèi)容
B.on('box', 'click', function() {
B.css('box', 'width', '500px')
})
/**
* 總結(jié):
* 外觀模式是對接口方法的外層包裝,以供上層代碼調(diào)用
*/
javascript之外觀模式 -- 2022-11-20
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 介紹 為子系統(tǒng)中的一組接口提供了一個高層接口 使用者使用這個高層接口 原來的系統(tǒng)中用戶對接每一個子系統(tǒng) 使用外觀模...
- 一、導(dǎo)語二、怎么用1.樣例背景2.UML類圖3.代碼示例三、優(yōu)缺點四、使用場景1.概括描述2.現(xiàn)存知名產(chǎn)品中的使用...
- 外觀模式 外觀模式(Facade Pattern)隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口。...
- 外觀模式 GitHub代碼鏈接[https://github.com/lee820/design-pattern-...
- 前言 本篇來學(xué)習(xí)下結(jié)構(gòu)型模式的外觀模式和裝飾器模式。 外觀模式 簡介 外觀模式隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一...