jquery - 将数据表ajax请求绑定到不同的按钮
问题描述
我有一个配置为的数据表
var table = $(".datatable").DataTable({
processing: true,
serverSide: true,
ajax: {
url: $("#datatable").attr("data-search"),
dataType: "JSON",
complete: function (data) {
$(".total-records").html(data.responseJSON.recordsTotal);
$("#maxPageText").html(`of ${table.page.info().pages} <i class="fa fa-chevron-right" style="font-weight:200;"></i>`);
}
},
});
table.ajax.reload();
一切正常,搜索,排序等等。但是,我正在尝试制作一个不同的文本框作为模式中存在的搜索。我正在尝试发送 ajax 请求并使用从该特定 ajax 返回的新数据重建数据表,但它似乎没有用新数据重建。
这是代码
$("body").on("click", ".advance-search", function () {
var type = $(this).attr("data-type");
var value = "";
var search = $(this).attr("data-search");
if (type == "tag") {
value = $("#tagSearchInput").val();
} else {
value = $(".input-advance-search").val();
}
$.ajax({
url: search,
method: "GET",
dataType: "JSON",
data: { "type": type, "value": value, "data": table.data().ajax.params() },
complete: function (data) {
console.log(data.responseJSON);
table.clear().rows.add(data.responseJSON.data).draw();
return false;
}
});
return false;
});
请注意,我return false
在两个地方添加了,因为在这个 ajax 请求之后,另一个 ajax 请求被发送,这似乎是通过堆栈跟踪从这一行发出的table.clear().rows.add(data.responseJSON.data).draw();
。
任何人都可以帮忙吗?
解决方案
我想建议你将ajax 选项作为一个函数。在该函数内部检查#tagSearchInput
or的值.input-advance-search
并将其与data
. 然后使用jquery ajax api 进行 ajax 调用并传递新的自定义数据。
var table = $(".datatable").DataTable({
processing: true,
serverSide: true,
// use ajax as a function
ajax: function (data, callback, settings) {
// get the 'data-type' and 'data-search' attribute
var type = $(".advance-search").attr("data-type"),
search = $(".advance-search").attr("data-search"),
value = "";
if (type == "tag") {
value = $("#tagSearchInput").val();
} else {
value = $(".input-advance-search").val();
}
// append the 'type' and 'value' in 'data'
data.type = type;
data.value = value;
// make ajax call using jquery ajax api
$.ajax({
url: search,
method: "GET",
dataType: "JSON",
// pass new customized data
data: data,
complete: function (data) {
$(".total-records").html(data.responseJSON.recordsTotal);
$("#maxPageText").html(`of ${table.page.info().pages} <i class="fa fa-chevron-right" style="font-weight:200;"></i>`);
// call the callback function with the result
callback(data.responseJSON.data);
}
});
},
});
现在,在单击事件时,.advance-search
您只需使用draw()
api 重新加载表格。
$("body").on("click", ".advance-search", function () {
table.draw();
});
使用这种方法,您的代码将看起来更干净和优雅。
现在,由于以下代码,您担心在另一个 ajax 请求之后发送 ajax 请求
table.clear().rows.add(data.responseJSON.data).draw();
由于该draw()
方法,该ajax调用正在发生。这是因为当启用服务器端处理时,adraw()
总是会触发重新加载。也clear()
不会清空表格,因为它是客户端功能。有关更多信息,请查看手册中的处理模式部分。
推荐阅读
- python-3.x - 将具有货币值(如 €118.5M 或 €60K)的 pandas 列转换为整数或浮点数
- mathjax - 在 MathJax 中显示 texerror 的方法
- laravel - 在 Laravel Query Builder 子查询函数中访问列值作为变量
- flutter - sqflite IN 运算符与 AND 运算符
- css - Ionic 4:如何覆盖不受 css 变量控制的阴影元素中的样式?
- snowflake-cloud-data-platform - 我们如何在 Snowflake 中使用子查询,从 (select....) 中选择列失败
- stm32 - STM32F4 - 丢失来自 max30100 的 FIFO 数据样本
- c# - 取消 Abot 上的站点抓取
- machine-learning - 值错误:训练折叠中只有 2 个类/es,但整个数据集中有 1 个。具有不平衡折叠的决策函数不支持此功能
- c# - 如何绑定数据库中的图像并在gridview中显示图像?