mirror of https://github.com/layui/layui
refactor(table): 优化行单双击事件机制,避免与单元格编辑等事件冲突 (#2064)
* chore(table): 优化行事件,新增返回 `event` 对象,可用于阻止事件冒泡 * docs: 更新文档 * refactor: 重新优化不触发行事件的机制pull/2094/head
parent
47728370e8
commit
4c6c133a12
|
@ -768,18 +768,25 @@ table.render({
|
||||||
});
|
});
|
||||||
|
|
||||||
// 行单击事件
|
// 行单击事件
|
||||||
table.on('row(test)', function(obj){
|
table.on('row(test)', function(obj) {
|
||||||
var data = obj.data; // 得到当前行数据
|
var data = obj.data; // 得到当前行数据
|
||||||
var dataCache = obj.dataCache; // 得到当前行缓存数据,包含特定字段 --- 2.8.8+
|
var dataCache = obj.dataCache; // 得到当前行缓存数据,包含特定字段 --- 2.8.8+
|
||||||
var index = obj.index; // 得到当前行索引
|
var index = obj.index; // 得到当前行索引
|
||||||
var tr = obj.tr; // 得到当前行 <tr> 元素的 jQuery 对象
|
var tr = obj.tr; // 得到当前行 <tr> 元素的 jQuery 对象
|
||||||
var options = obj.config; // 获取当前表格基础属性配置项
|
var options = obj.config; // 获取当前表格基础属性配置项
|
||||||
console.log(obj); // 查看对象所有成员
|
var e = obj.e; // 当前的 jQuery 事件对象 --- 2.9.14+
|
||||||
|
|
||||||
|
console.log('onrow', obj); // 查看返回对象的所有成员
|
||||||
|
|
||||||
// obj.del() // 删除当前行
|
// obj.del() // 删除当前行
|
||||||
// obj.update(fields, related); // 修改行数据
|
// obj.update(fields, related); // 修改行数据
|
||||||
// obj.setRowChecked(opts); // 设置行选中状态
|
// obj.setRowChecked(opts); // 设置行选中状态
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 行双击事件
|
||||||
|
table.on('rowDouble(test)', function(obj) {
|
||||||
|
console.log('onrowDouble', obj); // 查看返回对象的所有成员 - 同 row 事件
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
<h3 id="on-rowContextmenu" lay-pid="table.on" class="ws-anchor ws-bold">行右键菜单事件 <sup>2.8+</sup></h3>
|
<h3 id="on-rowContextmenu" lay-pid="table.on" class="ws-anchor ws-bold">行右键菜单事件 <sup>2.8+</sup></h3>
|
||||||
|
|
|
@ -195,7 +195,7 @@ layui.use(['table', 'dropdown'], function(){
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
// escape: false,
|
// escape: false,
|
||||||
editTrigger: 'dblclick',
|
// editTrigger: 'dblclick',
|
||||||
// cellMaxWidth: 320
|
// cellMaxWidth: 320
|
||||||
// cellExpandedWidth: 160, // 单元格默认展开后的宽度
|
// cellExpandedWidth: 160, // 单元格默认展开后的宽度
|
||||||
// cellExpandedStyle: 'tips', // 单元格默认展开风格
|
// cellExpandedStyle: 'tips', // 单元格默认展开风格
|
||||||
|
@ -555,18 +555,18 @@ layui.use(['table', 'dropdown'], function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
// 行单击事件
|
// 行单击事件
|
||||||
table.on('row(test)', function(obj){
|
table.on('row(test)', function(obj) {
|
||||||
console.log(obj);
|
console.log('onrow', obj); // 查看返回的对象成员
|
||||||
// layer.closeAll('tips');
|
|
||||||
|
// 单击行设置选中
|
||||||
obj.setRowChecked({
|
obj.setRowChecked({
|
||||||
// type: 'radio'
|
// type: 'radio'
|
||||||
});
|
});
|
||||||
// layer.msg('row 事件')
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 行双击事件
|
// 行双击事件
|
||||||
table.on('rowDouble(test)', function(obj){
|
table.on('rowDouble(test)', function(obj) {
|
||||||
console.log(obj);
|
console.log('onrowDouble', obj); // 查看返回的对象成员
|
||||||
});
|
});
|
||||||
|
|
||||||
// 单元格编辑事件
|
// 单元格编辑事件
|
||||||
|
|
|
@ -2497,31 +2497,39 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
|
||||||
if(othis.data('off')) return; // 不触发事件
|
if(othis.data('off')) return; // 不触发事件
|
||||||
that.layBody.find('tr:eq('+ index +')').removeClass(ELEM_HOVER)
|
that.layBody.find('tr:eq('+ index +')').removeClass(ELEM_HOVER)
|
||||||
}).on('click', 'tr', function(e){ // 单击行
|
}).on('click', 'tr', function(e){ // 单击行
|
||||||
// 不支持行单击事件的元素
|
setRowEvent.call(this, 'row', e);
|
||||||
var UNROW = [
|
}).on('dblclick', 'tr', function(e){ // 双击行
|
||||||
'.layui-form-checkbox',
|
setRowEvent.call(this, 'rowDouble', e);
|
||||||
'.layui-form-switch',
|
|
||||||
'.layui-form-radio',
|
|
||||||
'[lay-unrow]'
|
|
||||||
].join(',');
|
|
||||||
if( $(e.target).is(UNROW) || $(e.target).closest(UNROW)[0]){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setRowEvent.call(this, 'row');
|
|
||||||
}).on('dblclick', 'tr', function(){ // 双击行
|
|
||||||
setRowEvent.call(this, 'rowDouble');
|
|
||||||
}).on('contextmenu', 'tr', function(e){ // 菜单
|
}).on('contextmenu', 'tr', function(e){ // 菜单
|
||||||
if (!options.defaultContextmenu) e.preventDefault();
|
if (!options.defaultContextmenu) e.preventDefault();
|
||||||
setRowEvent.call(this, 'rowContextmenu');
|
setRowEvent.call(this, 'rowContextmenu', e);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 创建行单击、双击、菜单事件
|
// 创建行单击、双击、菜单事件
|
||||||
var setRowEvent = function(eventType){
|
var setRowEvent = function(eventType, e){
|
||||||
var othis = $(this);
|
var othis = $(this);
|
||||||
if(othis.data('off')) return; //不触发事件
|
if(othis.data('off')) return; // 不触发事件
|
||||||
layui.event.call(this,
|
|
||||||
|
// 不触发「行单/双击事件」的子元素
|
||||||
|
if (eventType !== 'rowContextmenu') {
|
||||||
|
var UNROW = [
|
||||||
|
'.layui-form-checkbox',
|
||||||
|
'.layui-form-switch',
|
||||||
|
'.layui-form-radio',
|
||||||
|
'[lay-unrow]'
|
||||||
|
].join(',');
|
||||||
|
|
||||||
|
if($(e.target).is(UNROW) || $(e.target).closest(UNROW)[0]){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
layui.event.call(
|
||||||
|
this,
|
||||||
MOD_NAME, eventType + '('+ filter +')',
|
MOD_NAME, eventType + '('+ filter +')',
|
||||||
commonMember.call(othis.children('td')[0])
|
commonMember.call(othis.children('td')[0], {
|
||||||
|
e: e
|
||||||
|
})
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2606,7 +2614,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
|
||||||
|
|
||||||
// 表格主体单元格触发编辑的事件
|
// 表格主体单元格触发编辑的事件
|
||||||
that.layBody.on(options.editTrigger, 'td', function(e){
|
that.layBody.on(options.editTrigger, 'td', function(e){
|
||||||
renderGridEdit(this, e)
|
renderGridEdit(this, e);
|
||||||
}).on('mouseenter', 'td', function(){
|
}).on('mouseenter', 'td', function(){
|
||||||
showGridExpandIcon.call(this)
|
showGridExpandIcon.call(this)
|
||||||
}).on('mouseleave', 'td', function(){
|
}).on('mouseleave', 'td', function(){
|
||||||
|
|
Loading…
Reference in New Issue