小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

web前端 javascript 兼容低版本 IE 6 7 8復(fù)合寫(xiě)法

 新進(jìn)小設(shè)計(jì) 2021-10-10

1.事件對(duì)象

事件對(duì)象:當(dāng)一個(gè)事件發(fā)生的時(shí)候,跟這個(gè)事件有關(guān)的一些信息,保存在一個(gè)對(duì)象中,這個(gè)對(duì)象就是事件對(duì)象(事件函數(shù)中才有事件對(duì)象)

  • IE和谷歌:是全局的event對(duì)象

  • 標(biāo)準(zhǔn)瀏覽器:是事件函數(shù)的第一個(gè)參數(shù)

  • 兼容:var ev = ev || event;

var box = document.getElementById('box');

box.onclick = function (ev) {
    // console.log(event); // IE和谷歌
    // console.log(ev); // 標(biāo)準(zhǔn)瀏覽器(IE8及以下不支持)

    var ev = ev || event; // 事件對(duì)象的兼容
    console.log(ev); // 它是一個(gè)對(duì)象,它下面就有很多的屬性或方法

    console.log(ev.type); // 事件類(lèi)型

    // console.log(ev.target); // 事件源(觸發(fā)這個(gè)事件的對(duì)象)IE8及以下不支持
    // console.log(ev.srcElement); // 事件源 IE支持
    var target = ev.target || ev.srcElement; // 事件源兼容
    console.log(target);

    console.log(ev.clientX, ev.clientY); // 鼠標(biāo)相對(duì)于可視區(qū)的距離
    console.log(ev.pageX, ev.pageY); // 鼠標(biāo)到文檔的距離(IE8及以下沒(méi)有)

    console.log(ev.shiftKey); // 事件發(fā)生的時(shí)候,是否按下了shift鍵
    console.log(ev.altKey); // 事件發(fā)生的時(shí)候,是否按下了alt鍵
    console.log(ev.ctrlKey); // 事件發(fā)生的時(shí)候,是否按下了crtl鍵
}

2.事件綁定與取消

1、事件綁定

  • 元素.addEventListener(不加on的事件名, 函數(shù), 是否捕獲);

    • 第三個(gè)參數(shù),如果為true,就是捕獲,如果為false,就是冒泡

  • 元素.attachEvent(加on的事件名, 函數(shù));

// addEventListener標(biāo)準(zhǔn)  和  attachEvent 非標(biāo)準(zhǔn)的區(qū)別:
1、標(biāo)準(zhǔn)的沒(méi)有on,而非標(biāo)準(zhǔn)的有on
2、標(biāo)準(zhǔn)可以設(shè)置捕獲或冒泡,而非標(biāo)準(zhǔn)的只有冒泡
3、標(biāo)準(zhǔn)的是正序執(zhí)行,而非標(biāo)準(zhǔn)的是倒序執(zhí)行
4、標(biāo)準(zhǔn)執(zhí)行的函數(shù)中的this是觸發(fā)這個(gè)事件的元素,非標(biāo)準(zhǔn)執(zhí)行函數(shù)中的this是window

// -------------------------
// 封裝一個(gè)方法,實(shí)現(xiàn)事件綁定的兼容
// console.log(box.addEventListener); 標(biāo)準(zhǔn)瀏覽器返回函數(shù),而IE8及以下返回undefined

// 參數(shù):元素 事件類(lèi)型 要執(zhí)行的函數(shù)
function bind(ele, event, callback) {
    if (ele.addEventListener) {
        // 標(biāo)準(zhǔn)瀏覽器
        ele.addEventListener(event, callback, false);
    } else {
        // 非標(biāo)準(zhǔn)瀏覽器
        ele.attachEvent('on' + event, callback);
    }
}

2、取消綁定

  • 元素.removeEventListener(不加on的事件名, 函數(shù), 是否捕獲);

  • 元素.detachEvent(加on的事件名, 函數(shù));

// 封裝一個(gè)方法,實(shí)現(xiàn)事件的取消綁定
function unbind(ele, event, callback) {
    if (ele.removeEventListener) {
        // 標(biāo)準(zhǔn)瀏覽器
        ele.removeEventListener(event, callback, false);
    } else {
        // 非標(biāo)準(zhǔn)瀏覽器
        ele.detachEvent('on' + event, callback);
    }
}

3.事件委托

  • 定義:也叫事件代理,就是利用事件冒泡,只指定一個(gè)事件處理程序,就可以管理某一類(lèi)型的所有事件。

  • 事件委托原理:子級(jí)的事件,我們加給父級(jí),當(dāng)子級(jí)發(fā)生事件時(shí),會(huì)冒泡到父級(jí),我們可以獲取到事件源,通過(guò)對(duì)事件源的判斷,我們就可以執(zhí)行子級(jí)的事件。

  • 事件委托的實(shí)現(xiàn):

<input type="text"><button>添加</button>
<ul>
    <li>吃飯</li>
    <li class="abc">睡覺(jué)</li>
    <li>打豆豆</li>
</ul>

 

