阻止 CTRL-V 对抗网格的最佳方法
Posted
技术标签:
【中文标题】阻止 CTRL-V 对抗网格的最佳方法【英文标题】:Best way to block CTRL-V against a grid 【发布时间】:2018-02-12 17:13:01 【问题描述】:使用下面的提琴手https://fiddle.sencha.com/#fiddle/1frn
您可以选择单元格,按 CTRL-C,然后选择不同的单元格,按 CTRL-V,您会看到值已被复制。
如何阻止 CTRL-V?
重写 clipboard.validateAction 是最好的方法吗?
privates :
validateAction : function(event)
var view = this.getCmp().getView();
If(view.actionableMode)
return false;
我不清楚为什么像 validateAction 这样的通用函数会是私有的......
【问题讨论】:
作为程序员和最终用户,为什么要通过删除粘贴功能来折磨普通人群?只需将列标记为“不可编辑”即可。您使用的插件 (cellediting
) 可能会在标签上启用 contenteditable。您想要实现什么允许正常输入但不允许粘贴输入,或者您是否试图阻止整体输入?
也许这会有所帮助:***.com/questions/5510129/…
您好,您的意思是根据您的应用程序/网格的状态,您希望 CTRL-V 对 Grid 被阻止,但如果在应用程序外部(例如 Excel)完成,则可以,但 CTRL-C 始终可以工作??
@Brian 是的,我需要根据其状态控制在网格上复制和粘贴值的能力
@BrianMogambi 是的,就是这样
【参考方案1】:
您可以使用此覆盖/示例代码来控制根据网格的当前状态进行粘贴的能力:
Ext.define('Fiddle.grid.plugin.Clipboard',
override: 'Ext.grid.plugin.Clipboard',
beforepaste: Ext.emptyFn,
mixins: [
'Ext.mixin.Observable'
],
constructor: function(config)
var me = this;
me.callParent([config]);
me.mixins.observable.constructor.call(me);
,
privates :
onPaste: function (keyCode, event)
var me = this,
sharedData = me.shared.data,
source = me.getSource(),
i, n, s;
if (me.validateAction(event) === false)
return;
if (me.fireEvent('beforepaste',keyCode,event,me.cmp) !== false)
if (source)
for (i = 0, n = source.length; i < n; ++i)
s = source[i];
if (s === 'system')
// get the format used by the system clipboard.
s = me.getSystem();
me.pasteClipboardData(s);
break;
else if (sharedData && (s in sharedData))
me.doPaste(s, sharedData[s]);
break;
);
Ext.define('UserController',
extend : 'Ext.app.ViewController',
alias: 'controller.users',
onBeforePaste:function(keyCode,event,grid)
//Perform custom logic
console.log(grid)
return false;
);
Ext.application(
name: 'Fiddle',
launch: function()
var store = Ext.create('Ext.data.Store',
fields: ['name', 'email', 'phone'],
data: [
name: 'Lisa',
email: 'lisa@simpsons.com',
phone: '555-111-1224'
,
name: 'Bart',
email: 'bart@simpsons.com',
phone: '555-222-1234'
,
name: 'Homer',
email: 'homer@simpsons.com',
phone: '555-222-1244'
,
name: 'Marge',
email: 'marge@simpsons.com',
phone: '555-222-1254'
]
);
Ext.create('Ext.grid.Panel',
title: 'Simpsons',
store: store,
controller:'users',
width: 400,
renderTo: Ext.getBody(),
columns: [
text: 'Name',
dataIndex: 'name'
,
text: 'Email',
dataIndex: 'email',
flex: 1
,
text: 'Phone',
dataIndex: 'phone'
],
plugins:
ptype: 'cellediting',
clicksToEdit: 2
,
selModel:
type: 'spreadsheet',
rowNumbererHeaderWidth: 0
,
plugins: [
ptype: 'clipboard',
listeners:
beforepaste: 'onBeforePaste'
],
listeners:
selectionchange: function(grid, selection, eOpts)
var store = grid.getStore();
);
);
【讨论】:
以上是关于阻止 CTRL-V 对抗网格的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
阻止人们破解基于 PHP 的 Flash 游戏高分表的最佳方法是啥