javascript雜記


title: javascript雜記
date: 2017-05-21 14:34:25
tags: javascript筆記


this的基本用法

首先有一個函數(shù)

function fn1(){
    alert(this);
}

直接調(diào)用則this指向window

fn1();  // 指向window;

如果是被元素對象調(diào)用

div.onclick = function(){
    var _this = this;    // 這個this指的就是div元素對象
    fn1();    // 這里打印的this值的就是window,因為上面fn1函數(shù)的環(huán)境就是在全局,所以如果直接調(diào)用函數(shù)剩愧,那么this都是window
}

div.onclick = fn1;    // 這里打印的this就是div元素對象行嗤,這里已經(jīng)改變了fn1函數(shù)的環(huán)境冠息,賦值給了div元素對象的事件屬性中弄喘,環(huán)境自然也從全局變?yōu)閐iv元素對象君旦。

判斷瀏覽器名稱

function myBrowser(){
    var userAgent = navigator.userAgent;   //取得瀏覽器的userAgent字符串
    if (userAgent.indexOf("Opera") > -1) {   //判斷是否Opera瀏覽器
        return "Opera"
    };
    if (userAgent.indexOf("Firefox") > -1) { //判斷是否Firefox瀏覽器
        return "FF";
    };
    if (userAgent.indexOf("Chrome") > -1){  //判斷是否Chrome瀏覽器
        return "Chrome";
    }
    if (userAgent.indexOf("Safari") > -1) { //判斷是否Safari瀏覽器
        return "Safari";
    }
    if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1) {  //判斷是否IE瀏覽器
        return "IE";
    };
}

火狐瀏覽器禁止頁面滾動

if (navigator.userAgent.toLowerCase().indexOf('firefox')>=0){
    if (e.preventDefault)
    e.preventDefault();
    e.returnValue = false;
}

鼠標滾輪事件

非FireFox瀏覽器是使用onmousewheel事件江场,而FireFox瀏覽器使用DOMMouseScroll事件纺酸。

非FireFox瀏覽器使用的是wheelDelta方法判斷滾動方向,F(xiàn)ireFox瀏覽器使用的是detail方法判斷滾動方向址否。

wheelDelta:-120和detail:3 代表向下滾動餐蔬。wheelDelta:120和detail:-3代表向上滾動。

document.body.onmousewheel = function(event) {
    event = event || window.event;
    console.log(event.wheelDelta)
};

document.body.addEventListener("DOMMouseScroll", function(event) {
    console.log(event.detail)
});

jquery兼容性的滾輪事件

$('#scrollSelect-view').on("mousewheel DOMMouseScroll", function (e) {

    var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? 1 : -1)) ||        // chrome & ie
                (e.originalEvent.detail && (e.originalEvent.detail > 0 ? -1 : 1));                  // firefox

    if (delta > 0) {
        // 向上滾
        console.log("wheelup");
    } else if (delta < 0) {
        // 向下滾
        console.log("wheeldown");
    }
});

自定義屬性

有時候?qū)懛椒〞r會定義大量變量佑附,有的變量其實比較多余樊诺,很多數(shù)據(jù)可以存儲到元素對象的自定義屬性中去。這樣不用去考慮作用域的問題音同,因為只要這個元素對象存在在這個方法內(nèi)就可以去使用词爬,但是最好只保存和這個元素對象有關(guān)的屬性。

比如:下面代碼就是权均,在事件處理函數(shù)內(nèi)部只能獲取i循環(huán)完畢之后的值顿膨,而通過把i的值作為元素對象的自定義屬性賦值,就沒有作用域的限制叽赊。

for(var i = 0; i < 5; i++) {
    div.index = i;
    div[i].onclick = function(){
        alert(i);
        alert(this.index);
    }
}

排他思想和清空上一個

排他

通常在tab欄切換中經(jīng)常用到排他虽惭,比如有10個選項,只有當前項才有背景色蛇尚,通常顏色是通過一個類名掛鉤到css中去設(shè)置的芽唇,那么排他就是每次先將所有導航選項的類名清空,然后只給當前點擊的這個元素對象添加類名。

for(var i = 0;i < Lis.length;i++){
    Lis[i].index = i;
    Lis[i].onclick = function(){
        // 這里開始排他
        for(var i = 0; i < Lis.length;i++){
            Lis[i].className = '';
        }
        // 單獨設(shè)置當前選項
        Lis[this.index].className = 'active';
    };
};

清空上一個

這種效果除了排他之外還可以通過清除上一個選項來完成匆笤。創(chuàng)建一個變量存儲上一個選中元素研侣,在點擊當前元素時候清空上一個類名,之后把自己賦值給這個變量炮捧,如此每次只需要清空一個元素的類名即可庶诡。