// 需求:點(diǎn)擊li,給每個(gè)li添加一個(gè)背景色
var ul = document.getElementsByTagName('ul')[0];
var li = ul.getElementsByTagName('li');

// 需求:給ul添加新的li
var btn = document.getElementsByTagName('button')[0];
var input = document.getElementsByTagName('input')[0];
btn.onclick = function () {
    var li = document.createElement('li');
    li.innerHTML = input.value;
    ul.appendChild(li);
}

// --------------------------------
// 普通方法,新添加的元素,沒(méi)有之前的事件
// for (var i = 0; i < li.length; i++) {
//     li[i].onclick = function () {
//         this.style.backgroundColor = 'red';
//     }
// }


// ----------------------------
// 事件代理:事件加給父祖級(jí),通過(guò)事件對(duì)象,獲取到事件源,對(duì)事件源進(jìn)行判斷,符合要求,再做相應(yīng)的處理
// 好處:
// 1、省略了循環(huán),提高了性能
// 2、新加的元素,也有之前的事件
ul.onclick = function (ev) {
    var ev = ev || event;//事件的兼容
    var target = ev.target || ev.srcElement; // 找到事件源
    // console.log(target); 
    // if (target.nodeName === 'LI') {
    //     target.style.backgroundColor = 'green';
    // }
    if (target.className === 'abc') {
        target.style.backgroundColor = 'green';
    }
}

 

 

4. 返回檢測(cè)屏幕寬度(可視區(qū)域)

 

 1  function client() {
 2    if(window.innerWidth != null)  // ie9 +  最新瀏覽器
 3    {
 4       return {
 5          width: window.innerWidth,
 6          height: window.innerHeight
 7       }
 8    }
 9    else if(document.compatMode === "CSS1Compat")  // 標(biāo)準(zhǔn)瀏覽器
10    {
11       return {
12          width: document.documentElement.clientWidth,
13          height: document.documentElement.clientHeight
14       }
15    }
16    return {   // 怪異瀏覽器
17       width: document.body.clientWidth,
18       height: document.body.clientHeight
19    }
20 }

 

5. 阻止冒泡 

 w3c的方法是event.stopPropagation()        proPagation  傳播  傳遞

 IE則是使用event.cancelBubble = true       bubble   冒泡  泡泡      cancel 取消

 兼容的寫(xiě)法:

JQuery 阻止時(shí)間冒泡   event.stopPropagation();//已經(jīng)兼容

                          evevt.preventDefault();//阻止瀏覽器默認(rèn)行為

function stopPropagation(ev) {
    if (ev.stopPropagation) {
        // 標(biāo)準(zhǔn)瀏覽器
        ev.stopPropagation();
    } else {
        // IE8及以下
        ev.cancelBubble = true;
    }
}

 

 

獲取你點(diǎn)擊的事件源e.target==this作用類(lèi)似event.stopPropagation();阻止冒泡

1 10  $(".box").on("click",function(e){
2     if(e.target==this){
3         alert("父盒子被點(diǎn)擊");
4     }
5 
6 });

6.獲取用戶(hù)選擇的內(nèi)容

window.getSelection()     標(biāo)準(zhǔn)瀏覽器

document.selection.createRange().text;      ie 獲得選擇的文字

兼容性的寫(xiě)法:

 

1 if(window.getSelection)
2 {
3     txt = window.getSelection().toString();   // 轉(zhuǎn)換為字符串
4 }
5 else
6 {
7     txt = document.selection.createRange().text;   // ie 的寫(xiě)法
8 }

7. 得到css 樣式  

我們想要獲得css 的樣式, box.style.left    box.style.backgorundColor

但是它只能得到   行內(nèi)的樣式。

但是我們工作最多用的是 內(nèi)嵌式 或者 外鏈?zhǔn)?/span> 。

怎么辦?

   核心: 我們?cè)趺床拍艿玫絻?nèi)嵌或者外鏈的樣式呢?  

 1.   obj.currentStyle   ie  opera  常用

外部(使用<link>)和內(nèi)嵌(使用<style>)樣式表中的樣式(ieopera

2 .window.getComputedStyle("元素", "偽類(lèi)")     w3c

兩個(gè)選項(xiàng)是必須的, 沒(méi)有偽類(lèi) null 替代

3 兼容寫(xiě)法 :

    我們這個(gè)元素里面的屬性很多, left  top  width  ===

 我們想要某個(gè)屬性, 就應(yīng)該 返回改屬性,所有繼續(xù)封裝 返回當(dāng)前樣式的 函數(shù)。

 1 1  var demo = document.getElementById("demo");
 2 2      function getStyle(obj,attr) {  //  誰(shuí)的      哪個(gè)屬性
 3 3          if(obj.currentStyle)  // ie 等
 4 4          {
 5 5              return obj.currentStyle[attr];  
 6 6          }
 7 7          else
 8 8          {
 9 9              return window.getComputedStyle(obj,null)[attr];  // w3c 瀏覽器
10 10          }
11 11      }
12 12      console.log(getStyle(demo,"width"));

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多