国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript “跑馬燈”抽獎活動代碼解析與優化(一)

HelKyle / 2070人閱讀

摘要:最近的項目中做了一個跑馬燈的抽獎特效插件。這里主要是來寫寫自己的優化過程。所以寫代碼的時候一定要注意一些小細節哈。。。在以后,其返回的元素順序等同于在中出現的先后順序。盡管是一個數組。這時從加入執行隊列到加入執行隊列中間時間間隔是。

最近的項目中做了一個“跑馬燈”的抽獎特效插件。上篇文章已經分享過htmlcss 的相關知識。這篇文章主要分享一些 JavaScript 相關的知識。這幾天在寫這篇文章的時候,也順便把自己的代碼重構了一下。
這里主要是來寫寫自己的優化過程。俗話說:

一個程序猿的進步是從對自己的代碼不滿意開始的。

開始之前先來看上篇文章遺漏的兩個問題和幾個知識點,是自己重構的過程中需要用到的:

1.移動端1px像素線的問題

對于設計師給我的手機端網頁的設計稿都是2倍圖。按照道理來說,在寫網頁的時候,所有對象的實際尺寸都是會除2。但是對于1像素的線呢?
先來看兩張圖,設計稿的效果:


在三星 S4下的實際顯示效果:


可以看到這個時候1px的線竟然顯示不出來了。這個問題是跟 S4手機的屏幕像素密度有關。關于屏幕像素密度和1px 線的關系有很多文章介紹,可以自行搜索了解。我這里的解決方案是,對1px 的線不做處理。是多少就寫多少。就算我的基礎單位是rem,也不是其它單位。

{
    position: absolute;
    width: 13rem;
    height: 9.2rem;
    border:1px solid #000;
}
2.pc 端瀏覽器和移動端瀏覽器容錯率的差異

先來看一段代碼:

$("[node-type=row-a").find("div");

很明顯可以發現,我使用的選擇器是有語法錯誤的。但是在瀏覽器中運行會有什么結果呢?看下圖:

很明顯可以看出對于屬性選擇器,就算我有語法錯誤,PC 端瀏覽器也是可以正確解析的。但是在手機端,這種寫法是不能夠正確解析,代碼不能夠運行。

所以寫代碼的時候一定要注意一些小細節哈。。。

3.jQuery中選擇器的使用

在使用 jQuery 或者是 Zepto 的過程中最經常使用的選擇器的寫法就是下面這樣吧,

    $("div.testClass")

只是在$() 中寫上自己需要的 Dom 節點的 class或者 ID 或 者使用屬性選擇器。
在查看 jQuery的文檔,對于$()會有這樣的描述:

jQuery([selector,[context]])

最重要的是看看對 context (它也是我們平時使用中最容易忽略,但是卻非常有用的一個參數)的描述:

默認情況下, 如果沒有指定context參數,$()將在當前的 HTML document中查找 DOM 元素;如果指定了 context 參數,如一個 DOM 元素集或 jQuery 對象,那就會在這個 context 中查找。在jQuery 1.3.2以后,其返回的元素順序等同于在context中出現的先后順序。

剛開始學習 JavaScript 那會兒,就聽說了操作 DOM 是很損耗瀏覽器性能,遍歷 DOM 也是很影響程序性能的。
如果我們在指定的范圍內查找需要的 Dom 會不會比從整個document 中查找快很多。而且在我們寫 web 組件的過程中,一個頁面上組件可能出現很多次,那我們怎么判斷我們要操作哪個組件呢?這個context參數就會起到決定行的作用。具體請繼續看哇。。。

4.jQuery對象到數組的轉換

剛開始學習 jQuery的時候在一本書上看到一句話:

jQuery對象就是一個 JavaScript 數組。

而且在使用 jQuery的過程中,都會遇到,js對象轉 jQuery對象,jQuery對象轉 js對象。關于這些基礎不做過多介紹。
但是有時候我們會想在 jQuery對象上運用一些原生Array對象的方法或者屬性。來看一個簡單的例子:

由圖中的代碼運行結果,可以知道在 jQuery對象上是沒有我們要使用reverse方法的。盡管test是一個數組
那么我們怎么辦才可以讓 jQuery對象使用原生的 Array對象的方法呢?

4.1使用原型鏈擴展

比如下面的代碼:

jQuery.prototype.reverse=function(){
    //一些操作
}

使用prototype來擴展方法的時候,大家一直比較認為是缺點的就是可能會污染已經存在的原型鏈上的方法。還有就是訪問方法的時候需要查找原型鏈。

4.2將 jQuery對象中的對象添加到數組中

看下面的代碼

var test = $("div.test");
var a=[];
$(test).each(function(){
    a.push($(this));
});

a.reverse();

這樣就可以將 jQuery對象翻轉。

4.3使用 Array對象的 from()方法

這種方法也是自己在編寫插件過程中使用的方法。看一下文檔描述:

Array.from() 方法可以將一個類數組對象或可迭代對象轉換成真實的數組。

個人感覺使用這個代碼比較簡潔。暫時還不知道有沒有性能的影響。繼續看下面的代碼:

var test = $("div.test");
var a= Array.from(test);
a.reverse();
5.setInterval()和setTimeout()對程序性能的影響