var oElem = null;
// 初始化,默認第一個元素是當前項
Lis[0].className = 'active';
Elem = Lis[0];

for(var i = 0;i < Lis.length;i++){
    Lis[i].index = i;
    Lis[i].onclick = function(){
        // 這里開始清空上一個
        Elem.className = '';
        Elem = this;
        Lis[this.index].className = 'active';
    };
};

jquery的stop()方法

$(selector).stop(stopAll,goToEnd)

stopAll 可選咆课。規(guī)定是否停止被選元素的所有加入隊列的動畫末誓。

goToEnd 可選。規(guī)定是否允許完成當前的動畫书蚪。該參數(shù)只能在設(shè)置了 stopAll 參數(shù)時使用喇澡。

使用懶加載插件

使用的 jquery.lazyload

調(diào)用下載好的插件

$(function(){
    $("img.imglazyload").lazyload({
        threshold : 200,
        effect : "fadeIn"
    });
});

html部分,一定要在外層包一個div并且設(shè)置寬高殊校,不要用圖片去撐開晴玖。

<div class="item-image">
    <img class="imglazyload" data-original="圖片地址">
</div>

js中的NaN

  1. NaN是一個數(shù)字類型但不是一個數(shù)值。
  2. 出現(xiàn)NaN肯定是進行了非法操作而不是獲取數(shù)值有錯为流,如果獲取數(shù)值有錯是undefind呕屎。
  3. NaN與自己本身也是不相等的。
  4. NaN轉(zhuǎn)為布爾是false敬察。
  5. NaN本身的意思是'不是一個數(shù)值'

isNaN可以判斷某些類型是不是一個數(shù)字類型秀睛。如果判斷到是一個數(shù)字為false(不是一個數(shù)值這個判定是錯的),而不是數(shù)字類型的是true(不是一個數(shù)值這個判定是對的)莲祸。

NaN在判斷時是在內(nèi)部使用Number()方法轉(zhuǎn)換蹂安,所以是不是數(shù)字類型的依據(jù)主要是看Number()轉(zhuǎn)出的是什么類型。比如布爾值虫给、空字符串藤抡、字符串數(shù)字都會被認為是數(shù)字類型而返回false侠碧。

js的作用域基礎(chǔ)

作用域?qū)嶋H上是瀏覽器js解析器的一種工作方式抹估。

瀏覽器的js解析器在讀取javascript代碼時會先提升變量和函數(shù),再去逐行解讀代碼弄兜。這是每個作用域的解析步驟药蜻。

預解析

根據(jù)var、function替饿、參數(shù) 找一些東西语泽。

首先js解析器會搜索所有var和function找到所有變量,var聲明的變量提升時值都是未定義视卢,提升function時候會將整個函數(shù)代碼塊一起提升踱卵。

當var和function重名時,會保留function,覆蓋var,但是如果兩個以上同名的function惋砂,那么就看聲明的先后順序了妒挎。

逐行解析

變量提升之后,js解析器會開始逐行解析代碼西饵,這時只有表達式可以改變變量的值酝掩,用下邊的案例來說明。

alert(a);   // function a(){alert(4);}
var a = 1;
alert(a);   // 1
function a(){alert(2);}
alert(a);   // 1
var a = 3;
alert(a)    // 3
function a(){alert(4);}
alert(a);   // 3

a();    // 報錯

第一個alert打印出函數(shù)的原因是變量提升的規(guī)則眷柔,后面的a打印的都是變量的值而不是函數(shù)期虾,因為變量賦值是一種表達式,而函數(shù)只是一個聲明并不是表達式驯嘱。并且因為現(xiàn)在a是一個數(shù)值镶苞,所以調(diào)用時自然會報錯。

多組script

自上而下的作用域大部分指的是多組script標簽宙拉,如下代碼

<script>
    alert(a);   // 報錯
</script>
<script>
    var a = 1;
</script>
<script>
    alert(a);   // 1
</script>
/

如果碰到這種情況宾尚,js解析器會對每個script代碼塊進行獨立預解析和逐行解析,第一塊script的代碼還沒聲明a谢澈,第二塊script的代碼聲明和賦值了煌贴,這時到第三塊script代碼塊時a已經(jīng)聲明并賦值了,所以直接會打印1锥忿。

函數(shù)

由內(nèi)而外主要指函數(shù)牛郑,一個函數(shù)也是一個單獨的作用域,javascript中敬鬓,函數(shù)是唯一能分隔作用域的淹朋。

