JS面向?qū)ο笾畣芜x框?qū)崿F(xiàn)
本文實(shí)例為大家分享了JS面向?qū)ο笾畣芜x框?qū)崿F(xiàn)代碼,供大家參考,具體內(nèi)容如下
描述:
JS面向?qū)ο蟆獑芜x框的實(shí)現(xiàn)
效果:

實(shí)現(xiàn):
Utile.js
(function () {
Object.prototype.addProto=function (sourceObj) {
var names=Object.getOwnPropertyNames(sourceObj);
for(var i=0;i<names.length;i++){
var desc=Object.getOwnPropertyDescriptor(sourceObj,names[i]);
if(typeof desc.value==="object" && desc.value!==null){
var obj=new desc.value.constructor();
obj.addProto(desc.value);//把obj當(dāng)成引用對(duì)象帶入遞歸函數(shù)繼續(xù)給obj賦值
Object.defineProperty(this,names[i],{
enumerable:desc.enumerable,
writable:desc.writable,
configurable:desc.configurable,
value:obj
});
continue;
}
Object.defineProperty(this,names[i],desc);
}
return this;
};
Function.prototype.extendClass=function (supClass) {
function F() {}
F.prototype=supClass.prototype;
this.prototype=new F();
this.prototype.constructor=this;
this.supClass=supClass.prototype;
if(supClass.prototype.constructor===Object.prototype.constructor){
supClass.prototype.constructor=supClass;
}
}
})();
var RES=(function () {
var list={};
return {
DATA_FINISH_EVENT:"data_finish_event",
init:function (imgDataList,basePath,type) {
if(imgDataList.length===0) return;
if(!type) type="json";
RES.imgDataList=imgDataList.reverse();
RES.basePath=basePath;
RES.type=type;
RES.ajax(basePath+imgDataList.pop()+"."+type)
},
ajax:function (path) {
var xhr=new XMLHttpRequest();
xhr.addEventListener("load",RES.loadHandler);
xhr.open("GET",path);
xhr.send();
},
loadHandler:function (e) {
this.removeEventListener("load",RES.loadHandler);
var key,obj;
if(RES.type==="json"){
obj=JSON.parse(this.response);
key=obj.meta.image.split(".png")[0];
list[key]=obj.frames;
}else if(RES.type==="xml"){
obj=this.responseXML.children[0];
key=obj.getAttribute("imagePath").split(".png")[0];
list[key]=obj;
}
if(RES.imgDataList.length===0){
var evt=new Event(RES.DATA_FINISH_EVENT);
evt.list=list;
document.dispatchEvent(evt);
// Model.instance.menuData=list;
return;
}
RES.ajax(RES.basePath+RES.imgDataList.pop()+"."+RES.type);
},
getNameJSONData:function (name) {
var fileName=RES.basePath;
for(var key in list){
var arr=list[key].filter(function (t) {
return t.filename===name;
});
if(arr.length>0){
fileName+=key+".png";
break;
}
}
if(arr.length===0){
return false;
}else{
return {
file:fileName,
w:arr[0].frame.w,
h:arr[0].frame.h,
x:arr[0].frame.x,
y:arr[0].frame.y
};
}
},
getNameXMLData:function (name) {
var fileName=RES.basePath;
for(var key in list){
var elem=list[key].querySelector("[n="+name+"]");
if(elem){
fileName+=list[key].getAttribute("imagePath");
break;
}
}
if(!elem) return false;
return {
file:fileName,
w:elem.getAttribute("w"),
h:elem.getAttribute("h"),
x:elem.getAttribute("x"),
y:elem.getAttribute("y")
}
},
getImage:function (name) {
var obj;
if(RES.type==="json"){
obj=RES.getNameJSONData(name);
}else if(RES.type==="xml"){
obj=RES.getNameXMLData(name)
}
if(!obj)return;
var div=document.createElement("div");
Object.assign(div.style,{
width:obj.w+"px",
height:obj.h+"px",
backgroundImage:"url("+obj.file+")",
backgroundPositionX:-obj.x+"px",
backgroundPositionY:-obj.y+"px",
position:"absolute"
});
return div;
},
changeImg:function (elem,name) {
var obj;
if(RES.type==="json"){
obj=RES.getNameJSONData(name);
}else if(RES.type==="xml"){
obj=RES.getNameXMLData(name)
}
if(!obj)return;
Object.assign(elem.style,{
width:obj.w+"px",
height:obj.h+"px",
backgroundImage:"url("+obj.file+")",
backgroundPositionX:-obj.x+"px",
backgroundPositionY:-obj.y+"px",
position:"absolute"
});
}
}
})();
UIComponent.js
var CheckBox=(function () {
function CheckBox(parent) {
this.checkView=this.init(parent);
}
/*
//ES5 單例
CheckBox.getInstance=function () {
if(!CheckBox._instance){
CheckBox._instance=new CheckBox();
}
return CheckBox._instance;
};*/
CheckBox.prototype.addProto({
_label:"",
_checked:false,
init:function (parent) {
if(this.checkView) return this.checkView;
var div=document.createElement("div");
var icon=RES.getImage("f-checkbox");
div.appendChild(icon);
var label=document.createElement("span");
div.style.position=icon.style.position=label.style.position="relative";
icon.style.float=label.style.float="left";
label.textContent="";
Object.assign(label.style,{
fontSize:"16px",
lineHeight:"20px",
marginLeft:"5px",
marginRight:"10px"
});
var h=RES.getNameXMLData("f-checkbox").h;
icon.style.top=(20-h)/2+"px";
div.appendChild(label);
parent.appendChild(div);
this.clickHandlerBind=this.clickHandler.bind(this);
div.addEventListener("click",this.clickHandlerBind);
return div;
},
clickHandler:function (e) {
this.checked=!this.checked;
},
set label(value){
this._label=value;
this.checkView.lastElementChild.textContent=value;
},
get label(){
return this._label;
},
set checked(value){
if(this._checked===value)return;
this._checked=value;
if(value){
RES.changeImg(this.checkView.firstElementChild,"f-checkbox-active");
}else{
RES.changeImg(this.checkView.firstElementChild,"f-checkbox");
}
this.checkView.firstElementChild.style.position="relative";
this.dispatchMessage(value);
},
dispatchMessage:function (value) {
var evt=new Event("change");
evt.checked=value;
evt.elem=this;
document.dispatchEvent(evt);
},
get checked(){
return this._checked;
}
});
return CheckBox;
})();
var Radio=(function () {
function Radio(parent,groupName) {
this.constructor.supClass.constructor.call(this,parent);
this.groupName=groupName;
this.checkView.self=this;
this.checkView.setAttribute("groupName",groupName);
}
Radio.extendClass(CheckBox);
Radio.prototype.addProto({
clickHandler:function (e) {
// console.log(Model.instance.menuData);
if(this.checked)return;
var list=document.querySelectorAll("[groupName="+this.groupName+"]");
for(var i=0;i<list.length;i++){
list[i].self.checked=false;
}
this.checked=true;
},
dispatchMessage:function (value) {
if(!value)return;
this.constructor.supClass.dispatchMessage.call(this,value);
}
});
return Radio;
})();
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/Model.js"></script>
<script src="js/Utile.js"></script>
<script src="js/UIComponent.js"></script>
</head>
<body>
<script>
document.addEventListener(RES.DATA_FINISH_EVENT,init);
RES.init(["new_icon"],"img/","xml");
var arr=["北京","上海","廣州","深圳","成都"];
function init() {
document.addEventListener("change",changeHandler);
var elem=document.createDocumentFragment();
for(var i=0;i<arr.length;i++){
var radio=new Radio(elem);
radio.label=arr[i];
if(i===0){
radio.checked=true;
}
}
document.body.appendChild(elem);
}
function changeHandler(e) {
console.log(e);
}
Model.instance.elem.addEventListener("chi",chiHandler);
Model.instance.elem.dispatchEvent(new Event("chi"));
function chiHandler(e) {
console.log(e)
}
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)的多種鼠標(biāo)拖放效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的多種鼠標(biāo)拖放效果,涉及JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)變換頁(yè)面元素屬性的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
JavaScript文本特效實(shí)例小結(jié)【3個(gè)示例】
這篇文章主要介紹了JavaScript文本特效,結(jié)合3個(gè)實(shí)例分析了javascript基于定時(shí)器的文字動(dòng)態(tài)操作特效相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-12-12
詳解webpack-dev-server的簡(jiǎn)單使用
本篇文章主要介紹了詳解webpack-dev-server的簡(jiǎn)單使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
JavaScript設(shè)計(jì)模式之單例模式原理與用法實(shí)例分析
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之單例模式原理與用法,結(jié)合實(shí)例形式分析了單例模式的原理、命名空間的使用、閉包、惰性單例形式以及單例模式的基本應(yīng)用,需要的朋友可以參考下2018-07-07
通過(guò)正則表達(dá)式實(shí)現(xiàn)表單驗(yàn)證是否為中文
正如標(biāo)題所言判斷一個(gè)輸入量是否為中文,通過(guò)正則表達(dá)式實(shí)現(xiàn),需要的朋友可以參考下2014-02-02
淺談javascript的數(shù)據(jù)類(lèi)型檢測(cè)
剖析一下javascript的數(shù)據(jù)類(lèi)型。這一次我們只簡(jiǎn)單討論下javascript的數(shù)據(jù)類(lèi)型檢測(cè),繼續(xù)期望大家踴躍發(fā)表意見(jiàn),尤其歡迎高手拍磚。2010-07-07
js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果
本文主要介紹了js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
TypeScript判斷對(duì)象類(lèi)型的4種方式代碼
這篇文章主要給大家介紹了關(guān)于TypeScript判斷對(duì)象類(lèi)型的4種方式代碼,TypeScript能根據(jù)一些簡(jiǎn)單的規(guī)則推斷(檢查)變量的類(lèi)型,你可以通過(guò)實(shí)踐很快的了解它們,需要的朋友可以參考下2023-07-07

