原生DOM兼容特性
瀏覽器主要也就是IE有點(diǎn)獨(dú)特,所以把IE重點(diǎn)區(qū)分開(kāi)
名稱(chēng) | 主流 | IE | |
---|---|---|---|
內(nèi)文本 | innerText | textContent | |
請(qǐng)求對(duì)象 | XMLHttpRequest | ActiveXObject ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"] |
|
監(jiān)聽(tīng)事件添加 | addEventListener(DOM2), ["on"+eventName](DOM0) |
attachEvent | |
監(jiān)聽(tīng)事件移除 | removeEventListener(DOM2), ["on"+eventName]=null(DOM0) |
detachEvent | |
事件對(duì)象 | function(e) e | window.event(IE7之前) | |
阻止默認(rèn)事件 | preventDefault | e.returnValue=false | |
阻止冒泡 | stopPropagation | e.cancelBubble=true | |
鍵盤(pán)事件鍵盤(pán)編碼 | e.charCode | e.keyCode | |
獲取剪貼板的文本 | e.clipboardData | window.clipboardData | |
設(shè)置剪貼板文本 | e.clipboardData.setData("text/plain",value); | window.clipboardData.setData("text",value); | |
觸發(fā)事件的元素 | e.target | e.srcElement | |
獲取樣式 | getComputedStyle(obj,false)[attr];(Firefox瀏覽器) obj.style.attr(只對(duì)filter,opacity等有效) obj.style[attr] |
obj.currentStyle[attr]; | |
窗口左邊的位置 | window.screenLeft | window.screenX | |
頁(yè)面視口大小 | window.innerHeight | if(document.compatMode=="CSS1Compat")window.documentElement.clientHeight; if(document.compatMode=="BackCompat")window.body.clientHeight |
|
獲取元素 | document.getElementById(id); | document.all[id];(IE5) | |
返回指定的屬性 | ele.getAttribute(attr) | ele.attribute[attr] | |
ele是否存在指定屬性 attr | ele.hasAttribute(attr) | ele.attributes[attr].specified; | |
鼠標(biāo)滾動(dòng),正數(shù)表示向上滾動(dòng) | function getWheelDelta(e){ if(e.wheelData){ return (client.engine.opera&&client.engine.opera<9.5)? -e.wheelData:e.wheelData; }else { return -e.detail*40;//firefox } } |
||
提取選中的文本 | textbox.value.subString(textbox.selectionStart,textbox.selectionEnd); | document.selection.createRange().text; (IE8之前沒(méi)有selectionStart,selectionEnd屬性 |
|
設(shè)置文本選中 | textbox.setSelectionRange(startIndex,stopIndex); | var range=textbox.createTextRange(); range.collapse(true); range.moveStart("character",0); range.moveEnd("character",stopIndex-startIndex); range.select() |
下面是積累下來(lái)的一些兼容函數(shù),可以當(dāng)做模板用
添加多個(gè)onload事件
處理ActiveXObject/XMLHttpRequest問(wèn)題
請(qǐng)求對(duì)象的屬性和方法設(shè)置
發(fā)送表單數(shù)據(jù)
跨瀏覽器的CORS
跨瀏覽器事件處理程序
處理target/srcelemnt問(wèn)題,代替this
實(shí)現(xiàn)insertAfter
給element加上類(lèi)名
判斷是不是數(shù)組
IE10之前不支持docunment.getElementByClassName
獲取css樣式
手寫(xiě)動(dòng)畫(huà)
取得窗口左邊和上邊的位置
取得頁(yè)面視口大小
檢測(cè)插件方法
獲取元素
檢查對(duì)象的某個(gè)特性是否存在
對(duì)象轉(zhuǎn)換成數(shù)組
返回指定的屬性
ele是否存在指定屬性
ele是否符合選擇器selector
獲取內(nèi)文本
獲取鼠標(biāo)事件的父元素
探測(cè)按的是鼠標(biāo)的哪個(gè)鍵
鼠標(biāo)滾動(dòng)事件
提取選中的文本
設(shè)置文本選中
bind方法對(duì)老版本的瀏覽器不起作用
包裝cookie
包裝子cookie
indexedDB
手寫(xiě)typeof
深度克隆
組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建對(duì)象
組合繼承
觀察者模式
分享一個(gè)題目
添加多個(gè)onload事件function addLoadEvent(func){ var oldonload=window.onload; if(typeof window.onload!= "function"){ window.onload=func; } else{ window.onload=function(){ oldonload(); func(); } } }處理ActiveXObject/XMLHttpRequest問(wèn)題
//第一種寫(xiě)法,《js高級(jí)程序設(shè)計(jì)》的寫(xiě)法 惰性載入技巧 function createXHR(){ if(typeof XMLHttpRequest!="undefined"){//XMLHttpRequest createXHR=function(){ return new XMLHttpRequest(); }; }else if(typeof ActiveXObject!="undefined"){//IE ActiveXObject createXHR=function(){ if(typeof arguments.callee.activeXString!="string"){ var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],//IE i,len; for(i=0,len=versions.length;i請(qǐng)求對(duì)象的屬性和方法設(shè)置 var xhr=createXHR(); xhr.onreadystatechange=function(){//firfox引入onlaod,readyState==4時(shí)觸發(fā),代替onreadystatechange if(xhr.readyState==4){ try{ if((xhr.status>=200&&xhr.status<300)||xhr.status==304){ alert(xhr.responseText); }else { alert("unsuccessful"); } }catch(ex){} } } xhr.onload=function(){ if((xhr.status>=200&&xhr.status<300)||xhr.status==304){ alert(xhr.responseText); }else { alert("unsuccessful"); } } xhr.onprogress=function(event){ if(event.lengthComputable){//進(jìn)度信息是否可用 console.log("Received"+event.position+"of"+event.totalSize); } } xhr.onerror=function(){ alert("error"); } xhr.timeout=1000; xhr.ontimeout=function(){ alert("timeout"); } xhr.open("get","example.php",true); xhr.overrideMimeType("text/xml"); xhr.send(null);//GET發(fā)送表單數(shù)據(jù)var form=document.getElementById("info"); xhr.send(serialize(form));//第一種寫(xiě)法 xhr.send(new FormData(form));//第二種寫(xiě)法跨瀏覽器的CORSfunction createCORSRequest(method,url){ var xhr=new XMLHttpRequest(); if("withCredentials" in xhr){ xhr.open(method,url,true); }else if(typeof XDomainRequest !="undefined"){ xhr=new XDomainRequest(); xhr.open(method,url); }else { xhr=null; } return xhr; } var request=createCORSRequest("get","http://www.somewhere"); if(request){ request.onload=function(){}; request.send(); }跨瀏覽器事件處理程序var eventUtil={ // 頁(yè)面加載完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != "function") { window.onload = fn; } else { window.onload = function() { oldonload(); fn(); }; } }, addEventHandler: function (obj, eventName, handler) { if (document.attachEvent) {//IE obj.attachEvent("on" + eventName, handler); } else if (document.addEventListener) {//DOM2級(jí) obj.addEventListener(eventName, handler, false);//false- 默認(rèn)。事件句柄在冒泡階段執(zhí)行 } else{//DOM0級(jí) obj["on"+eventName]=handler; } }, removeEventHandler:function(obj, eventName, handler){ if (document.attachEvent) {//IE obj.detachEvent("on" + eventName, handler); } else if (document.addEventListener) {//DOM2級(jí) obj.removeEventListener(eventName, handler, false); } else{//DOM0級(jí) obj["on"+eventName]=null; } }, //獲取event對(duì)象的引用,取到事件的所有信息,確保隨時(shí)能使用event; getEvent: function (e) { var ev = e || window.event; if (!ev) { var c = this.getEvent.caller; while (c) { ev = c.arguments[0]; if (ev && Event == ev.constructor) { break; } c = c.caller; } } return ev; }, //事件類(lèi)型 getType: function (e) { return e.type; }, //調(diào)用事件的元素 getElement: function (e) { return e.target|| e.srcElement; }, //阻止默認(rèn)事件 preventDefault: function (e) { e= this.getEvent(e); if(e.preventDefault){ e.preventDefault(); } else { return e.returnValue=false;//IE } }, //阻止冒泡 stopPropagation:function(e) { if(e.stopPropagation){ e.stopPropagation(); } else { e.cancelBubble=true;//IE } }, //鍵盤(pán)事件鍵盤(pán)的編號(hào) getCharCode:function (e){ if(typeof e.charCode=="number")return e.charCode; else return e.keyCode; }, //獲取剪貼板的文本 getClipbordText:function(e){ var clipboardData=(e.clipboardData||window.clipboardData); return clipboardData.getData("text"); }, //設(shè)置剪貼板文本 setClipboardText:function(e,value){ if(e.clipboardData){ return e.clipboardData.setData("text/plain",value); }else if(window.clipboardData){ return window.clipboardData.setData("text",value); } }, }處理target/srcelemnt問(wèn)題,代替thisfunction getActivatedObject(e) { var obj; if (!e) { // early version of IE obj = window.event.srcElement; } else if (e.srcElement) { // IE 7 or later obj = e.srcElement; } else { // DOM Level 2 browser obj = e.target; } return obj; }實(shí)現(xiàn)insertAfter/** * 把newElement插在targetElement后面 ,js的API只有insertBefore,沒(méi)有insertAfter */ function insertAfter(newElement,targetElement) { var parent = targetElement.parentNode; if (parent.lastChild == targetElement) { parent.appendChild(newElement); } else { parent.insertBefore(newElement,targetElement.nextSibling); } }給element加上類(lèi)名function addClass(element,value) { if (!element.className) { element.className = value; } else { newClassName = element.className; newClassName+= " "; newClassName+= value; element.className = newClassName; } }判斷是不是數(shù)組function isArray(arg) { //return Object.prototype.toString.call(arr)=="[Object Array]";這種方法也可以 if (typeof arg == "object") { //所有數(shù)組都有一個(gè)包含單詞"arry"的constructor,最后的i表示不區(qū)分大小寫(xiě) var criteria = arg.constructor.toString().match(/array/i); return (criteria != null); } return false; }IE10之前不支持docunment.getElementByClassNamefunction getByClass(clsName,parent){ if(docunment.getElementByClassName) return docunment.getElementByClassName(clsName); //IE10之前 var oParent=parent?document.getElementById(parent):document, eles=[], elements=oParent.getElementsByTagName("*"); for(var i=0,l=elements.length;i獲取css樣式 function getStyle(obj,attr){ if(obj.currentStyle) {//IE 瀏覽器 return obj.currentStyle[attr]; }else{//Firefox瀏覽器 return getComputedStyle(obj,false)[attr]; } }手寫(xiě)動(dòng)畫(huà)//動(dòng)畫(huà) startMove(oLi,{width:400,height:200,opacity:100}) function startMove(obj,json,fn){ clearInterval(obj.timer); obj.timer=setInterval(function () { for(var attr in json){ var cur=0; if(attr=="opacity"){ cur=Math.round(parseFloat(getStyle(obj,attr))*100); } else { cur=parseInt(getStyle(obj,attr)); } var speed=(json[attr]-cur)/8; speed=speed>0?Math.ceil(speed):Math.floor(speed); var flag=true; if(cur!=json[attr]){//使得所有屬性做完運(yùn)動(dòng)才結(jié)束 flag=false; } if(attr=="opacity"){ obj.style.filter="alpha(opacity:"+(cur+speec)+")"; obj.style.opacity=(cur+speed)/100; } else{ obj.style[attr]=(cur+speed)+"px"; } } if(flag){ clearInterval(obj.timer); if(fn){ fn(); } } }) }取得窗口左邊和上邊的位置var leftPos=(typeof window.screenLeft =="number")?window.screenLeft:window.screenX;取得頁(yè)面視口大小var pageWidth=window.innerWidth, pageHeight=window.innerHeight; if(typeof pageHeight!="number"){ if(document.compatMode=="CSS1Compat"){//標(biāo)準(zhǔn)模式 pageHeight=window.documentElement.clientHeight; pageWidth=window.documentElement.clientWidth; } else {//BackCompat pageHeight=window.body.clientHeight; pageWidth=window.body.clientWidth; } }檢測(cè)插件方法/** * * 檢測(cè)插件方法一,IE下無(wú)效 */ function hasPlugin(name){ name=name.toLowerCase(); for(var i=0;i獲取元素 function getElement(id){ if(document.getElementById){ return document.getElementById(id); }else if(document.all){//IE5前 return document.all[id]; }else { throw new Error("no way to retrieve element!"); } }檢查對(duì)象的某個(gè)特性是否存在function isHostMethod(object,property){ var t =typeof object[property]; return t=="function"|| (!!(t=="object")&&object[property])|| t=="unknown";//不懂 }對(duì)象轉(zhuǎn)換成數(shù)組function convertToArray(nodes){ var array=null; try{ array=Array.propotype.slice.call(nodes,0);//IE8前無(wú)效 }catch(ex){ for(var i=0,len=nodes.length;i返回指定的屬性 /** * * 返回指定的屬性 IE ele.attribute[] * Element.getAttribute() */ function outputAttribute(ele){ var pairs=new Array(), attrname,attrvalue,u,len; for(i=0,len=ele.attribute.length;iele是否存在指定屬性 /** * * ele是否存在指定屬性 attr */ function hasattribute(ele,attr){ if(ele.hasAttribute){ return ele.hasAttribute(attr); }else {//IE return ele.attributes[attr].specified; } }ele是否符合選擇器selector/** * ele是否符合選擇器selector */ function matchesSelector(ele,selector){ if(ele.matchesSelector){ return ele.matchesSelector(selector); }else if(ele.msmatchesSelector){ return ele.msmatchesSelector(selector); }else if(ele.mozmatchesSelector){ return ele.mozmatchesSelector(selector); }else if(ele.webkitmatchesSelector){ return ele.webkitmatchesSelector(selector); }else{ throw new Error("not support"); } }獲取內(nèi)文本//innerText/textContent function getInnerText(ele){ return (typeof ele.innerText=="string")? ele.innerText:ele.textContent; }獲取鼠標(biāo)事件的父元素function getRelatedTarget(e){ if(e.relatedTarget) return e.relatedTarget; else if(e.fromElement) return e.fromElement;//mouseover else if(e.toElement) return e.toElement;//mouseout else return null; }探測(cè)按的是鼠標(biāo)的哪個(gè)鍵function getButton(e){ if(document.implementation.hasFeature("MouseEvents","2.0")){ return e.button; }else { switch(e.button){ case 0 : case 1: case 3: case 5: case 7: return 0; case 2: case 6:return 2; case 4:return 1; } } }鼠標(biāo)滾動(dòng)事件//鼠標(biāo)滾動(dòng),正數(shù)表示向上滾動(dòng) function getWheelDelta(e){ if(e.wheelData){ return (client.engine.opera&&client.engine.opera<9.5)? -e.wheelData:e.wheelData; }else { return -e.detail*40;//firefox } }提取選中的文本function getSelectedText(textbox){ if(typeof selectionStart=="number"){ return textbox.value.subString(textbox.selectionStart,textbox.selectionEnd); }else if(document.selection){//IE8之前沒(méi)有selectionStart,selectionEnd屬性 return document.selection.createRange().text; } }設(shè)置文本選中function selectText(textbox,startIndex,stopIndex){ if(textbox.setSelectionRange){ textbox.setSelectionRange(startIndex,stopIndex); }else if(textbox.createTextRange){//IE var range=textbox.createTextRange(); range.collapse(true); range.moveStart("character",0); range.moveEnd("character",stopIndex-startIndex); range.select(); } }bind方法對(duì)老版本的瀏覽器不起作用Function.prototype.bind = Function.prototype.bind || function(context){ var self = this; return function(){ return self.apply(context, arguments); }; }包裝cookie//cookie var cookieUtil={ // 創(chuàng)建cookie setcookie:function (name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); if (expires instanceof Date) { cookieText += "; expires=" + expires.toGMTString(); } if (path) { cookieText += "; path=" + path; } if (domain) { cookieText += "; domain=" + domain; } if (secure) { cookieText += "; secure"; } document.cookie = cookieText; }, // 獲取cookie getcookie:function (name) { var cookieName = encodeURIComponent(name) + "="; var cookieStart = document.cookie.indexOf(cookieName); var cookieValue = null; if (cookieStart > -1) { var cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1) { cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); } return cookieValue; }, // 刪除cookie unsetcookie:function (name,path,domain,secure) { this.setcookie(name,"",new Date(0),path,domain,secure); } }包裝子cookie//子cookie var subcookieUtil={ get:function(name,subname){ var subcookie=getAll(name); if(subcookie){ return subcookie[subname]; }else { return null; } }, getAll:function(name){ var cookieName = encodeURIComponent(name) + "="; var cookieStart = document.cookie.indexOf(cookieName); var cookieValue = null; var subcookie,result={}; var len,i,parts; if (cookieStart > -1) { var cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1) { cookieEnd = document.cookie.length; } cookieValue = document.cookie.substring(cookieStart + cookieName.length, cookieEnd); if(cookieValue.length>0){ subcookie=cookieValue.split("&"); len=subcookie.length; for(i=0;iindexedDB0&&subcookies.hasOwnProperty(subname)){ subcookiesParts.push(encodeURIComponent(subname)+"="+encodeURIComponent(subcookies[subname])); } } if(subcookiesParts.length>0){ cookieText+=subcookiesParts.join("&"); if (expires instanceof Date) { cookieText += "; expires=" + expires.toGMTString(); } if (path) { cookieText += "; expires=" + expires; } if (domain) { cookieText += "; domain=" + domain; } if (secure) { cookieText += "; secure"; } } document.cookie = cookieText; }, unset:function(name,subname,path,domain,secure){ var subcookies=this.getAll(name); if(subcookies){ delete subcookies[subname]; this.setAll(name,subcookies,null,path,domain,secure); } }, unsetAll:function(name,path,domain,secure){ this.setAll(name,null,new Date(0),path,domain,secure); } } var indexedDB=window.indexedDB||window.mozIndexedDB||window.msIndexedDB||window.webkitIndexedDB; var idbRequest=indexedDB.open("vvv"); idbRequest.onsuccess=function(event){ database=event.target.result; } idbRequest.onerror=function(event){ alert(event.target.errorCode); }手寫(xiě)typeoffunction type(obj) { var toString = Object.prototype.toString; var map = { "[object Boolean]" : "boolean", "[object Number]" : "number", "[object String]" : "string", "[object Function]" : "function", "[object Array]" : "array", "[object Date]" : "date", "[object RegExp]" : "regExp", "[object Undefined]": "undefined", "[object Null]" : "null", "[object Object]" : "object" }; if(obj instanceof Element) {//因?yàn)閷?duì)不同標(biāo)簽,toString會(huì)返回對(duì)應(yīng)不同標(biāo)簽的構(gòu)造函數(shù) return "element"; } return map[toString.call(obj)]; }深度克隆/** * * 深度克隆方法一,用的是instanceof */ function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; // 創(chuàng)建一個(gè)空的數(shù)組 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; } else if (Obj instanceof Object){ buf = {}; // 創(chuàng)建一個(gè)空對(duì)象 for (var k in Obj) { // 為這個(gè)對(duì)象添加新的屬性 buf[k] = clone(Obj[k]); } return buf; }else{ return Obj; } } /** * * 深度拷貝方法二,用的是 toString */ function deepClone(data) { var t = type(data), o, i, ni; if(t === "array") { o = []; }else if( t === "object") { o = {}; }else { return data; } if(t === "array") { for (i = 0, ni = data.length; i < ni; i++) { o.push(deepClone(data[i])); } return o; }else if( t === "object") { for( i in data) { o[i] = deepClone(data[i]); } return o; } } //通過(guò)JSON.stringify一下,然后再JSON.parse一下,就能實(shí)現(xiàn)深拷貝。但是數(shù)據(jù)類(lèi)型只支持基本數(shù)值類(lèi)型。 var obj = { a: "a", b: function(){console.log("b")} } JSON.stringify(obj);// "{"a":"a"}"組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建對(duì)象//組合使用構(gòu)造函數(shù)模式和原型模式創(chuàng)建對(duì)象 function Person(name,age){ this.name=name; this.age=age; this.friends=["may","john"]; } Person.prototype={ constructor:Person,//字面量形式的原型默認(rèn)構(gòu)造函數(shù)是object,所以在這里要指定constructor sayName=function(){ alert(this.name); } }組合繼承//組合繼承 funcion super(name){ this.name=name; this.color=["red","blue"]; } Super.prototype.sayname=function(){ alert(this.name); } function Sub(age){ Super.call(this); this.age=age; } Sub.prototype=new Super();// Sub.prototype.constructor=Sub;//這個(gè)很重要??! Sub.prototype.sayage=function(){ alert(this.age); }觀察者模式//觀察者模式 function EventTarget(){ this.handlers = {}; } EventTarget.prototype = { constructor: EventTarget, addHandler: function(type, handler){ if (typeof this.handlers[type] == "undefined"){ this.handlers[type] = []; } this.handlers[type].push(handler); }, fire: function(event){//執(zhí)行 if (!event.target){ event.target = this; } if (this.handlers[event.type] instanceof Array){ var handlers = this.handlers[event.type]; for (var i=0, len=handlers.length; i < len; i++){ handlers[i](event); } } }, removeHandler: function(type, handler){ if (this.handlers[type] instanceof Array){ var handlers = this.handlers[type]; for (var i=0, len=handlers.length; i < len; i++){ if (handlers[i] === handler){ break; } } handlers.splice(i, 1); } } };分享一個(gè)題目//[附加題] 請(qǐng)實(shí)現(xiàn)下面的自定義事件 Event 對(duì)象的接口,功能見(jiàn)注釋(測(cè)試1) //該 Event 對(duì)象的接口需要能被其他對(duì)象拓展復(fù)用(測(cè)試2) //測(cè)試1 Event.on("test", function (result) { console.log(result); }); Event.on("test", function () { console.log("test"); }); Event.emit("test", "hello world"); // 輸出 "hello world" 和 "test" // 測(cè)試2 var person1 = {}; var person2 = {}; Object.assign(person1, Event); Object.assign(person2, Event); person1.on("call1", function () { console.log("person1"); }); person2.on("call2", function () { console.log("person2"); }); person1.emit("call1"); //輸出 "person1" person1.emit("call2"); // 沒(méi)有輸出 person2.emit("call1"); // 沒(méi)有輸出 person2.emit("call2"); // 輸出 "person2" var Event = { // 通過(guò)on接口監(jiān)聽(tīng)事件eventName // 如果事件eventName被觸發(fā),則執(zhí)行callback回調(diào)函數(shù) on: function (eventName, callback) { //你的代碼 if(!this.handles){ //Object.assign(target, source); //這個(gè)是ES6的新對(duì)象方法,用于對(duì)象的合并,將源對(duì)象(source)的所有可枚舉屬性,復(fù)制到目標(biāo)對(duì)象(target)。 Object.defineProperty(this, "handles", { value: {}, enumerable: false,//關(guān)鍵! configurable: true, writable: true }) } if(!this.handles[eventName]){ this.handles[eventName]=[]; } this.handles[eventName].push(callback); }, // 觸發(fā)事件 eventName emit: function (eventName) { //你的代碼 if(this.handles[arguments[0]]){ for(var i=0;i50 && nHeight > 50) { aResult.push(oNode); } } var aChildNodes = oNode.childNodes; if (aChildNodes.length > 0) { for (var i = 0, l = aChildNodes.length; i < l; i++) { var oTmp = aChildNodes[i]; aResult = aResult.concat(traverse(oTmp)); } } return aResult; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92936.html
摘要:前言終于要做這個(gè)計(jì)劃了,前端框架千千萬(wàn),絕不能一頭扎進(jìn)去盲目開(kāi)始,本片文章總結(jié)一下目前前各種端框架,以及它們的用途主要解決什么問(wèn)題,然后最后做出學(xué)習(xí)計(jì)劃。希望入了前端坑的同學(xué)們可以有所幫助。但是庫(kù)與框架很難嚴(yán)格區(qū)分,所以統(tǒng)一稱(chēng)為解決方案。 前言:終于要做這個(gè)計(jì)劃了,前端框架千千萬(wàn),絕不能一頭扎進(jìn)去盲目開(kāi)始,本片文章總結(jié)一下目前前各種端框架,以及它們的用途主要解決什么問(wèn)題,然后最后做出學(xué)...
摘要:由于是需要兼容的后臺(tái)系統(tǒng),該項(xiàng)目并不能使用到等技術(shù),因此我在上的經(jīng)驗(yàn)大都是使用原生的編寫(xiě)的,可以看見(jiàn)一個(gè)組件分為兩部分視圖部分,和數(shù)據(jù)部分。 在公司里幫項(xiàng)目組里開(kāi)發(fā)后臺(tái)系統(tǒng)的前端項(xiàng)目也有一段時(shí)間了。 vue這種數(shù)據(jù)驅(qū)動(dòng),組件化的框架和react很像,從一開(kāi)始的快速上手基本的開(kāi)發(fā),到后來(lái)開(kāi)始自定義組件,對(duì)element UI的組件二次封裝以滿足項(xiàng)目需求,期間也是踩了不少坑。由于將來(lái)很長(zhǎng)一...
摘要:如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)之間的通信阿里調(diào)用等本地存儲(chǔ)方式頁(yè)面可見(jiàn)性可以有哪些用途通過(guò)的值檢測(cè)頁(yè)面當(dāng)前是否可見(jiàn),以及打開(kāi)網(wǎng)頁(yè)的時(shí)間等在頁(yè)面被切換到其他后臺(tái)進(jìn)程的時(shí)候,自動(dòng)暫停音樂(lè)或視頻的播放網(wǎng)頁(yè)驗(yàn)證碼是干嘛的,是為了解決什么安全問(wèn)題。 前端面試題總結(jié)——綜合問(wèn)題(持續(xù)更新中) 1.頁(yè)面從輸入U(xiǎn)RL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么?(流程說(shuō)的越詳細(xì)越好) 1.輸入域名地址2.發(fā)...
摘要:如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)之間的通信阿里調(diào)用等本地存儲(chǔ)方式頁(yè)面可見(jiàn)性可以有哪些用途通過(guò)的值檢測(cè)頁(yè)面當(dāng)前是否可見(jiàn),以及打開(kāi)網(wǎng)頁(yè)的時(shí)間等在頁(yè)面被切換到其他后臺(tái)進(jìn)程的時(shí)候,自動(dòng)暫停音樂(lè)或視頻的播放網(wǎng)頁(yè)驗(yàn)證碼是干嘛的,是為了解決什么安全問(wèn)題。 前端面試題總結(jié)——綜合問(wèn)題(持續(xù)更新中) 1.頁(yè)面從輸入U(xiǎn)RL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么?(流程說(shuō)的越詳細(xì)越好) 1.輸入域名地址2.發(fā)...
摘要:如何實(shí)現(xiàn)瀏覽器內(nèi)多個(gè)標(biāo)簽頁(yè)之間的通信阿里調(diào)用等本地存儲(chǔ)方式頁(yè)面可見(jiàn)性可以有哪些用途通過(guò)的值檢測(cè)頁(yè)面當(dāng)前是否可見(jiàn),以及打開(kāi)網(wǎng)頁(yè)的時(shí)間等在頁(yè)面被切換到其他后臺(tái)進(jìn)程的時(shí)候,自動(dòng)暫停音樂(lè)或視頻的播放網(wǎng)頁(yè)驗(yàn)證碼是干嘛的,是為了解決什么安全問(wèn)題。 前端面試題總結(jié)——綜合問(wèn)題(持續(xù)更新中) 1.頁(yè)面從輸入U(xiǎn)RL到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么?(流程說(shuō)的越詳細(xì)越好) 1.輸入域名地址2.發(fā)...
閱讀 1876·2021-11-25 09:43
閱讀 3705·2021-11-24 10:32
閱讀 1099·2021-10-13 09:39
閱讀 2347·2021-09-10 11:24
閱讀 3363·2021-07-25 21:37
閱讀 3481·2019-08-30 15:56
閱讀 876·2019-08-30 15:44
閱讀 1466·2019-08-30 13:18