var a = 1;
function fn1(){
    alert(a);
    var a = 2;
}
fn1();      // undefined
alert(a);   // 1
var a = 1;
function fn1(){
    alert(a);
    a = 2;
}
fn1();      // 1
alert(a);   // 2

第一個例子中在函數(shù)內(nèi)部聲明了a,那么在fn1中的a變量就和上級作用域的a變量沒有任何關(guān)系了钉答。按照預解析的步驟這里打印的是undefined础芍。

第二個例子沒有聲明a變量,所以在fn1作用域中就找不到a数尿,這時就會去上級作用域中尋找仑性,上級作用域聲明了a并且賦值為1了,所以打印1右蹦。

如果是下面這種情況

var a = 1;
function fn1(a){
    alert(a);
    a = 2;
}
fn1();      // undefined
alert(a);   // 1
var a = 1;
function fn1(a){
    alert(a);
    a = 2;
}
fn1(a);     // 1
alert(a);   // 2

參數(shù)其實就是一個局部變量诊杆,第一個例子沒有傳參,參數(shù)就相當于var a; 第二個例子傳了參數(shù)就相當于var a = 1;

一個函數(shù)的解析順序是先從參數(shù)開始的何陆。

下面看一個最常見的案例

for(var i = 0; i < 3; i++){
    btn[i].onclick = function(){
        alert(i);   // 3
    }
}

最開始我以為這里打印的i是會隨著遍歷打印出0,1,2的晨汹,但實際上onclick函數(shù)中相當于一個獨立的作用域,這個作用域中沒有聲明i變量贷盲,所以就要去上級作用域去獲取淘这,那為什么是3呢,因為函數(shù)只有在點擊時才會調(diào)用,只有調(diào)用時才會發(fā)生預解析和逐步解析铝穷,這時去獲取i的值上級作用域早已遍歷完畢朦乏。

js運算符%取余的應用

下面的例子中要在li元素中添加背景色,顏色存儲在arr數(shù)組氧骤。如果不用取余運算符只能寫兩層for循環(huán)呻疹,而使用取余運算,可以直接讓取余后的值自己循環(huán)筹陵。

arr的長度是3刽锤,i是0開始每次+1,那么arr數(shù)組每次的索引就是:arr[0%3=0],arr[1%3=1],arr[2%3=2],arr[3%3=0],arr[4%3=1],arr[5%3=2],arr[6%3=0]朦佩,這樣就達到了遍歷顏色數(shù)組的目的并思。這種操作很適合于在一個數(shù)組的遍歷內(nèi)部又需要遍歷另外一個數(shù)組的情況。

var li = document.getElementsByTagName('li');
var arr = ['yellow','pink','orange'];
for(var i = 0; i < li.length; i++){
    li[i].style.backgroundColor = arr[i%arr.length];
}

下面擴展一下這個案例语稠,加上任意li元素點擊后變色宋彼,再去點擊另一個li,另一個li元素變色仙畦,上一個li元素變回原來的顏色输涕。通常這種功能會用排他來做,這次不用排他慨畸,使用取余操作來寫莱坎。

var li = document.getElementsByTagName('li');
var arr = ['yellow','pink','orange'];
var elem = null;

for(var i = 0; i < li.length; i++){
    li[i].index = i;
    li[i].style.backgroundColor = arr[i%arr.length];

    li[i].onclick = function(){
        if(elem){
            elem.style.backgroundColor = arr[elem.index%arr.length];
        }
        elem = this;
        this.style.backgroundColor = 'gray';
    }
}

排他是將所有l(wèi)i元素變色,再去更改當前點擊的元素的背景色寸士,而這種思路是記錄上一次點擊的元素檐什,在下一次點擊時只改變上一次點擊的元素的背景色就可以了。這里elem.index和i的作用是相同的弱卡。

另外取余操作還可以換算時間乃正,比如現(xiàn)在要將70秒轉(zhuǎn)為分鐘,那么可以這樣寫

var s = 70;
var m = Math.floor( 70/60 + '分' + 70%60 + '秒');

js獲取瀏覽器計算后的屬性值

像width或者height這種屬性直接獲取只能得到行內(nèi)樣式婶博,如果不寫在行內(nèi)就獲取不到瓮具,使用getComputerStyle可以獲取瀏覽器計算后的樣式,也就是被瀏覽器渲染之后得到的元素實際的屬性的值凡蜻。格式是getComputerStyle(element).width;

但是這個方法在ie6搭综、7垢箕、8不兼容划栓。這三個非標準瀏覽器使用的currentStyle屬性。格式是element.currentStyle.width;条获。

不要用這兩個方法去獲取沒有設(shè)置過的屬性忠荞。

