×
  • Web前端首页
  • jQuery
  • 谈谈jQuery中的each原理和应用

问答社区 更多 >

  • 宝塔面板:关闭强制SSL后http和https共存问题
  • Vue3 beforeCreate 问题:如何在Vue3中使用beforeCreate进行组件初始化前的处理和设置?
  • React 问答:IDEA中的React项目代码可维护性和可扩展性的设计指导
  • indexOf 方法在 JavaScript 中的高级应用技巧
  • 大神说说indexOf 方法在 JavaScript 中的高级实际应用
  • 如何将博客 DA 增加到 50+?
  • SEO:如何添加地理关键字而不看起来关键字被填充?
  • Matomo 数据集成
  • Windows操作应用:PowerShell和FFmpeg查找Windows中所有损坏音频文件
  • 如何使用远程桌面连接到 windows 10 电脑?
Web176

谈谈jQuery中的each原理和应用

作者:Terry2017.08.03来源:Web前端之家浏览:11323评论:0
关键词: each jq

123.png

翻开jQuery手册,我们可以查到each()方法是规定为每个匹配元素规定运行的函数。在实际应用中,each函数很方便,$.each ()函数封装了十分强大的遍历功能,它可以遍历一维数组、多维数组、DOM , JSON 等等,在javaScript 开发过程中使用$each可以大大的减轻我们的工作量。接下来一起学习下:

语法:

$(selector).each(function(index,element))

index - 选择器的 index 位置;
element - 当前的元素(也可使用 "this" 选择器)。

jQuery中的each的三种遍历方法 ,如下:

1、选择器+遍历

$('div').each(function(i){
   i就是索引值
   this 表示获取遍历每一个dom对象
});

2、选择器+遍历

$('div').each(function(index,domEle){
  index就是索引值
  domEle 表示获取遍历每一个dom对象
});

3、更适用的遍历方法

1)先获取某个集合对象
2)遍历集合对象的每一个元素

var d=$("div");
$.each(d,function(index,domEle){
  d是要遍历的集合
  index就是索引值
  domEle 表示获取遍历每一个dom对
});

这里说到遍历对象和方法,有童鞋问过,$().each和$.each()两种方法有什么区别呢?

其实在针对不同的操作上,它们显示了各自的特点。

$().each,对于这个方法,在dom处理上面用的较多。如果页面有多个input标签类型为checkbox,对于这时用$().each来处理多个checkbook,例如:

