1. 主页 > 好文章

移动端必看:jQuery方法参数传递详解及常见应用场景

哎,刚学jQuery的新手是不是总被参数传递搞得头大?特别是做移动端开发的时候,明明电脑上跑得好好的代码,一到手机就各种报错。今天咱们就掰开了揉碎了说说这事儿——新手如何快速涨粉(哦不,快速上手)jQuery的参数传递技巧!

(敲黑板)先来个灵魂拷问:??为什么你的按钮点击事件里死活拿不到参数值??? 别急着删代码,八成是参数传递姿势不对。下面这个场景眼熟不:

javascript复制
// 错误示范!点击按钮永远输出undefined
$(".btn").click(showMessage("我是参数"));

function showMessage(msg) {
  console.log(msg);
}

??重点来了:jQuery事件绑定要传参,必须用匿名函数包裹!?? 正确的姿势应该是:

javascript复制
$(".btn").click(function(){
  showMessage("这次能传过去了");
});

参数传递的三大雷区

  1. ??直接调用函数??:就像上面那个错误例子,等于立刻执行函数而不是等待点击
  2. ??作用域丢失??:在回调函数里用this时要特别注意,移动端经常遇到事件冒泡问题
  3. ??数据类型错误??:移动端从表单获取的参数经常是字符串,需要手动转换类型

举个真实案例:小米商城移动端的加入购物车按钮,用jQuery传商品ID时就必须这样写:

javascript复制
$(".add-cart").on("click", {productId: 12345}, function(event){
  ajaxAddCart(event.data.productId); 
});

??表格对比:两种传参方式区别??

方式优点缺点移动端适配
匿名函数包裹简单直接无法动态修改参数兼容性好
data属性传递支持多参数、可复用需要处理事件对象iOS需注意内存
闭包方式灵活性强容易造成内存泄漏慎用

(抓头)这时候肯定有人问:??那我要动态修改参数怎么办??? 老司机教你用data属性存参数!比如外卖APP的加购数量调整:

javascript复制
$("#plusBtn").data("count", 1).click(function(){
  let current = $(this).data("count");
  $(this).data("count", current+1);
});

移动端特别注意事项

  • ??touch事件传参??要比click多一步阻止默认行为
  • 华为部分机型对JSON格式参数要求严格,得用JSON.stringify处理
  • 低端安卓机慎用箭头函数,会改变this指向

最近帮朋友改了个短视频APP的点赞功能,就栽在参数作用域上。他们原来的代码:

javascript复制
$(".like-btn").click(handleLike(videoId)); // 永远取到第一个视频ID

改成这样才正常:

javascript复制
$(".like-btn").each(function(){
  let vid = $(this).data("video-id");
  $(this).click(() => handleLike(vid));
});

??最后说个血泪教训:移动端ajax传参千万别用&连接参数!?? 上周有个学员的H5页面在vivo手机上报错,就是因为这样:

javascript复制
// 错误写法!安卓会吃掉第二个参数
$.post("api?action=add&id=1001"); 

// 正确姿势
$.post("api", {action:"add", id:1001});

小编观点:其实啊,参数传递这事儿说难不难,关键是多踩几次坑就记住了。下次遇到传参问题,先检查是不是直接调用了函数,再看看作用域对不对,最后用alert或者console.log把参数值打印出来——这老三样能解决80%的问题!

本文由嘻道妙招独家原创,未经允许,严禁转载