extjs表格(Ext4.0.7 Grid)启用 文本选择复制功能

extjs表格(Ext4.0.7 Grid)启用 文本选择复制功能

首先4.1.0 之后的版本通过修改全局属性来解决这个问题。

<code>Ext.override(Ext.view.Table, { enableTextSelection: true }); // Treepanels

Ext.override(Ext.grid.View,  { enableTextSelection: true }); // Grids</code>

在4.1.0以下版本中需要稍微修改一下代码,修改的地方也还不是太多。

1.覆盖css代码:如果想在全局下起作用,直接修改ext-all.css文件吧。

<style type=”text/css”>
.x-grid-row {
line-height:13px;
vertical-align:top;
padding:0 1px;
user-select:text!important;
-o-user-select:text!important;
-ms-user-select:text!important;
-moz-user-select:-moz-none;
-webkit-user-select:text!important;
cursor:default
}
.x-grid-cell {
overflow:hidden;
font:normal 13px tahoma,arial,verdana,sans-serif;
user-select:text!important;
-o-user-select:text!important;
-ms-user-select:text!important;
-moz-user-select:-moz-none;
-webkit-user-select:text!important;
cursor:default
}
.x-unselectable {
user-select:text!important;
-o-user-select:text!important;
-ms-user-select:text!important;
-moz-user-select:-moz-none;
-webkit-user-select:text!important;
cursor:default
}
</style>

2.修改ext-all.js文件

找到me.el.unselectable(); 部分,并注释他。在4.0.7版本的ext-all-dev.js中是114629行。

3.运行你的程序看看是否能选择文本,下图是我的运行结果。

extjs表格(Ext4.0.7 Grid)启用 文本选择复制功能

Ext JS – Make Grid Text Selectable (with a mouse)

also see :http://ahlearns.wordpress.com/2011/10/27/ext-js-make-grid-text-selectable/
翻译版本:http://www.cnblogs.com/nozer/archive/2011/12/25/2301410.html
extjs提供了方便的表格组件grid供使用,但是默认情况下表格中的文本是不能被选中的,自然也是无法复制的。

而选择复制文本的需要也是很平常的,于是我们就需要自己动手来解决这个问题,实现extjs的grid文本选择复制功能。

说明一点,文中所列出的代码片断都是在当前ext 4.0.2a版本下的,其它版本未做测试,请自行斟酌。

首先自定义一下样式,来覆盖默认的css样式:

<style type="text/css"

.x-selectable, .x-selectable * { 
    -moz-user-select: text!important
    -khtml-user-select: text!important
</style>

复写extjs的table类,阻止鼠标选择文本的就是这个unselectable

/** 
 * override the table class 
 */ 
Ext.override(Ext.view.Table, {  
  afterRender : function() {  
    var me = this;  

    me.callParent();  
    me.mon(me.el, {  
      scroll : me.fireBodyScroll,  
      scope : me  
    });  
    if (!me.featuresMC &amp;&amp; (me.featuresMC.findIndex('ftype', 'unselectable') &gt;= 0)) {  
      me.el.unselectable();  
    }  

    me.attachEventsForFeatures();  
  }  
});

然后再自定义一个feature,启用文本选择功能,通过替换取消unselectable样式,同时增加x-selectable样式

/** 
 * define the select feature 
 */ 
Ext.define('Myext.grid.SelectFeature', {  
  extend : 'Ext.grid.feature.Feature',  
  alias : 'feature.selectable',  

  mutateMetaRowTpl : function(metaRowTpl) {  
    var i, ln = metaRowTpl.length;  

    for (i = 0; i &lt; ln; i++) {  
      tpl = metaRowTpl[i];  
      tpl = tpl.replace(/x-grid-row/, 'x-grid-row x-selectable');  
      tpl = tpl.replace(/x-grid-cell-inner x-unselectable/g, 'x-grid-cell-inner');  
      tpl = tpl.replace(/unselectable="on"/g, '');  
      metaRowTpl[i] = tpl;  
    };  
  }  
});

现在可以声明一个selectFeature了

var selectFeature = Ext.create(‘Myext.grid.SelectFeature’);

需要启用文本选择的表格,在创建时添加这个feature就可以了

Ext.create('Ext.grid.Panel', {  
  title : 'grid example',  
  store : gridStore, // define before  
  width : 600,  
  height : 300,  
  features : [selectFeature],  
  columns : [{  
    text:'name',  
    dataIndex:'name' 
  }]  
  // other code  
}

 

Making ExtJS 4 grid content selectable

Grid Panel – Cell Value selection & Copy option

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>