You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jQuery实现酒店风扇档位按钮互斥单选切换效果

酒店客房风扇档位单选功能修复

问题描述

开发酒店客房风扇控制功能时,设置4个按钮分别对应不同风速档位,要求实现单选互斥逻辑:用户点击任意档位按钮时,其余档位按钮自动切换为关闭状态,同一时间仅允许一个档位激活。
原有基于jQuery实现的代码存在逻辑缺陷,4个按钮可同时点击激活,不符合业务要求。原有代码为每个按钮单独绑定点击事件,点击后通过$.ajax()发起POST请求提交设备控制参数,原代码如下:

$("#wentAOnOff").click(function() {
        $.ajax({
            url:'do',
            type:'POST',
            data: {
                actions:[
                    {action: "set", what: "mbt", id: "1175", val: 1},
                    {action: "set", what: "mbt", id: "1062", val: 1},
                ]
            },
            success: function(res) {
            },
            error : function() {
            }
        });
    });

    $("#went1OnOff").click(function() {
        $.ajax({
            url:'do',
            type:'POST',
            data: {
                actions:[
                    {action: "set", what: "mbt", id: "1176", val: 1},
                    {action: "set", what: "mbt", id: "1062", val: 1},
                ]
            },
            success: function(res) {
            },
            error : function() {
            }
        });
    });
    $("#went2OnOff").click(function() {
        $.ajax({
            url:'do',
            type:'POST',
            data: {
                actions:[
                    {action: "set", what: "mbt", id: "1177", val: 1},
                    {action: "set", what: "mbt", id: "1062", val: 1},
                ]
            },
            success: function(res) {
            },
            error : function() {
            }
        });
    });
    $("#went3OnOff").click(function() {
        $.ajax({
            url:'do',
            type:'POST',
            data: {
                actions:[
                    {action: "set", what: "mbt", id: "1178", val: 1},
                    {action: "set", what: "mbt", id: "1062", val: 1},
                ]
            },
            success: function(res) {
            },
            error : function() {
            }
        });
    });

修复思路

原有代码的核心问题是重复逻辑多、没有做状态互斥处理:点击按钮时只提交了当前档位的开启参数,既没有通知设备关闭其他档位,也没有在前端UI层更新其他按钮的状态,导致多档位可同时激活。
优化逻辑如下:

  • 抽离4个档位的重复配置,统一绑定事件,减少冗余代码
  • 点击按钮时先判断是否为当前已激活档位,避免重复发请求
  • 组装请求参数时,当前档位传开启值val:1,其余所有档位传关闭值val:0,保证设备端状态互斥
  • 接口请求成功后再更新UI状态:移除所有按钮的激活样式,仅给当前点击按钮加激活态,避免请求失败时UI和实际设备状态不一致

优化后完整代码

首先给4个档位按钮加上统一类名fan-speed-btn(直接在原有html的按钮标签上加class即可,不用改原有id),然后替换原有js逻辑:

// 档位按钮ID与设备控制ID映射关系
const fanSpeedMap = {
  wentAOnOff: '1175',
  went1OnOff: '1176',
  went2OnOff: '1177',
  went3OnOff: '1178'
};
const FAN_POWER_CTRL_ID = '1062';

// 统一绑定所有档位按钮点击事件
$('.fan-speed-btn').on('click', function() {
  const $current = $(this);
  const currentId = $current.attr('id');

  // 已激活的档位重复点击不触发请求
  if ($current.hasClass('active')) return;

  // 组装控制参数:当前档位开,其余档位关
  const actions = Object.entries(fanSpeedMap).map(([btnId, devId]) => ({
    action: 'set',
    what: 'mbt',
    id: devId,
    val: btnId === currentId ? 1 : 0
  }));
  // 加入风扇电源开启参数
  actions.push({
    action: 'set',
    what: 'mbt',
    id: FAN_POWER_CTRL_ID,
    val: 1
  });

  $.ajax({
    url: 'do',
    type: 'POST',
    data: { actions },
    success(res) {
      // 请求成功再更新UI状态,保证和设备实际状态一致
      $('.fan-speed-btn').removeClass('active');
      $current.addClass('active');
      // 可自行补充激活态样式,比如修改按钮颜色、切换高亮图标等
    },
    error() {
      // 可自行补充错误提示,比如console.log('档位切换失败,请重试')
    }
  });
});

补充说明:如果对接的设备后端本身已经做了档位互斥处理,不需要前端传其他档位的关闭参数,可以只保留当前档位的开启参数,但前端UI层的互斥状态更新必须保留,保证用户交互符合单选逻辑。如果需要增加风扇关机功能,额外增加关机按钮即可,点击时给所有档位传val:0、电源控制id传val:0,同时移除所有档位按钮的active类。

内容的提问来源于stack exchange,提问作者Oleksandr_UA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:18:49