一些簡單的小技巧讓您對 jQuery 更得心應手。
也可以看看由 [@sindresorhus](https://github.com/sindresorhus/) 整理,一些其他很不錯的清單集合: awesome lists.
noConflict()
.on()
做 Binding,而不要使用
.click()
noConflict()
其他JavaScript库也使用jQuery使用的$
别名。
为了确保jQuery不会与不同库的$
对象发生冲突,请在文档的开头使用noConflict()
方法:
现在,您将使用jQuery
变量名称而不是$
来引用jQuery对象(例如jQuery('div p').hide()
)。如果你在同一页面上有多个jQuery版本,你可以使用noConflict()
来设置一个特定版本的别名:
在你使用 jQuery 做任何事情之前,你應該先確定其是否成功載入:
if (typeof jQuery == 'undefined') {
console.log('jQuery hasn\'t loaded');
} else {
console.log('jQuery has loaded');
}
在使用HTML元素之前,您需要確保它是DOM的一部分。
.on()
做 Binding,而不要使用 .click()
使用 .on()
比起使用
.click()
多了一些好處,像是可以加上多個事件(events)…
…這樣的連結(binding)也會對動態產生的元素產生效用(不需要每產生一個 DOM element 就做一次連結)…
…還能夠使用命名空間(namespace):
命名空間讓你能取消對特定事件(event)的連結(例如:
.off('click.menuOpening')
)。
利用 jQuery 中 animate
以及 scrollTop
的函式,
你不需要外加特別的插件來完成「返回最頂端」的功能:
// Back to top
$('.container').on('click', '.back-to-top', function (e) {
e.preventDefault();
$('html, body').animate({scrollTop: 0}, 800);
});
<!-- Create an anchor tag -->
<div class="container">
<a href="#" class="back-to-top">Back to top</a>
</div>
改變
scrollTop
的數值可以改變你希望捲軸停在哪裡,而你實際上是使用
animate()
函式以動畫的方式並花費 800
毫秒的時間滾動到文件的頂端。
注意: 看看一些使用 scrollTop
而導致的奇怪行為
。
如果你的網頁有很多圖片並非一開始就是看得到的(例如:hover 才會看到),讓這些圖片預先載入是很合理的:
$.preloadImages = function () {
for (var i = 0; i < arguments.length; i++) {
$('<img>').attr('src', arguments[i]);
}
};
$.preloadImages('img/hover-on.png', 'img/hover-off.png');
有時候你會想要確定圖片是否成功載入後再執行接下來的動作:
你也可以透過替換 <img>
成其他 ID 或 class
來檢查特定圖片。
如果你覺得一個一個替換掉載入失敗的圖片連結很痛苦,這段程式碼可以讓你不會這麼頭痛:
$('img').on('error', function () {
if(!$(this).hasClass('broken-image')) {
$(this).prop('src', 'img/broken.png').addClass('broken-image');
}
});
另外,如果你想简单地隐藏破碎的形象这个片段将利用该护理:
jQuery的AJAX方法來請求文本,HTML,XML或JSON的常用方法。如果你想通過AJAX發送的形式,你可以通過val()
方法收集用戶輸入:
$.post('sign_up.php', {
user_name: $('input[name=user_name]').val(),
email: $('input[name=email]').val(),
password: $('input[name=password]').val(),
});
然而,所有這些val()
調用的是昂貴的。收集用戶輸入的一個更好的辦法是使用CSS()
函數,它收集用戶輸入一個字符串:
如果說你想要在一個可點擊元件的外貌被 hover 過的時候改變他的外貌,你可以在使用者 hover 時加上一個 class,當使用者停止 hover 時就移除該 class:
$('.btn').on('hover', function () {
$(this).addClass('hover');
}, function () {
$(this).removeClass('hover');
});
你只要加上必要的 CSS 即可。如果你想要使用更簡單的方法,可以使用
toggleClass
函式:
注意: 使用 CSS 可能是更快的解決方法,但是這個方法還是值得我們學習。
常常你會希望在使用者進行一些特定動作前, input field 是無法輸入,或是一個
form 的 submit
按鈕是無法點擊的。(例如:點選「我已經閱讀條約。」的checkbox),在 input
加上 disabled
的屬性你就能夠在你想要時開啟權限:
你只需要再執行一次 prop
函式,不過是將
disabled
的數值設成 false
:
有時候你不想讓連結連至特定網站或是重新載入頁面,你可能想要讓他們做一些其他行為,例如:觸發其他程式,以下將會避免預設的行為發生:
想想看你在同一個專案中寫了多少次樣的選擇器,每一個
$('.element')
選擇器每一次都會搜尋整個
DOM,不管該選擇器是否在之前執行過。因此,執行一次選擇器並且將結果存在變數中:
現在你能夠在任何地方使用
blocks
變數而不用每一次都搜尋整個DOM:
$('#hideBlocks').on('click', function () {
blocks.fadeOut();
});
$('#showBlocks').on('click', function () {
blocks.fadeIn();
});
快取 jQuery 選擇器是能夠簡單又能增進效能的小技巧。
Sliding 以及 fading 是我們經常使用 jQuery
來完成的動畫效果。你可能只是想要在使用者點擊某個東西時秀出一個元件,此時
fadeIn
以及
slideDown
就是你的最佳選擇。如果你想要讓元件在第一次點擊時現身,並且在第二次點擊時消失,以下程式碼也可以很好地實現這個效果:
// Fade
$('.btn').on('click', function () {
$('.element').fadeToggle('slow');
});
// Toggle
$('.btn').on('click', function () {
$('.element').slideToggle('slow');
});
這是一個簡單實現可收放元件(accordion)的做法:
// Close all panels
$('#accordion').find('.content').hide();
// Accordion
$('#accordion').find('.accordion-header').on('click', function () {
var next = $(this).next();
next.slideToggle('fast');
$('.content').not(next).slideUp('fast');
return false;
});
加上這段程式碼後,你要做的只剩下加上必要的 HTML 即可。
有時候不論兩個 Div 裡面的內容為何,你會希望他們有同樣的高度:
這個例子設定 min-height
,表示其只能比
.main-div
的
height
大,永遠不會比它小。然而,在一組元素中循環並將各元素之
height
調整至最高的元素高度為另一種更彈性的方法:
var $columns = $('.column');
var height = 0;
$columns.each(function () {
if ($(this).height() > height) {
height = $(this).height();
}
});
$columns.height(height);
如果你希望每一行都有同樣高度:
var $rows = $('.same-height-columns');
$rows.each(function () {
$(this).find('.column').height($(this).height());
});
注意: 這件事可以使用幾種方法完成,使用 CSS 這跟你的需求有關,但也值得知道如何使用 jQuery完成。
在瀏覽器新的分頁或視窗中開啟新的外部連結,並且確定同樣 host 的連結會在同樣的分頁或視窗開啟:
$('a[href^="http"]').attr('target', '_blank');
$('a[href^="//"]').attr('target', '_blank');
$('a[href^="' + window.location.origin + '"]').attr('target', '_self');
注意: window.location.origin
在 IE 10
中無效。這個方法
可以解決這個問題。
利用 jQuery 中
contains()
選擇器,你可以找到元素內容中的文字。如果沒有文字,該元素會被隱藏:
當使用者不再停留在某分頁,或是重新停留在某分頁,觸發 JavaScript:
$(document).on('visibilitychange', function (e) {
if (e.target.visibilityState === 'visible') {
console.log('Tab is now in view!');
} else if (e.target.visibilityState === 'hidden') {
console.log('Tab is now hidden!');
}
});
當一個 Ajax 程序呼叫後回傳 404 或是 500 錯誤,錯誤處理程序將會被執行。如果沒有定義錯誤處理程序,其他 jQuery 的程式碼可能不會運作。定義一個全域 Ajax 錯誤處理程序:
jQuery 允許「串連」 plugin 函式的呼叫來減少重複搜尋 DOM 以及產生多個 jQuery 物件。以下的程式碼展示了 plugin 函式的呼叫:
可以利用串連來改進:
另外一種方法是利用一個變數來快取(cache)一個元素(在變數前面加上
$
):
jQuery 中串連以及快取的方法是最簡潔且最快速的實作方式。
如果在清單中有太多元素,或許其內容是被ㄧ CMS 所製造的且你希望照字母順序來排序:
var ul = $('#list'),
lis = $('li', ul).get();
lis.sort(function (a, b) {
return ($(a).text().toUpperCase() < $(b).text().toUpperCase()) ? -1 : 1;
});
ul.append(lis);
就是這樣!
如果要停用右鍵,您可以對整個頁面這麼做…
…而您也可以為特定元素做同樣的事情:
現今版本的 Chrome,Firefox,Safari,Opera,Edge 以及 IE11。