$("input[name='ch']").each(function(i){
if($(this).attr('checked')==true)
{
//一些操作代码
}

回调函数是可以传递参数,i就为遍历的索引。

对于遍历一个数组,用$.each()来处理,非常方便。例如:

$.each([{"name":"Web前端之家","email":"jws8@qq.com"},{"name":"shit","email":"jws8@qq.com"},function(i,n)
{
    alert("索引:'+i,"对应值为:"+n.name);//参数i为遍历索引值,n为当前的遍历对象.
});

接下来我们看一个关于input表单元素的例子,如下代码:

如果你dom中有一段这样的代码:

<input name="aaa" type="hidden" value="111" />
<input name="bbb" type="hidden" value="222" />
<input name="ccc" type="hidden" value="333" />
<input name="ddd" type="hidden" value="444"/>

然后你使用each,如下:

$.each($("input:hidden"), function(i,val){ 
    alert(val);
    alert(i);
    alert(val.name);
    alert(val.value); 
});

那么,alert(val)将输出[object HTMLInputElement],因为它是一个表单元素。

alert(i)将输出为0,1,2,3。

alert(val.name);将输出aaa,bbb,ccc,ddd,如果使用this.name将输出同样的结果。
alert(val.value); 将输出111,222,333,444,如果使用this.value将输出同样的结果。

如果将以上面一段代码改变成如下的形式:

$("input:hidden").each(function(i,val){
    alert(i);
    alert(val.name);
    alert(val.value); 
});

可以看到,输出的结果是一样的,至于两种写法究竟区别在哪,我也还不知。此改变运用到上面几段数组的操作也会输出同样的结果。

这样,几个例子的实际结果已经得到答案。接着再继续往下研究,总不能知其然不知其所以然。

从以上的例子中可知 jQuery和 jQuery对象都实现了该方法,对于 jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法。

来看下jQuery中的each实现例子。如下代码:

function (object, callback, args) {
    //该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args
    var name, i = 0,length = object.length;
    if (args){
        if (length == undefined){
        for (name in object) {
            if (callback.apply(object[name], args) === false) {
                break;
            }
        }
    }else{
        for (i < length){
            if (callback.apply(object[i++], args) === false) {
                break;
            }
        }
    } else {
        if (length == undefined) {
            for (name in object) {
                if (callback.call(object[name], name, object[name]) === false) {
                    break;
                }
            }
        }
    } else {
        for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {}
        /*object[0]取得jQuery对象中的第一个DOM元素,通过for循环,
        得到遍历整个jQuery对象中对应的每个DOM元素,通过 callback.call( value,i,value);
        将callback的this对象指向value对象,并且传递两个参数,i表示索引值,value表示DOM元素;
        其中callback是类似于 function(index, elem) { ... } 的方法。
        所以就得到 $("...").each(function(index, elem){ ... });
        */
        }
    }
    return object;
}

jquery会自动根据传入的元素进行判断,然后在根据判断结果采取apply还是call方法的处理。在fn的实现中,可以直接采用this指针引用数组或是对象的子元素。

1.obj对象是数组

each方法会对数组中子元素的逐个进行fn函数调用,直至调用某个子元素返回的结果为false为止,也就是说,我们可以在提供的fn函数进行处理,使之满足一定条件后就退出each方法调用。当each方法提供了arg参数时,fn函数调用传入的参数为arg,否则为:子元素索引,子元素本身

2.obj 对象不是数组

该方法同1的最大区别是:fn方法会被逐次不考虑返回值的进行进行。换句话说,obj对象的所有属性都会被fn方法进行调用,即使fn函数返回false。调用传入的参数同1类似。

其实在这里还想啰嗦下,如果你了解得更多,发现jQuery里的each方法是通过js里的call方法来实现的。call这个方法很奇妙,原理就是“调用一个对象的一个方法,以另一个对象替换当前对象。”

语法

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

参数

thisObj  //可选项。将被用作当前对象的对象。
arg1, arg2,  , argN  //可选项。将被传递方法参数序列。

说明

call 方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

引用网上有一个很经典的例子

function add(a,b)
{
    alert(a+b);
}
function sub(a,b)
{
    alert(a-b);
}
add.call(sub,3,1);

用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

这里只是简单介绍call()方法,关于更深入的用法,这里就不谈论了。

总结

each方法,应用很广,不用再像原来那样写for循环,jQuery源码里自己也有很多用到each方法,作为前端攻城师,必须熟练掌握其原理和应用方法。

您的支持是我们创作的动力!
温馨提示:本文作者系 Terry ,经 Web前端之家编辑修改或补充,转载请注明出处和本文链接:
https://www.jiangweishan.com/article/jQueryEachMethod.html

网友评论文明上网理性发言 已有0人参与

发表评论: 取消回复

抖音 ad

最新文章

  • 简单聊聊vue3中的onUnmounted的基础用法
  • vue3:直接对reactive声明的变量本身进行赋值是无效的
  • lunix服务器宝塔后台:mysql服务是开启的,但是网站打不开,并且无法停止mysql服务
  • WordPress BUG修复:登录后台重定向次数过多
  • GitHub 发布了一款人工智能驱动的工具,旨在“构建软件的全新方式”
  • Vue组件:介绍几种更换背景颜色的方法
  • 收藏下关于lunix里 ulimit 命令的详解
  • React组件:学会了vue的传参后,我们来了解下React传参方式
  • 宝塔面板:关闭强制SSL后http和https共存问题
  • linux 宝塔问题:linux服务器cpu/负载占用率100%

热门排行

  • 04-05   学下jQuery选择器
  • 07-02   JS报错“Uncaught SyntaxError: missing ) after argument list”的真凶在哪里
  • 11-25   跨域问题(Cross-Origin Read Blocking (CORB) blocked cross-origin response)的解决方案
  • 04-08   浅谈下页面中字体设置(font-family)和粗细(font-weight)问题
  • 04-19   注册谷歌帐号提示"此电话号码无法用于进行验证"
  • 02-02   2018年国内外网民常用浏览器之走势
  • 03-20   微信小程序错误提示:TypeError: Cannot read property 'XXX' of undefined
  • 08-30   微信小程序报错:Cannot read property xxx of undefined
  • 04-12   【性能优化】大神们教你如何打造高性能网站
  • 03-26   移动和PC端中的hover处理

TAGS

JQuery JS js vuejs javascript html5 React seo SVG css3 vue3 html ChatGPT 前端教程 vue Google JavaScript css react 微信小程序 动画 canvas Chrome Vue3 cssweb tensorflow linux 谷歌 CSS3 google 数组 jQuery 设计 ajax 微软 app 前端开发 Edge 浏览器 正则表达式 nginx UI form 小程序 Python chrome Windows Windows11 web SEO

聚圣源学游泳开店怎么起名字更好元宵节的诗句古诗起名为8画的字elta体育台432一群人一起创业取个群名子夜读后感娼门女侯周易老师起名寓意好诗起名字版本转换器针织厂起名字邪龙道占卜起什么名字好听姚姓的男宝宝起名大全宝宝起名字免费参考给家具起名称钟南山请大家放心打国产疫苗网游之神级机械猎人琅琊榜迅雷下载网上在逃人员名单隐藏的角落汽车电子起名动物出击中国叙利亚直播大富豪斗地主注册进口公司起名字删除照片恢复大台北奶茶淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化