Home > Article > Web Front-end > Jquery skills (must master)_jquery
檢查 jQuery 是否載入
在使用 jQuery 進行任何操作之前,你需要先確認它已經載入:
if (typeof jQuery == 'undefined') { console.log('jQuery hasn\'t loaded'); } else { console.log('jQuery has loaded'); }
回頂端按鈕
利用 jQuery 中的 animate 和 scrollTop 方法,你無需插件就可以創建簡單的 scroll up 效果:
// 返回顶部 $('a.top').click(function (e) { e.preventDefault(); $(document.body).animate({scrollTop: 0}, 800); }); <!-- 设置锚 --> <a class="top" href="#">Back to top</a>
調整 scrollTop 的值即可改變滾動著陸位置。你實際所做的是在 800 毫秒內不斷設定文檔主體的位置,直到它滾動到頂部。
預先載入圖片
如果你的網頁使用了大量並非立即可見的圖片(例如懸停滑鼠觸發的圖片),那麼預先載入這些圖片就顯得很有意義了:
$.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').load(function () { console.log('image load successful'); });
同樣,換用一個有 id 或 class 屬性的 標籤,你也可以檢查特定圖片是否載入完成。
自動修正失效圖片
如果你在你的網站上發現了失效的圖片鏈接,逐個去替換它們將會是個苦差。這段簡單的程式碼可以大幅減輕痛苦:
$('img').on('error', function () { if(!$(this).hasClass('broken-image')) { $(this).prop('src', 'img/broken.png').addClass('broken-image'); } });
即使你暫無任何失效的鏈接,添加這段程式碼也不會有任何損失。
滑鼠懸停切換 class
如果你希望在使用者將滑鼠懸停在某個可點擊元素上時改變它的視覺效果,你可以在該元素被懸停時給它添加一個class,當滑鼠不再懸停時,移除這個class:
$('.btn').hover(function () { $(this).addClass('hover'); }, function () { $(this).removeClass('hover'); });
如果你還尋求更簡單的途徑,可以使用 toggleClass 方法,只需加入必要的 CSS:
$('.btn').hover(function () { $(this).toggleClass('hover'); });
附註:在這種情況下,使用 CSS 或許是一個更快速的解決方案,但這種方法仍然值得稍作了解。
停用輸入欄位
有時,你可能會想要在使用者完成特定動作(例如,勾選「我已閱讀條例」的確認框)前停用表單的提交按鈕或停用其中某個輸入方塊。你可以在你的輸入欄位上加入disabled 屬性,而後你能在需要時啟用它:
$('input[type="submit"]').prop('disabled', true);
你只需在輸入欄位上再次執行 prop 方法, 但這一次把 disabled 值改為 false:
$('input[type="submit"]').prop('disabled', false);
阻止連結載入
有時你不希望連結到指定頁面或重載當前頁面,而是想讓它們乾些別的,例如觸發其它腳本。這需要在阻止預設動作上做些文章:
$('a.no-link').click(function (e) { e.preventDefault(); });
快取 jQuery 選擇器
想想你在專案中一次又一次地寫了多少相同的選擇器吧。每個 $('.element') 都必須查詢一次整個 DOM,不管它是否曾經這樣執行過。作為代替,我們只運行一次選擇器,並把結果儲存在一個變數中:
var blocks = $('#blocks').find('li');
現在你能在任何地方使用 blocks 變數而無需每次查詢 DOM 了:
$('#hideBlocks').click(function () { blocks.fadeOut(); }); $('#showBlocks').click(function () { blocks.fadeIn(); });
快取 jQuery 的選擇器是種簡單的效能提升。
切換淡出 / 滑動
淡出和滑動都是我們在 jQuery 中大量使用的效果。你可能只想在使用者點擊後展現某個元素,此時用 fadeIn 和 slideDown 方法就很完美。但如果你希望這個元素在首次點擊時出現,在再次點擊時消失,這段程式碼就很有用了:
// 淡出 $('.btn').click(function () { $('.element').fadeToggle('slow'); }); // 切换 $('.btn').click(function () { $('.element').slideToggle('slow'); });
簡單的手風琴效果
這是一個快速實現手風琴效果的簡單方法:
// 关闭所有面板 $('#accordion').find('.content').hide(); // 手风琴效果 $('#accordion').find('.accordion-header').click(function () { var next = $(this).next(); next.slideToggle('fast'); $('.content').not(next).slideUp('fast'); return false; });
透過加入這段腳本,你實際要做的只是提供必要的 HTML 元素以便它正常運作。
使兩個 div 等高
有時你希望無論兩個 div 各自包含什麼內容,它們總是有相同的高度:
$('.div').css('min-height', $('.main-div').height());
这个例子设置了 min-height,意味着高度可以大于主 div 而不能小于它。然而,更灵活的方法是遍历一组元素,然后将高度设置为最高元素的高度:
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()); });
在新标签页 / 新窗口打开外部链接
在一个新的浏览器标签页或窗口中打开外部链接,并确保相同来源的链接在同一个标签页或者窗口中打开:
$('a[href^="http"]').attr('target', '_blank'); $('a[href^="//"]').attr('target', '_blank'); $('a[href^="' + window.location.origin + '"]').attr('target', '_self');
注: window.location.origin 在 IE10 中不可用. 这个修复方案 正是关注于该问题。
通过文本查找元素
通过使用 jQuery 的 contains() 选择器,你能够查找元素内容中的文本。若文本不存在,该元素将被隐藏:
var search = $('#search').val(); $('div:not(:contains("' + search + '"))').hide();
在 visibility 属性变化时触发
当用户的焦点离开或者重新回到某个标签页时,触发 Javasrcipt:
$(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 调用错误处理
当一个 Ajax 调用返回 404 或 500 错误时,错误处理程序将被执行。若错误处理未被定义,其它 jQuery 代码可能不再有效。所以定义一个全局的 Ajax 错误处理:
$(document).ajaxError(function (e, xhr, settings, error) { console.log(error); });
链式插件调用
jQuery 允许通过“链式”插件调用的方法,来缓解反复查询 DOM 和创建多个 jQuery 对象的过程。例如,下面的代码代表着你的插件调用:
$('#elem').show(); $('#elem').html('bla'); $('#elem').otherStuff();
通过使用链式操作,有了显著的改善:
$('#elem') .show() .html('bla') .otherStuff();
另一种方法是在变量(以 $ 为前缀)中,对元素进行缓存:
var $elem = $('#elem'); $elem.hide(); $elem.html('bla'); $elem.otherStuff();
无论是链式操作,还是缓存元素,都是 jQuery 中用以简化和优化代码的最佳实践。
这里收集了一些简单的窍门,助你玩转 jQuery。
检查 jQuery 是否加载
在使用 jQuery 进行任何操作之前,你需要先确认它已经加载:
if (typeof jQuery == 'undefined') { console.log('jQuery hasn\'t loaded'); } else { console.log('jQuery has loaded'); }
返回顶部按钮
利用 jQuery 中的 animate 和 scrollTop 方法,你无需插件就可以创建简单的 scroll up 效果:
// 返回顶部 $('a.top').click(function (e) { e.preventDefault(); $(document.body).animate({scrollTop: 0}, 800); }); <!-- 设置锚 --> <a class="top" href="#">Back to top</a>
调整 scrollTop 的值即可改变滚动着陆位置。你实际所做的是在 800 毫秒内不断设置文档主体的位置,直到它滚动到顶部。
预加载图片
如果你的网页使用了大量并非立即可见的图片(例如悬停鼠标触发的图片),那么预加载这些图片就显得很有意义了:
$.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').load(function () { console.log('image load successful'); });
同样,换用一个带有 id 或者 class 属性的 a1f02c36ba31691bcfe87b2722de723b 标签,你也可以检查特定图片是否加载完成。
自动修复失效图片
如果你在你的网站上发现了失效的图片链接,逐个去替换它们将会是个苦差。这段简单的代码可以很大程度地减轻痛苦:
$('img').on('error', function () { if(!$(this).hasClass('broken-image')) { $(this).prop('src', 'img/broken.png').addClass('broken-image'); } });
即使你暂无任何失效的链接,添加这段代码也不会有任何损失。
鼠标悬停切换 class
如果你希望在用户将鼠标悬停在某个可点击元素上时改变它的视觉效果,你可以在该元素被悬停时给它添加一个 class,当鼠标不再悬停时,移除这个 class:
$('.btn').hover(function () { $(this).addClass('hover'); }, function () { $(this).removeClass('hover'); });
如果你还寻求更简单的途径,可以使用 toggleClass 方法,仅需添加必要的 CSS:
$('.btn').hover(function () { $(this).toggleClass('hover'); });
注:在这种情况下,使用 CSS 或许是一个更快速的解决方案,但这种方法仍然值得稍作了解。
禁用输入字段
有时,你可能希望在用户完成特定操作(例如,勾选“我已阅读条例”的确认框)前禁用表单的提交按钮或禁用其中某个输入框。你可以在你的输入字段上添加disabled 属性,而后你能在需要时启用它:
$('input[type="submit"]').prop('disabled', true);
你只需在输入字段上再次运行 prop 方法, 但是这一次把 disabled 值改为 false:
$('input[type="submit"]').prop('disabled', false);
阻止链接加载
有时你不希望链接到指定页面或者重载当前页面,而是想让它们干些别的,例如触发其它脚本。这需要在阻止默认动作上做些文章:
$('a.no-link').click(function (e) { e.preventDefault(); });
缓存 jQuery 选择器
想想你在项目中一次又一次地写了多少相同的选择器吧。每个 $('.element') 都必须查询一次整个 DOM,不管它是否曾这样执行过。作为代替,我们只运行一次选择器,并把结果储存在一个变量中:
var blocks = $('#blocks').find('li');
现在你能在任何地方使用 blocks 变量而无需每次查询 DOM 了:
$('#hideBlocks').click(function () { blocks.fadeOut(); }); $('#showBlocks').click(function () { blocks.fadeIn(); });
缓存 jQuery 的选择器是种简单的性能提升。
切换淡出 / 滑动
淡出和滑动都是我们在 jQuery 中大量使用的效果。你可能只想在用户点击后展现某个元素,此时用 fadeIn 和 slideDown 方法就很完美。但是如果你希望这个元素在首次点击时出现,再次点击时消失,这段代码就很有用了:
// 淡出 $('.btn').click(function () { $('.element').fadeToggle('slow'); }); // 切换 $('.btn').click(function () { $('.element').slideToggle('slow'); });
简单的手风琴效果
这是一个快速实现手风琴效果的简单方法:
// 关闭所有面板 $('#accordion').find('.content').hide(); // 手风琴效果 $('#accordion').find('.accordion-header').click(function () { var next = $(this).next(); next.slideToggle('fast'); $('.content').not(next).slideUp('fast'); return false; });
通过添加这段脚本,你实际要做的只是提供必要的 HTML 元素以便它正常运行。
使两个 div 等高
有时你希望无论两个 div 各自包含什么内容,它们总有相同的高度:
$('.div').css('min-height', $('.main-div').height());
这个例子设置了 min-height,意味着高度可以大于主 div 而不能小于它。然而,更灵活的方法是遍历一组元素,然后将高度设置为最高元素的高度:
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()); });
在新标签页 / 新窗口打开外部链接
在一个新的浏览器标签页或窗口中打开外部链接,并确保相同来源的链接在同一个标签页或者窗口中打开:
$('a[href^="http"]').attr('target', '_blank'); $('a[href^="//"]').attr('target', '_blank'); $('a[href^="' + window.location.origin + '"]').attr('target', '_self');
注: window.location.origin 在 IE10 中不可用. 这个修复方案 正是关注于该问题。
通过文本查找元素
通过使用 jQuery 的 contains() 选择器,你能够查找元素内容中的文本。若文本不存在,该元素将被隐藏:
var search = $('#search').val(); $('div:not(:contains("' + search + '"))').hide();
在 visibility 属性变化时触发
当用户的焦点离开或者重新回到某个标签页时,触发 Javasrcipt:
$(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 调用错误处理
当一个 Ajax 调用返回 404 或 500 错误时,错误处理程序将被执行。若错误处理未被定义,其它 jQuery 代码可能不再有效。所以定义一个全局的 Ajax 错误处理:
$(document).ajaxError(function (e, xhr, settings, error) { console.log(error); });
链式插件调用
jQuery 允许通过“链式”插件调用的方法,来缓解反复查询 DOM 和创建多个 jQuery 对象的过程。例如,下面的代码代表着你的插件调用:
$('#elem').show(); $('#elem').html('bla'); $('#elem').otherStuff();
通过使用链式操作,有了显著的改善:
$('#elem') .show() .html('bla') .otherStuff();
另一种方法是在变量(以 $ 为前缀)中,对元素进行缓存:
var $elem = $('#elem'); $elem.hide(); $elem.html('bla'); $elem.otherStuff();
无论是链式操作,还是缓存元素,都是 jQuery 中用以简化和优化代码的最佳实践。