jQuery hover 延時(shí)器實(shí)現(xiàn)代碼
更新時(shí)間:2011年03月12日 21:48:48 作者:
在上一篇文章 《鼠標(biāo)事件延時(shí)切換插件》 中,我已經(jīng)寫了幾個(gè)簡(jiǎn)單的延時(shí)器的例子,今天突然想到j(luò)Query的自定義動(dòng)畫的animate方法可以使用delay
例如:
$('#foo').slideUp(300).delay(800).fadeIn(400);// 在.slideUp() 和 .fadeIn()之間延時(shí)800毫秒。
hover是否可以設(shè)計(jì)一個(gè)延時(shí)器呢?答案是肯定的。延時(shí)操作目的是為了防止用戶誤觸發(fā)事件,一般情況下鼠標(biāo)指針小于150毫秒的停留時(shí)間都可以被忽略。其實(shí),如果入侵delay全能讓其作用在hover事件上,但是為了避免John Resig不斷的折騰jQuery而導(dǎo)致兼容問題,還是老老實(shí)實(shí)的寫標(biāo)準(zhǔn)插件比較好。
目標(biāo)
繼承jQuery API的優(yōu)雅:jQuery(expression).mouseDelay(150).hover(over, out)
不得破壞jQuery原型鏈
上述目標(biāo)看起來很帥氣,實(shí)現(xiàn)起來卻非常簡(jiǎn)單,僅僅十多行的代碼我都不好意思拿來拼湊文章:
源代碼
/*!
* jQuery.mouseDelay.js v1.2
* http://www.planeart.cn/?p=1073
* Copyright 2011, TangBin
* Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function ($, plugin) {
var data = {}, id = 1, etid = plugin + 'ETID';
// 延時(shí)構(gòu)造器
$.fn[plugin] = function (speed, group) {
id ++;
group = group || this.data(etid) || id;
speed = speed || 150;
// 緩存分組名稱到元素
if (group === id) this.data(etid, group);
// 暫存官方的hover方法
this._hover = this.hover;
// 偽裝一個(gè)hover函數(shù),并截獲兩個(gè)回調(diào)函數(shù)交給真正的hover函數(shù)處理
this.hover = function (over, out) {
over = over || $.noop;
out = out || $.noop;
this._hover(function (event) {
var elem = this;
clearTimeout(data[group]);
data[group] = setTimeout(function () {
over.call(elem, event);
}, speed);
}, function (event) {
var elem = this;
clearTimeout(data[group]);
data[group] = setTimeout(function () {
out.call(elem, event);
}, speed);
});
return this;
};
return this;
};
// 凍結(jié)選定元素的延時(shí)器
$.fn[plugin + 'Pause'] = function () {
clearTimeout(this.data(etid));
return this;
};
// 靜態(tài)方法
$[plugin] = {
// 獲取一個(gè)唯一分組名稱
get: function () {
return id ++;
},
// 凍結(jié)指定分組的延時(shí)器
pause: function (group) {
clearTimeout(data[group]);
}
};
})(jQuery, 'mouseDelay');
下載
演示
http://demo.jb51.net/js/2011/mouseDelay/index.htm
打包下載
planeArt.cn原創(chuàng)文章
復(fù)制代碼 代碼如下:
$('#foo').slideUp(300).delay(800).fadeIn(400);// 在.slideUp() 和 .fadeIn()之間延時(shí)800毫秒。
hover是否可以設(shè)計(jì)一個(gè)延時(shí)器呢?答案是肯定的。延時(shí)操作目的是為了防止用戶誤觸發(fā)事件,一般情況下鼠標(biāo)指針小于150毫秒的停留時(shí)間都可以被忽略。其實(shí),如果入侵delay全能讓其作用在hover事件上,但是為了避免John Resig不斷的折騰jQuery而導(dǎo)致兼容問題,還是老老實(shí)實(shí)的寫標(biāo)準(zhǔn)插件比較好。
目標(biāo)
繼承jQuery API的優(yōu)雅:jQuery(expression).mouseDelay(150).hover(over, out)
不得破壞jQuery原型鏈
上述目標(biāo)看起來很帥氣,實(shí)現(xiàn)起來卻非常簡(jiǎn)單,僅僅十多行的代碼我都不好意思拿來拼湊文章:
源代碼
復(fù)制代碼 代碼如下:
/*!
* jQuery.mouseDelay.js v1.2
* http://www.planeart.cn/?p=1073
* Copyright 2011, TangBin
* Dual licensed under the MIT or GPL Version 2 licenses.
*/
(function ($, plugin) {
var data = {}, id = 1, etid = plugin + 'ETID';
// 延時(shí)構(gòu)造器
$.fn[plugin] = function (speed, group) {
id ++;
group = group || this.data(etid) || id;
speed = speed || 150;
// 緩存分組名稱到元素
if (group === id) this.data(etid, group);
// 暫存官方的hover方法
this._hover = this.hover;
// 偽裝一個(gè)hover函數(shù),并截獲兩個(gè)回調(diào)函數(shù)交給真正的hover函數(shù)處理
this.hover = function (over, out) {
over = over || $.noop;
out = out || $.noop;
this._hover(function (event) {
var elem = this;
clearTimeout(data[group]);
data[group] = setTimeout(function () {
over.call(elem, event);
}, speed);
}, function (event) {
var elem = this;
clearTimeout(data[group]);
data[group] = setTimeout(function () {
out.call(elem, event);
}, speed);
});
return this;
};
return this;
};
// 凍結(jié)選定元素的延時(shí)器
$.fn[plugin + 'Pause'] = function () {
clearTimeout(this.data(etid));
return this;
};
// 靜態(tài)方法
$[plugin] = {
// 獲取一個(gè)唯一分組名稱
get: function () {
return id ++;
},
// 凍結(jié)指定分組的延時(shí)器
pause: function (group) {
clearTimeout(data[group]);
}
};
})(jQuery, 'mouseDelay');
API說明
方法 | 參數(shù) | 說明 |
---|---|---|
mouseDelay (speed, group) | 速度, 設(shè)置延時(shí)分組名稱 | 設(shè)置延時(shí)觸發(fā)效果. 兩個(gè)參數(shù)都是可選的 |
mouseDelayPause() | [無] | 凍結(jié)選定元素的延時(shí)器 |
jQuery.mouseDelay.pause (group) | 延時(shí)分組名稱 | 凍結(jié)指定分組的延時(shí)器 |
jQuery.mouseDelay.get () | [無] | 獲取一個(gè)不重復(fù)的分組名 |
演示
http://demo.jb51.net/js/2011/mouseDelay/index.htm
打包下載
planeArt.cn原創(chuàng)文章
您可能感興趣的文章:
- 網(wǎng)頁圖片延時(shí)加載的js代碼
- JavaScript延時(shí)效果比較不錯(cuò)的
- js實(shí)現(xiàn)網(wǎng)頁圖片延時(shí)加載 提升網(wǎng)頁打開速度
- JS圖片根據(jù)鼠標(biāo)滾動(dòng)延時(shí)加載的實(shí)例代碼
- JS延時(shí)提示框?qū)崿F(xiàn)方法詳解
- 原生javaScript實(shí)現(xiàn)圖片延時(shí)加載的方法
- javascript實(shí)現(xiàn)延時(shí)顯示提示框特效代碼
- jQuery 鼠標(biāo)經(jīng)過(hover)事件的延時(shí)處理示例
- Jquery實(shí)現(xiàn)圖片預(yù)加載與延時(shí)加載的方法
- jQuery實(shí)現(xiàn)鼠標(biāo)經(jīng)過事件的延時(shí)處理效果
- jQuery實(shí)現(xiàn)帶延時(shí)功能的水平多級(jí)菜單效果【附demo源碼下載】
- JS/jQuery實(shí)現(xiàn)DIV延時(shí)幾秒后消失或顯示的方法
相關(guān)文章
基于jQuery的網(wǎng)頁右下角彈出廣告(IE7,firefox)
以前曾寫過一個(gè),不過太麻煩了,呵呵```現(xiàn)在改進(jìn)了一下,其實(shí)很簡(jiǎn)單:css定位層一直在右下角,用js控制層的高度增減。2010-08-08jquery入門—選擇器實(shí)現(xiàn)隔行變色實(shí)例代碼
JQuery入門—選擇器實(shí)現(xiàn)隔行變色如何實(shí)現(xiàn)呢?JQuery選擇器繼承了CSS、path語音的部分語法,允許通過標(biāo)簽名、屬性名、內(nèi)容對(duì)DOM元素進(jìn)行快速、準(zhǔn)確的選擇,接下來詳細(xì)介紹,需要的朋友可以參考下2013-01-01用jquery設(shè)置按鈕的disabled屬性的實(shí)現(xiàn)代碼
在html標(biāo)簽中設(shè)置按鈕被禁用,可以使用如下代碼2010-11-11快速實(shí)現(xiàn)jQuery多級(jí)菜單效果
這篇文章主要教大家如何快速實(shí)現(xiàn)jQuery多級(jí)菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02jQuery.extend 函數(shù)及用法詳細(xì)
Jquery的擴(kuò)展方法extend是我們?cè)趯懖寮倪^程中常用的方法,該方法有一些重載原型,在此,我們一起通過本篇文章學(xué)習(xí)jquery.extend函數(shù)及用法詳解吧2015-09-09