js 事件

1、事件對象

給一個元素綁定一個點擊事件,然後觸發這個事件,打印函數中的 argument[0]  ,結果就是一個MouseEvent對象,我們把它叫做事件對象。

兼容問題:

    標準瀏覽器下:用 e 或者 argument[0]

    IE瀏覽器下:用 window.event

2、事件對象中的內容

    e.clientX:鼠標點擊位置距離瀏覽器左上角橫軸座標

    e.clientY:鼠標點擊位置距離瀏覽器左上角縱軸座標


    e.pageX:鼠標點擊位置距離頁面/body左上角橫軸座標

    e.pageY:鼠標點擊位置距離頁面/body左上角縱軸座標

    ps:這兩個屬性在IE中是不存在的    


    e.type:事件類型。如:點擊事件就是 'click'


    e.preventDefault():阻止默認行爲

    e.returnValue = false;     IE6-8中阻止默認行爲

    ps:return false;  =>  兼容所有的瀏覽器


    e.target:事件源。表示真正觸發事件的那個元素

    window.event.srcElement: IE6-8中的事件源。

    ps:兼容處理 => e.target  = e.target || window.event.srcElement


    e.stopPropagation():阻止事件傳播

    e.cancelBubble = true; 在IE6-8中阻止事件冒泡傳播

    ps:兼容處理 => e.stopProgation = e.stopProgation || function () { e.cancelBubble = true; }

3、事件傳播機制 冒泡和捕獲

事件的執行順序:先捕獲 => 到達目標 => 冒泡

(1)DOM 0 級事件只能給一個事件綁定一個函數,只能冒泡。例:

ele.onclick = function(){
console.log(1);
};

(2)而 DOM 2 級事件可以給一個事件綁定多個函數,可以規定函數在捕獲階段觸發還是冒泡階段觸發。

利用 addEventListener 綁定事件,參數如下:

addEventListener( '事件類型' ,  綁定的函數 , true/false )

其中true表示在捕獲階段發生,false表示在冒泡階段發生

function middleFn(){
console.log('middle');
}
function outerFn(){
console.log('outer');
}
function innerFn(){
console.log('inner');
}

inner.addEventListener('click',innerFn,false);
middle.addEventListener('click',middleFn,false);
outer.addEventListener('click',outerFn,false);


4、實例

(1)鼠標經過商品產生的放大鏡效果

<!-- HTML部分 -->

<div class="box">
    <div class="innerBox"></div>
</div>
<div class="bigImageBox">
    <img src="images/bigIphone.jpg" alt=""/>
</div>

/* css部分 */
.box{
width: 350px;
height: 350px;
margin: 30px 20px;
position: relative;
background: url("images/iPhone.jpg") no-repeat;
box-shadow: 3px 3px 3px #000;
}
.box .innerBox{
display: none;
width: 175px;
height: 175px;
position: absolute;
left: 0;
top: 0;
opacity: 0.5;
filter: alpha(opacity=50);
background: #cccccc;
cursor: move;
}
.bigImageBox{
position: absolute;
left: 400px;
top: 30px;
    display: none;
    width: 350px;
height: 350px;
box-shadow: 3px 3px 3px #000;
overflow: hidden;
}
.bigImageBox img{
position: absolute;
left: 0;
top: 0;
width: 200%;
height: 200%;
border: none;
vertical-align: top;
}

// JS部分
var box = document.getElementsByClassName('box')[0];
var innerBox = box.getElementsByClassName('innerBox')[0];
var bigImgBox = document.getElementsByClassName('bigImgBox')[0];
var bigImg = bigImgBox.getElementsByTagName('img')[0];
//給最外層的box綁定onmousemove事件,當事件被觸發的時候,讓裏面的半透明盒子跟隨鼠標移動
box.onmouseover = function (){//鼠標懸停在box上面的時候讓innerBox顯示
innerBox.style.display = 'block';
bigImgBox.style.display = 'block';
};
box.onmousemove = function (e){//讓透明盒子跟隨鼠標動起來
//其實就是讓透明盒子的left和top的值隨着鼠標move變化
e = e || window.event;
e.pageX = e.pageX || e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft);
e.pageY = e.pageY || e.clientY + (document.documentElement.scrollTop || document.body.scrollTop);
//開始實現計算透明盒子的left和top
// offsetWidth = width + border + padding
var l = e.pageX - box.offsetLeft - innerBox.offsetWidth/2;
var t = e.pageY - box.offsetTop - innerBox.offsetHeight/2;
// 計算透明盒子的 margin-left 和 margin-top
var maxLeft = box.offsetWidth - innerBox.offsetWidth;
var maxTop = box.offsetHeight - innerBox.offsetHeight;

l = l < 0 ? 0 : l > maxLeft ? maxLeft : l;
t = t < 0 ? 0 : t > maxTop ? maxTop : t;

innerBox.style.left = l + 'px';
innerBox.style.top = t + 'px';
//下面的代碼負責右側大圖跟隨左側的透明innerBox移動
bigImg.style.left = - 2 * l + 'px';//2倍關係就是左側innerBox和box的關係
bigImg.style.top = - 2 * t + 'px';
};
box.onmouseout = function (e){//半透明盒子消失
console.log(e.type);
innerBox.style.display = 'none';
bigImgBox.style.display = 'none';
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章