jquery - JQuery DataTables 1.8.1 Checkbox - 代码等价
问题描述
我正在使用 datatable 1.8.1 和 ajax-source 来呈现我的表格。
我正在尝试使用一个“主”复选框选中/取消选中所有复选框。
我的复选框与 dataTables 的分页功能位于不同的页面上。这就是为什么我不能选择复选框的 id 或类别,因为这只会选择我当前页面上的复选框。
我确实进行了一些研究,并找到并尝试了以下代码:
dt.rows().nodes().to$().find('input[type="checkbox"]:not(:disabled)').prop('checked', $(this).prop('checked'));
其中 dt 是我的 Datatable 的一个实例:
var dt = $('#selector').dataTable();
但它表明 dt.rows() 不是一个函数。也许我的 Datatable 版本太旧了?有人对我上面提到的代码有任何想法或等价吗?
编辑
数据表
var dt = $('#newsletter_contact_datatable').dataTable();
var opts = dt.fnSettings();
opts.aoDrawCallback.push({
fn: function() {
var form = $(this).closest('form');
var container = form.find('.element-ids_js');
var values = container.val() ? JSON.parse(container.val()) : [];
var blacklist_container = form.find('.element-blacklisted-ids_js');
var blacklist_values = blacklist_container.val() ? JSON.parse(blacklist_container.val()) : [];
$('input[name="element-ids[]"]').each(function() {
var val = parseInt($(this).val());
if(blacklist_values.includes(val)) {
$(this).prop('checked', false).prop('disabled', true);
$(this).closest('tr').find('.blacklisted_js').removeClass('black').addClass('red').text('Annuler');
} else {
$(this).prop('checked', true).prop('disabled', false);
$(this).closest('tr').find('.blacklisted_js').removeClass('red').addClass('black').text('Retirer');
if(values.includes(val)) {
$(this).prop('checked', false);
}
}
});
$('input[name="check_all"]').prop('checked', true);
},
sName: 'user'
});
// REFRESH DATATABLE WITH FILTERS
$('.box-filter input, .box-filter select').on('change', function() {
refreshDatatable($(this));
});
refreshDatatable($('#newsletter_contact_datatable'));
function refreshDatatable($this) {
var $form = $this.closest('form');
opts.sAjaxSource = "{{ path('template_path') }}?" + $form.serialize();
dt.fnDraw();
}
$('form table input[name="check_all"]').on('change', function() {
dt.api().rows().nodes().to$().find('input[type="checkbox"]:not(:disabled)').prop('checked', $(this).prop('checked'));
});
<div class="grid grid_18">
<table id="newsletter_contact_datatable" class="data display datatable" data-sort="[[1, 'asc']]" data-ajax-source="{{ path('template_path') }}">
<thead>
<tr>
<th class="no_sort"><input type="checkbox" name="check_all" value="check_all" checked /></th>
<th width="15%">Lastname</th>
<th width="15%">First-name</th>
<th width="55%">Email</th>
<th class="no_sort" width="10%">Blacklist ?</th>
</tr>
</thead>
</table>
</div>
Template :
<input type="checkbox" name="element-ids[]" value="{{ obj.id }}" checked />
<div>{{ obj.data.lastname }}</div>
<div>{{ obj.data.firstname }}</div>
<div>
{{ email.label }}
</div>
<button type="button" class="btn black tiny blacklisted_js" data-id="{{ obj.id }}">Delete</button>
数据样本为:
复选框 - john - doe - johndoe@email.com - 按钮黑名单
提前致谢。
解决方案
而不是这个:
var dt = $('#selector').dataTable();
用这个:
var dt = $('#selector').DataTable();
换句话说,请注意使用 ofDataTable
而不是datatable
。
有什么区别?如DataTables API的此文档页面中所述:
$( selector ).DataTable()
重要的是要注意和之间的区别$( selector ).dataTable()
。前者返回一个 DataTables API 实例,而后者返回一个 jQuery 对象。
您可以从文档中看到访问 DataTables API 对象的 3 种不同方法。dataTable
因此,在分配时仍然使用的另一种方法dt
是:
dt.api();
1.8 版更新
我完全错过了您使用 1.8 的事实(问题中明确提到)。我的道歉 - 这改变了所有的语法。我上面的注释只适用于 1.10 以后的版本。
对于 1.8,试试这个:
你的出发点:
var dt = $('#newsletter_contact_datatable').dataTable();
使用该dt
变量,您可以使用以下内容:
$(dt.fnGetNodes()) // 1.8 syntax
这相当于您尝试使用的 1.10 语法:
dt.rows().nodes().to$() // 1.10 syntax
从这一点开始,您应该能够使用 jQuery 语法的其余部分.find(...)
来定位整个表格的复选框。
推荐阅读
- django - 如何使用 Django 自定义模板标签来获取对象的属性?
- python - “如何在 Line-plot 中显示两条线的数据点之间的差异值?”
- javascript - ReactJs - 获取后调用函数
- php - 如何修复 acf_form() 中的“标头已发送”错误
- javascript - 使用文本本地时区解码日期和时间字符串
- delphi - 如何修复模块 Project1.exe 中地址 00660938 的访问冲突。读取地址 00000150。在印地 (Delphi 10.3 Rio)
- javascript - 当 DOM 元素已经可见时,document.querySelector() 返回 null
- java - 突出显示文本 PDF 框阅读器
- spring-boot - SpringBoot 和 Jakarta MicroProfiles 的多核 CPU 利用率低
- node.js - Facebook 看不到 Angular 通用元标记