1. 程式人生 > >關於前端面試的一些知識點2

關於前端面試的一些知識點2

上一篇主要寫了一些基礎的知識但面試中常被問到的點,這一篇來點概念性的東西。本篇內容是我邊看JavaScript高階程式設計邊寫的,大家可以去看一下,不過那本書可比我這篇文章長的多,也可先看我的文章。最後祝大家前程似錦

1.HTML CSS JS的一些基礎概念

1.1 瞭解BOM

ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那麼BOM則無疑是真正的核心 ——《JavaScript高階程式設計》 而BOM的核心物件是window,還有loaction,navigator,screen,history. 其中window物件的重要性不言而喻,屬性太多我就不寫了。 loaction物件,我想類似下面的這種跳轉應該經常用吧,還有其他的一些屬性可以自行了解

 location.href = "https://blog.csdn.net/weixin_43264048";

navigator物件,這個東西用的最多的就是使用者代理檢測了,常見的場景應該就是檢測使用者的終端是PC還是手機了

 function browserRedirect(){
        var UserAgent = navigator.userAgent.toLowerCase();
        var bIsIpad = UserAgent.match(/ipad/i) == 'ipad';
        var bIsIphone = UserAgent.match(/iphone os/i) == 'iphone os';
        var bIsMidp = UserAgent.match(/midp/i) == 'midp';
        var bIsUc7 = UserAgent.match(/rv:1.2.3.4/i) == 'rv:1.2.3.4';
        var bIsUc = UserAgent.match(/ucweb/i) == 'web';
        var bIsCE = UserAgent.match(/windows ce/i) == 'windows ce';
        var bIsWM = UserAgent.match(/windows mobile/i) == 'windows mobile';
        var bIsAndroid = UserAgent.match(/android/i) == 'android';
        if(bIsIpad || bIsIphone || bIsMidp || bIsUc7 || bIsUc || bIsCE || bIsWM || bIsAndroid ){
                 return false;
            }
            return true;
        }

Screen物件,這個東西實際程式設計的時候基本沒用過,書中也是這麼說的,就不介紹了。 history物件,這個東西儲存著使用者上網的記錄,但是獲取不了訪問的URL。下面是一個基本的使用

history.back(); //後退一頁
  history.forward(); 前進一頁

1.2 事件

1.事件冒泡 指的是事件由最具體的元素接收,逐級向上傳播。

<body onclick="fn()">
     <button id="div">123</button>
</body>
<script>
       document.getElementById("div").onclick = function(e){
            // e.stopPropagation(); //可以阻止冒泡
            alert(1); 
       }
      function fn(){
        alert("我冒泡到body了");
      }
  </script>

2.事件捕獲和事件冒泡 看如下程式碼

<body>
     <button id="div">123</button>
</body>
     var a  =  document.getElementById("div");
     var b = document.getElementsByTagName("body")[0];
     a.addEventListener("click",function(){
        alert(1);
     },false);
     b.addEventListener("click",function(){
       alert(2); //先彈出
     },true);
     var a  =  document.getElementById("div");
     var b = document.getElementsByTagName("body")[0];
     a.addEventListener("click",function(){
        alert(1);
     },false);
     b.addEventListener("click",function(){
       alert(2);  //後彈出
     },false);

兩段程式碼就是修改了第二個addEventListener中的布林值。 JavaScript高階程式設計對這個布林值的解釋是true則函式在捕獲階段呼叫,false則函式在冒泡階段呼叫 3.load事件 Javascript中最常用的一個事件就是load,當頁面完全載入後(包括所有影象,JavaScript檔案,CSS檔案等外部資源)就會觸發window上面的load事件

 window.onload = function(){}

你用JQ的時候是不是經常這麼寫

$(function(){})

那麼兩者有什麼區別呢?不知道趕緊搜一下。

Image中load事件的用法

<img src="byf.jpg" onload="fn()"/>
 function fn(){
      alert("img已經載入好了");
    }

假設你的web小遊戲中有個背景圖片,遊戲人物也是個圖片,那麼現在你應該知道遊戲開始的邏輯應該要怎麼寫了。load還可以作為動態載入Img圖片的回撥函式,以及動態載入JS檔案的回撥函式。 4.移動端touch事件 touchstart:當手指觸控式螢幕幕時觸發;即使已經有一個手指放在螢幕上也會觸發 touchmove:當手指在螢幕上滑動時連續觸發。在這個事件發生的期間,呼叫preventDefault()可以阻止滾動 touchend:當手指從螢幕上移開時觸發 click:最後觸發 JavaScript中說click比touchend先觸發,我測試的是click最後觸發。不當之處請指出。 記得我在用VUE搭我的個人網站的時候手指滑動寫一個快速切換頁面的效果,下面是程式碼

        touchstart:function(ev){
           this.changepage = false;  //讓變數變為false
          if(ev.touches.length == 1) {    //tounches類陣列,等於1時表示此時有隻有一隻手指在觸控式螢幕幕
              this.startX = ev.touches[0].clientX; // 記錄開始位置
            }
        },
        touchMove:function(ev) {
                        ev = ev || event;
                        if(ev.touches.length == 1) {
                            this.moveX = ev.touches[0].clientX; //滑動時距離瀏覽器左側的距離
                            this.disX = this.moveX-this.startX; //實時的滑動的距離-起始位置=實時移動的位置
                            if(this.disX>65 || this.disX<-65){   //滑動的距離,距離太小會導致摸一下就切換頁面
                                this.changepage = true;          //定義的變數判斷是否切換頁面
                                ev.preventDefault();
                            }
                        }
                    },
        touchend:function(ev){    
              if(this.changepage){
                 ev = ev || event;
                 ev.preventDefault();
                  if(this.disX>65) {
                    this.delPage(); 
                }else if(this.disX<-65){
                      this.addPage();
                }
              }       
        }

這裡面有幾個細節,因為我要實現滑動切換頁面的效果,所以我的事件是繫結在body中的,如果你在touchstart裡面寫了ev.preventDefault()這個東西,那麼頁面上所有的click事件失效。如果你在touchMove或touchend中不判斷就寫ev.preventDefault,那麼抱歉你的頁面滾動條失效。當然這個方法還有一個BUG,如果你切換頁面切換的非常快會報一個Ignored attempt to cancel a touchmove event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.的錯誤。原因是我的切換頁面時會有一個動畫,切換時會有滾動條,這個時候你又去切換頁面觸發ev.preventDefault()事件就會報錯。用一個截流函式就可以搞定,後面會寫哦。 5.事件委託 利用事件冒泡,將子元素的事件繫結在父元素上面。 本章就寫到這裡了,又回顧了一遍JavaScript高程看得頭有點暈,真的有點厚。歡迎大家留言交流