因為setTimeout()setInterval()這兩個函數在 JavaScript 中的實現機制完全一樣,這里只拿 setTimeout()驗證

那么來看兩段代碼

var a ={
    test:function(){
        setTimeout(this.bbb,1000);
    },
    bbb:function(){
        console.log("----");
    }
};
a.test()

輸出結果如下:

看下面的代碼輸出是什么

var a ={
    test:function(){
        setTimeout(function(){
            console.log(this);
            this.bbb();
        },1000);
    },
    bbb:function(){
        console.log("----");
    }
};
a.test();

運行這段代碼的時候,代碼報錯

由以上的結果可以知道,當我們在使用setInterval()setTimeout()的時候,在回掉中使用this的時候,this的作用域已經發生了改變,并且指向了 window

setTimeout(fn,0)的含義是,指定某個任務在主線程最早可得的空閑時間執行,也就是說,盡可能早得執行。它在"任務隊列"的尾部添加一個事件,因此要等到同步任務和"任務隊列"現有的事件都處理完,才會得到執行。

意思就是說在我們設置 setTimeout()之后,也可能不是立即等待多少秒之后就立即執行回掉,而是會等待主線程的任務都處理完后再執行,所以存在 "等待"超過自己設置時間的現象。同時也會存在異步隊列中已經存在了其它的 setTimeout() 也是會等待之前的都執行完再執行當前的。

看一個 Demo:

setTimeout(function bbb(){},4000);

function aaa(){
    setTimeout(function ccc(){},1000);
}

aaa();

如果運行上面的代碼,當執行完 aaa() ,JavaScript 線程空閑,這時開始計時:等待1秒后將 ccc()加入執行隊列,等待4s 將 bbb() 加入執行隊列。這時從 ccc()加入執行隊列到 bbb()加入執行隊列中間時間間隔是3s。

執行結果如下圖:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/49746.html

相關文章

  • JavaScript跑馬燈抽獎活動代碼解析優化

    摘要:最近的項目中做了一個跑馬燈的抽獎特效插件。這里主要是來寫寫自己的優化過程。所以寫代碼的時候一定要注意一些小細節哈。。。在以后,其返回的元素順序等同于在中出現的先后順序。盡管是一個數組。這時從加入執行隊列到加入執行隊列中間時間間隔是。 最近的項目中做了一個跑馬燈的抽獎特效插件。上篇文章已經分享過html和css 的相關知識。這篇文章主要分享一些 JavaScript 相關的知識。這幾天在...

    isaced 評論0 收藏0
  • JavaScript跑馬燈抽獎活動代碼解析優化

    摘要:最近的項目中做了一個跑馬燈的抽獎特效插件。這里主要是來寫寫自己的優化過程。所以寫代碼的時候一定要注意一些小細節哈。。。在以后,其返回的元素順序等同于在中出現的先后順序。盡管是一個數組。這時從加入執行隊列到加入執行隊列中間時間間隔是。 最近的項目中做了一個跑馬燈的抽獎特效插件。上篇文章已經分享過html和css 的相關知識。這篇文章主要分享一些 JavaScript 相關的知識。這幾天在...

    MRZYD 評論0 收藏0
  • JavaScript跑馬燈抽獎活動代碼解析優化(二)

    摘要:我的第一版是這樣做的因為下和左方向的燈是需要倒序的,所以我使用了兩個倒序的循環,其實當循環出現的時候,我們都應該思考我們的代碼是否有可優化的空間。到這里關于跑馬燈插件的代碼解析詳和優化就已經完了。 既然是要編寫插件。那么叫做插件的東西肯定是具有的某些特征能夠滿足我們平時開發的需求或者是提高我們的開發效率。那么叫做插件的東西應該具有哪些基本特征呢?讓我們來總結一下: 1.JavaScri...

    Muninn 評論0 收藏0
  • JavaScript跑馬燈抽獎活動代碼解析優化(二)

    摘要:我的第一版是這樣做的因為下和左方向的燈是需要倒序的,所以我使用了兩個倒序的循環,其實當循環出現的時候,我們都應該思考我們的代碼是否有可優化的空間。到這里關于跑馬燈插件的代碼解析詳和優化就已經完了。 既然是要編寫插件。那么叫做插件的東西肯定是具有的某些特征能夠滿足我們平時開發的需求或者是提高我們的開發效率。那么叫做插件的東西應該具有哪些基本特征呢?讓我們來總結一下: 1.JavaScri...

    Yi_Zhi_Yu 評論0 收藏0
  • JavaScript跑馬燈抽獎活動代碼解析優化(二)

    摘要:我的第一版是這樣做的因為下和左方向的燈是需要倒序的,所以我使用了兩個倒序的循環,其實當循環出現的時候,我們都應該思考我們的代碼是否有可優化的空間。到這里關于跑馬燈插件的代碼解析詳和優化就已經完了。 既然是要編寫插件。那么叫做插件的東西肯定是具有的某些特征能夠滿足我們平時開發的需求或者是提高我們的開發效率。那么叫做插件的東西應該具有哪些基本特征呢?讓我們來總結一下: 1.JavaScri...

    vincent_xyb 評論0 收藏0

發表評論

0條評論

HelKyle

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<