jQuery移除元素自動解綁事件實現(xiàn)思路及代碼
世界本該如此!
所以,在現(xiàn)代瀏覽器,如果你將一個元素從DOM樹種進行移除的時候,瀏覽器會自動幫你綁定的事件進行解綁以釋放其占用的內(nèi)存。也許你猜到了,較老版本的瀏覽器則不會主動去做這件事,所以,當(dāng)你的應(yīng)用在較老版本的瀏覽器運行的越久,其消耗內(nèi)存越多,應(yīng)用就會變得越來越卡。因此,需要我們自己對要刪除的元素進行事件解綁。
實現(xiàn)思路
用jQuery將元素移除的基本方法常用的有三個,一個是remove()方法,一個是html()方法,一個是empty()方法。我們可以對此三個方法進行進一步的封裝,我們會在事件綁定的時候給綁定事件的元素添加一個屬性標識,從要刪除的元素中去尋找有此標識的元素,然后進行事件的完全解綁。一切都是那么的巧妙!需要注意的一點是,remove()方法在執(zhí)行的時候會對其自身進行事件解綁,并且該方法可以接受一個選擇器參數(shù),以刪除其子元素。
實現(xiàn)代碼
有了實現(xiàn)思路,編碼可以很快搞定。如下:
define(['jquery', 'underscore'], function () {
var bindDirects = ['delegate', 'bind','on', 'hover', 'blur', 'change', 'click', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll', 'select', 'submit'];
var eMarker = '_addedEvent';
_.each(bindDirects, function (eventName) {
var alias = $.fn[eventName];
$.fn[eventName] = function () {
var $tar = _.isElement(this)?$(this):this;
var hasEventAdded = $tar.attr(eMarker) || '';
var _en = eventName;
if (hasEventAdded.length) {
_en += ',' + hasEventAdded;
}
$tar.attr(eMarker, _en);
return alias.apply(_.isElement(this)?$tar:this, [].slice.call(arguments));
};
});
// 為某一個元素移除綁定的事件
function removeEvents($tar) {
var addedEventsName = $tar.attr(eMarker);
if (addedEventsName) {
addedEventsName.replace(/[^,]+/g, function (eventName) {
// 全部移除
if (eventName === 'delegate') {
$tar.undelegate();
} else {
$tar.unbind();
}
return eventName;
});
}
}
var funcs = ['html','empty'];
_.each(funcs, function (func) {
var alias = $.fn[func];
$.fn[func] = function () {
var $tar = _.isElement(this)?$(this):this;
if($tar.length){
$tar.find('*[' + eMarker + ']').each(function (k, subEl) {
try{
removeEvents($(subEl));
}catch(e){
console.error(e.message);
}
});
}
var args = [].slice.call(arguments);
return alias.apply($tar, args);
};
});
// 擴展remove()方法
var alias = $.fn.remove;
$.fn.remove = function () {
var $tar = _.isElement(this)?$(this):this,
arg = arguments;
if($tar.length && !arg.length){
$tar.find('*[' + eMarker + ']').each(function (k, subEl) {
try{
removeEvents($(subEl));
}catch(e){
console.error(e.message);
}
});
}
if(arg.length){
var selector = arg[0];
if(_.isString(selector)){
$tar.find(selector).each(function(k,curEl){
var $cur = $(curEl);
$cur.find('*[' + eMarker + ']').each(function (k, subEl) {
try{
removeEvents($(subEl));
}catch(e){
console.error(e.message);
}
});
removeEvents($cur);
$cur.remove();
});
}
}
var args = [].slice.call(arguments);
return alias.apply($tar, args);
};
});
還是那句話,了解的越多,你能做的就越多!
相關(guān)文章
用JQuery 判斷某個屬性是否存在hasAttr的解決方法
本篇文章介紹了,用JQuery 判斷某個屬性是否存在hasAttr的解決方法。需要的朋友參考下2013-04-04jquery調(diào)整表格行tr上下順序?qū)嵗v解
這篇文章主要為大家介紹了jquery調(diào)整表格行tr上下順序?qū)嵗?,具有一定的參考價值,感興趣的朋友可以參考一下2016-01-01jQuery實現(xiàn)拖拽頁面元素并將其保存到cookie的方法
這篇文章主要介紹了jQuery實現(xiàn)拖拽頁面元素并將其保存到cookie的方法,涉及jQuery基于cookie針對頁面元素屬性的相關(guān)保存操作技巧,需要的朋友可以參考下2016-06-06jQuery的Ajax時無響應(yīng)數(shù)據(jù)的解決方法
今天做項目時發(fā)現(xiàn)永遠響應(yīng)的值都是該頁面的html代碼。2010-05-05jquery對所有input type=text的控件賦值實現(xiàn)方法
下面小編就為大家?guī)硪黄猨query對所有input type=text的控件賦值實現(xiàn)方法。小編覺的挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12