阻止 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 对抗网格的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 阻止应用程序使用的最佳方法是啥?

阻止人们破解基于 PHP 的 Flash 游戏高分表的最佳方法是啥

从大型数据集中过滤掉记录的最佳方法是什么

如何阻止网格单元在tailwindcss中水平拉伸?

为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

Kendo Grid 如何以编程方式聚焦网格单元并阻止选择文本