Ext TextArea 在光标位置插入文本

前两天做了一个公式编辑窗口,使用textarea作为编辑框,要实现的主要功能有:

1、 可以任意编辑,

2、 点击操作符号按钮(+-*/等)时在textarea的光标位置插入操作符

3、 双击grid字段时,在textarea的光标位置插入字段名

 

基本代码很容易就完成了,如下:

/**
 * Created with JetBrains WebStorm.
 * User: 常绍新
 * Date: 12-7-27
 * Time: 下午6:36
 * To change this template use File | Settings | File Templates.
 */

Ext.onReady(function () {
Ext.define('TextEdit', {
    extend: 'Ext.panel.Panel',
    alias : 'widget.textedit',

    autoShow: true,
    initComponent: function() {
        var store = Ext.create('Ext.data.Store',{
            fields:['fieldName'],
            data:[
                {fieldName:"供电量"},
                {fieldName:"售电量"},
                {fieldName:"线损率"},
                {fieldName:"月份"},
                {fieldName:"单位"}
            ]
        });
        this.items = [
			{
				region:'north',
                xtype: 'panel',
                title:'公式编辑',
                items: [
                {
                    xtype: 'textareafield',
                    width:400,
                    height:100
                },{
                    xtype:'toolbar',
                    ui:'footer',
                    items:['->',{
                        action:'add_button',
                        text:'+',
                        handler:this.btnOpClick
                    },{
                        action:'subs_button',
                        text : '-',
                        handler:this.btnOpClick
                    },{
                        action:'multi_button',
                        text:'*',
                        handler:this.btnOpClick
                    },{
                        action:'devide_button',
                        text:'/',
                        handler:this.btnOpClick
                    },{
                        action:'percent_button',
                        text:'%',
                        handler:this.btnOpClick
                    },{
                        action:'quete_button',
                        text:'(',
                        handler:this.btnOpClick
                    },{
                        action:'quete_button',
                        text:')',
                        handler:this.btnOpClick
                    }]

                },{
                    width:400,
                    height:200,
                    key:'field',
                    xtype: 'grid',
                    columns:[{header:'字段名称',dataIndex:'fieldName', flex:1}],
                    store:store,
                    listeners:{
                        itemdblclick:{
                            fn:function(view,record,item,index,e,eOpts){
                                view.up("textedit").insertValue("${" + record.get("fieldName") + "}");
                            }
                        }
                    }
                }]
            }
        ];

        this.callParent(arguments);
    },

	insertValue:function(value){
		var ta = this.down("textareafield");
		var oriValue = ta.getValue().toString();
		//ta.setValue(oriValue.substring(0,this.selectionStart) + value + oriValue.substring(this.selectionEnd));
		ta.setValue(oriValue.toString() + value );
	},
    btnOpClick:function(srcObj, record){
   		srcObj.up("textedit").insertValue(" " + srcObj.getText()+" ");
   	}
});

    var textEdit= Ext.create('TextEdit',{

    });
    var win = Ext.create('Ext.Window', {
            width: 400,
            height: 400,
            hidden: false,
            maximizable: true,
            //title: 'Line Chart',
            renderTo: Ext.getBody(),
            layout: 'fit',
            items: textEdit
        });

});

但就是在一直得不到textarea的当前光标位置,查Ext的Api文档,也没有一点的提及得到或设置textarea的光标位置的内容。getPosition(),getInsertPosition()都不是得到光标位置,而是得到当前组件的位置。

折腾了一天多,后来终于在网上找到了相关文章,原来是使用inputEl.dom.selectionStart和inputEl.dom.selectionEnd得到当前选中的位置(如果没有选中就是光标位置)。

于是很快的实现了在光标位置插入指定信息的要求。改进后的代码如下:

/**
 * Created with JetBrains WebStorm.
 * User: 常绍新
 * Date: 12-7-27
 * Time: 下午6:36
 * To change this template use File | Settings | File Templates.
 */

Ext.onReady(function () {
Ext.define('TextEdit', {
    extend: 'Ext.panel.Panel',
    alias : 'widget.textedit',

    autoShow: true,
    initComponent: function() {
		this.selectionStart=0;
		this.selectionEnd=0;
        var store = Ext.create('Ext.data.Store',{
            fields:['fieldName'],
            data:[
                {fieldName:"供电量"},
                {fieldName:"售电量"},
                {fieldName:"线损率"},
                {fieldName:"月份"},
                {fieldName:"单位"}
            ]
        });
        this.items = [
			{
				region:'north',
                xtype: 'panel',
                title:'公式编辑',
                //width:"60%",
                items: [
                {
                    xtype: 'textareafield',
                    width:400,
                    height:100,
	 	    enableKeyEvents:true,
                   name : 'formula',
					listeners:{
						blur:{
							fn:function(ta, the, eOpts){
								ta.up("textedit").selectionStart = ta.inputEl.dom.selectionStart;
								ta.up("textedit").selectionEnd = ta.inputEl.dom.selectionEnd;
							}
						}
					}
                },{
                    xtype:'toolbar',
                    ui:'footer',
                    items:['->',{
                        action:'add_button',
                        text:'+',
                        handler:this.btnOpClick
                    },{
                        action:'subs_button',
                        text : '-',
                        handler:this.btnOpClick
                    },{
                        action:'multi_button',
                        text:'*',
                        handler:this.btnOpClick
                    },{
                        action:'devide_button',
                        text:'/',
                        handler:this.btnOpClick
                    },{
                        action:'percent_button',
                        text:'%',
                        handler:this.btnOpClick
                    },{
                        action:'quete_button',
                        text:'(',
                        handler:this.btnOpClick
                    },{
                        action:'quete_button',
                        text:')',
                        handler:this.btnOpClick
                    }]

                },{
                    width:400,
                    height:200,
                    key:'field',
                    xtype: 'grid',
                    columns:[{header:'字段名称',dataIndex:'fieldName', flex:1}],
                    store:store,
                    listeners:{
                        itemdblclick:{
                            fn:function(view,record,item,index,e,eOpts){
                                view.up("textedit").insertValue("${" + record.get("fieldName") + "}");
                            }
                        }
                    }
                }]
            }
        ];

        this.callParent(arguments);
    },

	insertValue:function(value){
		var ta = this.down("textareafield");
		var oriValue = ta.getValue().toString();
		ta.setValue(oriValue.substring(0,this.selectionStart) + value + oriValue.substring(this.selectionEnd));
		//ta.setValue(oriValue.toString() + value );
		this.selectionStart += value.length;
		this.selectionEnd += value.length;
	},
    btnOpClick:function(srcObj, record){
   		srcObj.up("textedit").insertValue(" " + srcObj.getText()+" ");
   	}
});

    var textEdit= Ext.create('TextEdit',{

    });
    var win = Ext.create('Ext.Window', {
            width: 400,
            height: 400,
            hidden: false,
            maximizable: true,
            //title: 'Line Chart',
            renderTo: Ext.getBody(),
            layout: 'fit',
            items: textEdit
        });

});


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值