上,那麼就要面對另一個問題:當使用者點擊連結時,瀏覽器會載入一個新頁面。這種行為與我們討論的事件處理程序不是同一個概念,它是單擊錨元素的預設操作。類似地,當使用者在編輯完表單後按下回車鍵時,會觸發表單的submit事件,在此事件發生後,表單提交才會真正發生。
如果我們不希望執行這種預設操作,那麼在事件物件上呼叫.stopPropagation()方法也無濟於事,因為預設操作不是在正常的事件傳播流中發生的。在這種情況下,.preventDefault()方法則可以在觸發預設操作之前終止事件 。
提示 當在事件的環境中完成了某些驗證之後,通常會用到.preventDefault()。例如,在表單提交期間,我們會對使用者是否填寫了必填字段進行檢查,如果使用者沒有填寫相應字段,那麼就需要阻止預設操作。我們將在第8章詳細討論表單驗證。 事件傳播和預設操作是相互獨立的兩套機制,在二者任何一方發生時,都可以終止另一方。如果想要同時停止事件傳播和預設操作,可以在事件處理程序中傳回false,這是對在事件物件上同時呼叫.stopPropagation()和.preventDefault()的一種簡寫方式。
//點選按鈕事件(改變文字樣式)
$(document).ready(function() {
$('#switcher .button').click(function() {
$('body').removeClass();
if (this.id == 'switcher-narrow') {
> }
else if (this.id == 'switcher-large') {
$('body').addClass('large');; #switcher .button').removeClass('selected');
$(this).addClass('selected');
});
});
>
//點選按鈕外層div出發事件(隱藏按鈕)
$(document).ready(function() {
$('#switcher').click(function() { $('#switcher .button').toggleClass('hidden');
});
});
現在的問題是,當點擊了按鈕時,同時觸發了隱藏按鈕事件。這是事件冒泡導致。
為了阻止事件冒泡,需要為隱藏按鈕函數增加一個參數:
if(even.target==this){ $('#switcher .button').toggleClass('hidden');
}
});
});
});
}); target屬性保存發生事件的目標元素。可以確定DOM中首先接收到事件的元素。此時程式碼確保了被點擊的是
,而不是其後代元素。
也可以這樣處理,透過修改按鈕的行為來達到目的。
複製程式碼
$(document).ready(unction() {
$('#switcher .button').click(function(even) { $('body').removeClass();
if (this.id == 'switcher-n> if (this.id == 'switcher-num '
$('body').addClass('narrow');
}
else if (this.id == 'switcher-large') { ('large');
}
$('#switcher .button').removeClass('selected');
> even.stopPropagation();
});
});
用JS阻止事件冒泡
事件冒泡: 當一個元素上的事件被觸發的時候,比如說滑鼠點擊了一個按鈕,同樣的事件將會在那個元素的所有祖先元素中被觸發。這個過程被稱為事件冒泡;這個事件從原始元素開始一直冒泡到DOM樹的最上層。 可以用JS來阻止js事件冒泡。因為瀏覽器的差異IE和FF的JS寫法有點不一樣。 IE用cancelBubble=true來阻止而FF下需要用stopPropagation方法。 下一個完整的程式碼:
複製程式碼