jQuery的onclick事件导致点击事件累计触发的问题

问题场景

维护公司老项目的时候,发现以下问题。

在使用jQuery中的click事件对页面中某个元素对象进行绑定时,如果不采用防抖/节流的写法会出现事件被多次绑定的情况。如果发生这种问题,会导致一次触发请求多次的情况,直接导致服务器的压力飙升。严重的话,服务器会直接挂掉。接下来具体说一下这个问题是如何形成的。

​
<div onclick="handleClick()">点我</div>
<div id="boxId">触发</div>
<script type="text/javascript" src="../js/jquery-1.10.2.min.js" ></script>
<script>
    function handleClick(){
        $('#boxId').click(function(){
            console.log(123);
        });
    }
</script>
​

handleClick函数中的内容是让$(’#boxId’)对象绑定click事件,当我们不断触发handleClick事件时,假设触发10次handleClick函数,我们只要点击一次下边的click绑定事件,就会重复打印10次123。如果我们把代码换成对于后台的请求,那么就会出现请求10次的情况。

解决方案

其实jQuery中已经给了解决方案,只是我们在使用时忽略了这种情况的处理。我们可以从绑定事情这里入手,既然每调用一次函数就会绑定一次,那么我们就想办法让绑定事件只进行一次绑定就可以啦。就像我们先清空,再添加内容一样,避免多次添加进行累加就可以啦。

有两种方案可以实现只绑定一次的效果,其实都是通过解除绑定再重新进行绑定的方式来进行处理的。

第一种:

​
$('#boxId').unbind('click').bind('click',function(){
    console.log(123);
});
​

第二种:

​
$('#boxId').off('click').on('click',function(){
    console.log(123);
})
​

思考总结

元素对象绑定事件的行为,jQuery并没有自己清除掉之前绑定的方法,而是通过提供unbind和off来清除之前的绑定。经过对移动端zepto中的tap事件进行测试发现,tap事件绑定同样也存在这样的问题,要清除绑定的话,同样也可以使用这两种方式来清除之前的绑定关系即可。

你可以使用JavaScript库jQuery来实现这个简单的网页功能。首先,你需要在HTML中设置基本结构,包括一个输入框、一个按钮以及一个用于显示结果的区域。然后,在JavaScript部分,利用jQuery事件处理和数组操作来完成计算。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>数值计算</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> </head> <body> <input type="number" id="input-number" placeholder="请输入数字"> <button onclick="addNumber()">加入并计算</button> <ul id="result-list"></ul> <p id="total-result">总计:</p> <script> function addNumber() { var inputVal = $('#input-number').val(); // 获取输入值 if (inputVal !== '') { // 检查输入是否为空 var listItems = $('#result-list li'); // 获取列表元素 var sum = listItems.length > 0 ? parseInt(listItems.text().replace(/\D/g, '')) : 0; // 如果已有元素,累加现有总和;否则初始化为0 // 创建新项并添加到列表 var newItem = $('<li>' + inputVal + '</li>'); newItem.data('sum', sum + parseInt(inputVal)); // 给新项数据属性存储累计和 $('#result-list').append(newItem); // 更新总计 $('#total-result').text('总计: ' + newItem.data('sum')); // 清空输入框 $('#input-number').val(''); } } </script> </body> </html> ``` 在这个例子中,当用户点击“加入并计算”按钮时,`addNumber`函数会被触发。它获取输入框的内容,检查是否为空,然后将输入数值追加到列表中。同时,如果列表已经有元素,会把新的数值加到之前所有数值之和上。列表项还存储了累计和以便于计算。每输入一次都会更新总计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值