jquery - 服务器端处理后复选框在 DataTables 中不起作用
问题描述
我有一个使用服务器端处理和 Ajax 加载其行的 DataTable。每行都有一个复选框,其中包含一个数字 ID 作为值。
<input class="form-check-input" type="checkbox" id="coupon-111" name="chk[]" value="111">
表格外部有一个按钮,可以对检查的行执行操作——在这种情况下,将条目从活动更改为非活动。单击按钮时,它将运行此脚本:
$(document).on('click', 'button[data-action]', function () {
var action = $(this).data('action'); //Gets the action from the button clicked "Active" / "Inactive"
var selected = []; // Starts empty array of IDs for the rows checked.
// If the checkbox is checked, push its value (111) to the array.
$('td.check input:checked').each(function(i, e) {
selected.push($(this).val());
});
console.log(selected); // Console shows an empty array "[]"
// ...
});
在添加服务器端处理和 ajax 之前,此功能运行良好。我知道这与 Ajax 动态加载结果有关。如果这是一个事件,我只需将它绑定到 $(document) 就像我对按钮所做的那样。我怎样才能让它工作.each()
(或者我应该做些什么不同)?
这是 DataTables JS 和 Ajax:
jQuery(document).ready(function() {
var table = jQuery('#coupons-list').dataTable({
'pageLength': 25,
'autoWidth': false,
'bProcessing': true,
'sAjaxSource': './list.php',
'bPaginate': true,
'sPaginationType': 'full_numbers',
'iDisplayLength': 5,
'oLanguage': {
'sProcessing': '<div class="loader"><i class="fad fa-spinner-third fa-spin" aria-hidden="true"></i></div>'
},
'aoColumns': [
{ mData: 'check' },
{ mData: 'status' },
{ mData: 'code' },
{ mData: 'assigned_to' },
{ mData: 'discount_value' },
{ mData: 'start_date' },
{ mData: 'end_date' },
{ mData: 'uses_left' }
],
'createdRow': function(row, data, dataIndex) {
$(row).addClass('click-row').attr('data-href', './view/?id='+data['id']);
}
});
});
列表.php:
$coupons_list = array();
$select = $db -> prepare("SELECT coupons.id, coupons.influencer_id, coupons.status, coupons.code, coupons.value, coupons.type, coupons.start_date, coupons.end_date, coupons.uses_left, users.fname, users.lname FROM coupons LEFT OUTER JOIN influencers ON influencers.id = coupons.influencer_id LEFT OUTER JOIN users ON users.id = influencers.user_id ORDER BY coupons.code ASC");
$select -> execute();
$select -> bind_result($coupon_id, $influencer_id, $coupon_status, $coupon_code, $coupon_value, $coupon_type, $coupon_start_date, $coupon_end_date, $coupon_uses_left, $user_fname, $user_lname);
while ($select -> fetch())
{
$coupon = array(
'check' => '<input class="form-check-input" type="checkbox" id="coupon-'.$coupon_id.'" name="chk[]" value="'.$coupon_id.'">',
'id' => $coupon_id,
'status' => $coupon_status,
'code' => $coupon_code,
'assigned_to' => $coupon_influencer,
'discount_value' => number_format($coupon_value, 2),
'start_date' => $coupon_start_date,
'end_date' => $coupon_end_date,
'uses_left' => $coupon_uses_left
);
array_push($coupons_list, $coupon);
}
$table_data = array(
'sEcho' => 1,
'iTotalRecords' => count($coupons_list),
'iTotalDisplayRecords' => count($coupons_list),
'aaData' => $coupons_list
);
echo json_encode($table_data);
解决方案
在@andrewjames 的帮助下,我能够找出问题所在。
您的点击功能希望每个复选框都有一个名为 check: 'td.check input:checked' 的类 - 该类是如何添加的?
我使用 DataTablescolumnDefs
将“检查”类<td>
以及另一个“无点击”类添加到 . 问题是,第二类覆盖了第一类。
'columnDefs': [
{ className: 'check', targets: 0 },
{ className: 'no-click', targets: 0 }, // Overwrites "check"
{ className: 'fixed', targets: 1 }
]
所以相反,我这样做是为了让它按预期工作:
'columnDefs': [
{ className: 'check no-click', targets: 0 },
{ className: 'fixed', targets: 1 }
]
推荐阅读
- php - URL 重写内部服务器错误
- python - 如何从 OpenCV 图像而不是 numpy 数组中获取 TIFF 字节流?
- powershell - Powershell,从目录中的前 100 个文件创建存档
- java - Java 8+流:检查我的对象实例的两个字段的列表是否正确
- bash - 有什么作用。/opt/pat/staging/config/VARIABLES>>/dev/null 做什么?
- typescript - Visual Studio 2017 中的 Typescript d.ts 文件
- javascript - JS - 循环对象数组并输出属性
- debugging - 仅适用于在 Android 上远程调试 JS
- android - 收到错误请求错误
- dialogflow-es - 使用 Dialogflow 和位置共享的位置