不能用這兩個屬性去獲取復合樣式,比如要獲取背景色不要用background而是要用backgroundColor,不論css是怎么寫的委煤,都要寫具體的屬性堂油。因為如果寫background的話會獲取到所有這個屬性可以設(shè)置的屬性值,如果css沒寫的會獲取到默認的碧绞。

另外在firefox瀏覽器4.0版本之前府框,getComputerStyle的參數(shù)要寫兩個,第二個參數(shù)可以隨便寫比如getComputerStyle(element,'').width;getComputerStyle(element,true).width;讥邻,總之只要寫一個參數(shù)就可以迫靖。

jq中的即使搜索事件

在jq中實現(xiàn)input搜索框的即時搜索和其他即時性的改變需要用到input和propertychange(兼容ie8及以下瀏覽器)事件。

input是標準的瀏覽器事件兴使,一般應用于input元素系宜,當input的value發(fā)生變化就會發(fā)生,無論是鍵盤輸入還是鼠標黏貼的改變都能及時監(jiān)聽到變化发魄。

propertychange只要當前對象屬性發(fā)生改變都會觸發(fā)盹牧,所以使用propertychange時最好排除一下不想觸發(fā)事件的元素。

window.parent

在b.html頁面使用iframe的時候励幼,引入一個Html頁面名稱暫定為a.html汰寓,呢么在a.html中,window指的是a的window對象苹粟,而window.parent指的就是b.html的window對象踩寇。

監(jiān)聽DOM樹加載完成的事件

DOM的加載順序:

  1. 解析HTML結(jié)構(gòu)。

  2. 加載外部腳本和樣式表文件六水。

  3. 解析并執(zhí)行腳本代碼俺孙。

  4. 構(gòu)造HTML DOM模型。

  5. 加載圖片等外部文件掷贾。

  6. 頁面加載完畢

DOMContentLoaded事件 可以在DOM模型加載完成后就執(zhí)行代碼睛榄,而不用等到加載完圖片或外部文件

移動端獲取屏幕的寬高

document.documentElement.clientWidthdocument.documentElement.clientHeight
這個得到的是設(shè)備像素可見寬高,比如iPhone 5里為320和504想帅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场靴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子港准,更是在濱河造成了極大的恐慌旨剥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅缸,死亡現(xiàn)場離奇詭異轨帜,居然都是意外死亡,警方通過查閱死者的電腦和手機衩椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門蚌父,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哮兰,“玉大人,你說我怎么就攤上這事苟弛『戎停” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵膏秫,是天一觀的道長右遭。 經(jīng)常有香客問我,道長缤削,這世上最難降的妖魔是什么狸演? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮僻他,結(jié)果婚禮上宵距,老公的妹妹穿的比我還像新娘。我一直安慰自己吨拗,他們只是感情好满哪,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劝篷,像睡著了一般哨鸭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娇妓,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天像鸡,我揣著相機與錄音,去河邊找鬼哈恰。 笑死只估,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的着绷。 我是一名探鬼主播蛔钙,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荠医!你這毒婦竟也來了吁脱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彬向,失蹤者是張志新(化名)和其女友劉穎兼贡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娃胆,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡遍希,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缕棵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵班。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖招驴,靈堂內(nèi)的尸體忽然破棺而出篙程,到底是詐尸還是另有隱情,我是刑警寧澤别厘,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布虱饿,位于F島的核電站,受9級特大地震影響触趴,放射性物質(zhì)發(fā)生泄漏载碌。R本人自食惡果不足惜嵌牺,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧点晴,春花似錦、人聲如沸猿挚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没讲。三九已至眯娱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爬凑,已是汗流浹背徙缴。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘁信,地道東北人于样。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像潘靖,于是被迫代替她去往敵國和親百宇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • <a name='html'>HTML</a> Doctype作用秘豹?標準模式與兼容模式各有什么區(qū)別? (1)携御、<...
    clark124閱讀 3,474評論 1 19
  • “一個小弟” 宋佑碩開始的目標就是為著賺些錢,過上好日子既绕。他去求見金常弼啄刹,為的借一些錢,在釜山創(chuàng)建自己的事...
    小Zer閱讀 621評論 0 0
  • R p2 1.1 圖片發(fā)自簡書App圖片發(fā)自簡書App圖片發(fā)自簡書App圖片發(fā)自簡書AppI 1凄贩,運氣可以放大 如...
    若軒_a4a9閱讀 309評論 0 0
  • 好久沒有設(shè)計一個給自閑下來的時間去作些消遣的事情了誓军。因為嫂子來,所以要空出半天時間來陪她逛街疲扎。早上昵时,靈修后捷雕,按...
    比薩列閱讀 264評論 1 1