jQuery中是否有“exists”函数? 技术背景 在使用jQuery进行前端开发时,经常需要检查DOM中某个元素是否存在。虽然jQuery本身没有直接提供exists
函数,但开发者可以通过多种方式来实现检查元素存在性的功能。
实现步骤 1. 使用jQuery的length
属性 在JavaScript中,一切值都有“真值”或“假值”的概念,对于数字,0
表示false
,其他值表示true
。因此可以通过检查jQuery选择器返回结果的length
属性来判断元素是否存在:
1 2 3 if ($(selector).length ) { }
2. 自定义exists
函数 可以为jQuery扩展一个exists
函数:
1 2 3 4 jQuery.fn .exists = function ( ){ return this .length > 0 ; }if ($(selector).exists ()) { }
或者将其作为静态方法:
1 2 3 4 jQuery.exists = function (selector ) {return ($(selector).length > 0 );}if ($.exists (selector)) { }
3. 利用数组索引 由于每个jQuery对象也可以看作一个数组,因此可以使用数组的索引操作来检查元素是否存在:
1 2 3 if ($(selector)[0 ]) { }
4. 使用is('*')
方法 1 2 3 if ($(selector).is ('*' )) { }
5. 自定义插件 可以编写一个功能更强大的exist
插件,支持回调函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 ;;(function ($ ) { if (!$.exist) { $.extend ({ exist : function ( ) { var ele, cbmExist, cbmNotExist; if (arguments .length ) { for (x in arguments ) { switch (typeof arguments [x]) { case 'function' : if (typeof cbmExist == "undefined" ) cbmExist = arguments [x]; else cbmNotExist = arguments [x]; break ; case 'object' : if (arguments [x] instanceof jQuery) ele = arguments [x]; else { var obj = arguments [x]; for (y in obj) { if (typeof obj[y] == 'function' ) { if (typeof cbmExist == "undefined" ) cbmExist = obj[y]; else cbmNotExist = obj[y]; } if (typeof obj[y] == 'object' && obj[y] instanceof jQuery) ele = obj[y]; if (typeof obj[y] == 'string' ) ele = $(obj[y]); } } break ; case 'string' : ele = $(arguments [x]); break ; } } } if (typeof cbmExist == 'function' ) { var exist = ele.length > 0 ? true : false ; if (exist) { return ele.each (function (i ) { cbmExist.apply (this , [exist, ele, i]); }); } else if (typeof cbmNotExist == 'function' ) { cbmNotExist.apply (ele, [exist, ele]); return ele; } else { if (ele.length <= 1 ) return ele.length > 0 ? true : false ; else return ele.length ; } } else { if (ele.length <= 1 ) return ele.length > 0 ? true : false ; else return ele.length ; } return false ; } }); $.fn.extend ({ exist : function ( ) { var args = [$(this )]; if (arguments .length ) for (x in arguments ) args.push (arguments [x]); return $.exist.apply ($, args); } }); } })(jQuery);
使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 if ($.exist ('#eleID' )) { } if ($.exist ($('#eleID' ))) { } if ($('#eleID' ).exist ()) { } $.exist ('#eleID' , function ( ) { }, function ( ) { }) $('#eleID' ).exist (function ( ) { }) $.exist ({ element : '#eleID' , callback : function ( ) { } })
6. 使用原生JavaScript方法 可以使用document.getElementById
或document.querySelector
等原生方法来检查元素是否存在:
1 2 3 4 5 6 7 8 9 10 11 12 13 if (document .getElementById ('element_id' )) { }function elementIfExists (selector ){ return document .querySelector (selector); }var myelement = elementIfExists ("#myid" ) || myfallbackelement;function elementExists (selector ){ return !!document .querySelector (selector); }var hastables = elementExists ("table" );
7. 考虑特殊情况的exists
函数 可以编写一个考虑更多情况的exists
函数:
1 2 3 $.fn.exists = $.fn.exists || function ( ) { return !!(this .length && (this [0 ] instanceof HTMLDocument || this [0 ] instanceof HTMLElement )); }
8. 检查对象内部元素存在性 1 2 3 jQuery.fn .exists = function (selector ) { return selector ? this .find (selector).length : this .length ; };
最佳实践 对于简单的元素存在性检查,优先使用原生JavaScript方法,如document.getElementById
或document.querySelector
,因为它们的执行速度更快。 如果需要在jQuery代码中频繁进行元素存在性检查,可以自定义exists
函数或使用插件,以提高代码的可读性和可维护性。 在使用exists
函数时,要考虑特殊情况,如传入的选择器为{}
等空对象的情况。 常见问题 $(selector).length
方法的局限性 :当selector
为一个空对象{}
时,$(selector).length
可能会返回非零值,导致检查结果不准确。可以通过额外的检查来避免这种情况:1 2 3 if ($.isEmptyObject (selector) || !$(selector).length ) { throw new Error ('Unable to work with the given selector.' ); }
但需要注意的是,$.isEmptyObject
在IE中对于字符串选择器的处理可能与其他浏览器不同。
性能问题 :使用jQuery的$()
选择器(其底层使用querySelectorAll
)进行元素查找时,性能可能较低,因为它需要遍历整个DOM树。可以直接使用document.querySelector
来提高性能。