javascript - 当我使用多个 jQuery change() 方法调用它时,如何避免多次调用我的函数?
问题描述
我有一个价格标签,只要用户更改我的产品下拉列表、出发日期和返回日期的值,它就会动态变化。getPrice()
每当这三个发生变化时,我都会打电话。
我的目标是只调用一次 getPrice() 方法,但仍然根据当前选择的产品、出发日期和返回日期计算正确的价格。
请注意 getPrice() 将dropdown、离开日期和返回日期作为参数。
我的代码基本上是这样的:
已编辑——我放置了一个与我的代码类似的工作代码片段。
$(document).ready(function () {
getDeptFormat();
getRetFormat();
$("#dropdown").change(function () {
getDeptFormat();
getRetFormat();
getPrice();
});
$("#departureDate").change(function () {
getPrice();
});
$("#returnDate").change(function () {
getPrice();
});
$("#reset").click(function () {
$("#totalPrice").html('').append('0');
})
})
function getDeptFormat() {
$("#departureDate").daterangepicker({
singleDatePicker: true,
"startDate":getDeptMinDate(),
});
}
function getRetFormat() {
$("#returnDate").daterangepicker({
singleDatePicker: true,
"startDate":getRetMinDate(),
});
}
function getPrice() {
$("#totalPrice").append("5");
}
function getDeptMinDate() {
var add = "10/25/2019";
if (parseInt($("#dropdown").val()) == 1)
{
add = "10/26/2019";
}
else if (parseInt($("#dropdown").val()) == 2)
{
add = "10/27/2019";
}
else if (parseInt($("#dropdown").val()) == 3)
{
add = "10/28/2019";
}
return add;
}
function getRetMinDate() {
var add = "10/26/2019";
if (parseInt($("#dropdown").val()) == 1)
{
add = "10/27/2019";
}
else if (parseInt($("#dropdown").val()) == 2)
{
add = "10/28/2019";
}
else if (parseInt($("#dropdown").val()) == 3)
{
add = "10/29/2019";
}
return add;
}
#container {
border: 1px solid red;
padding :20px;
}
<script type="text/javascript" src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
<div id="container">
<select id="dropdown">
<option value="1">Product 1</option>
<option value="2">Product 2</option>
<option value="3">Product 3</option>
</select>
<input type="text" id="departureDate" spellcheck="false" autocomplete="off" />
<input type="text" id="returnDate" spellcheck="false" autocomplete="off" />
<div>
Price:<span id="totalPrice">0</span></div>
<button type="button" id="reset">Click to reset price</button>
</div>
请注意,每当我更改下拉列表时,都会调用 getPrice() 函数 3 次。getPrice() 函数有点慢,这就是为什么它在被多次调用时很烦人的原因。仅调用一次 getPrice() 函数但仍根据当前选择的下拉列表、出发日期和返回日期计算它的最佳方法是什么?
我目前正在尝试理解异步 javascript 和 Promise,因为它们可能会帮助我解决我的问题。如果我的问题有点令人困惑,我很抱歉。
解决方案
不要将更改事件用于日期值更改检测。更改日期时使用 datepicker 回调函数。
前任。删除以下代码:
$("#departureDate").change(function () {
getPrice();
});
使用此代码:
$("#departureDate").daterangepicker({
singleDatePicker: true,
"startDate":getDeptMinDate(),
}, function(start, end, label) {
getPrice();
});
推荐阅读
- angular - Angular 6:OnChanges 不适用于异步管道
- c++ - PCL shared_ptr的垃圾收集?
- javascript - 如果我使用地图而不是静态组件,则路线会重新呈现
- php - 在 Symfony 中而不是在控制器中使用服务的最佳实践是什么?
- c# - SignInManager.PasswordSignIn 在第一次尝试时很慢
- javascript - JavaScript 替换字符串中的特定单词
- sql-server - SQL Server System.OutOfMemoryException
- angular - 在同一项目中的两个 Angular 应用程序之间导航
- java - Spark:高效的行复制
- node.js - MongoError:拓扑被破坏,我该如何修复它?