cocos2d-js中对输入框的支持太少:没有光标、不能自动换行等等;
下面对输入框的光标进行了添加:
"use strict"; var MyEditBox = cc.Node.extend({ hit: null, model: null, ctor: function (placeholder, fontName, fontSize, BackgroundPath, model) { this._super(); this.model = model; this.initBackGround(BackgroundPath); this.initTextField(placeholder, fontName, fontSize); this.initLight(fontName, fontSize); this.addListener(); }, initTextField: function (placeholder, fontName, fontSize) { this.tf = new ccui.TextField(placeholder, fontName, fontSize); if (this.model && this.model == 1) { this.tf.setAnchorPoint(0, 1); } else { this.tf.setAnchorPoint(0, 0.5); } this.tf.setMaxLengthEnabled(true); this.tf.setTouchEnabled(false); this.addChild(this.tf); this.hit = placeholder; }, initBackGround: function (BackgroundPath) { this.backGround = new cc.Sprite(BackgroundPath); if (this.model && this.model == 1) { this.backGround.setAnchorPoint(0, 1); } else { this.backGround.setAnchorPoint(0, 0.5); } this.addChild(this.backGround); }, initLight: function (fontName, fontSize) { this.light = new cc.LabelTTF("|", fontName, fontSize); this.light.setColor(cc.color(0, 0, 0)); if (this.model && this.model == 1) { this.light.setAnchorPoint(0, 1); } else { this.light.setAnchorPoint(0, 0.5); } this.addChild(this.light); var seq = cc.sequence(cc.fadeIn(0.3), cc.delayTime(0.3), cc.fadeOut(0.3)); var forever = cc.repeatForever(seq); this.light.runAction(forever); this.hiddenLight(); }, setMaxLength: function (length) { this.tf.setMaxLengthEnabled(true); this.tf.setMaxLength(length); }, setTextColor: function (color) { this.tf.setTextColor(color); }, onTouchBegan: function (touch, event) { if (this.tf.isVisible()){ var pos = cc.p(touch.getLocationX(), touch.getLocationY()); var target = event.getCurrentTarget(); if (cc.rectContainsPoint(target.getBoundingBoxToWorld(), pos)) { setTimeout(function () { this.tf.getVirtualRenderer().attachWithIME(); }.bind(this), 0); this.showLight(); return true; } else { setTimeout(function () { this.tf.getVirtualRenderer().detachWithIME(); this.tf.setPlaceHolder(this.hit) }.bind(this), 0); this.hiddenLight(); return false; } } }, hiddenHit: function () { this.tf.setPlaceHolder("") }, setPasswordEnabled: function (enable) { this.tf.setPasswordEnabled(enable); }, setString: function (str) { this.tf.setString(str); }, getString: function () { return this.tf.getString(); }, setPos: function (width, height) { this.x = width; this.y = height; }, addListener: function () { // TextField 事件 this.tf.addEventListener(this.textFieldEvent, this); // 点击事件 cc.eventManager.addListener(cc.EventListener.create({ event: cc.EventListener.TOUCH_ONE_BY_ONE, onTouchBegan: this.onTouchBegan.bind(this) }), this.backGround); }, showLight: function () { this.light.setVisible(true); var sv = this.tf.getString(); if (!!sv && sv.length > 0) { this.light.setPositionX(this.tf.width - this.light.width * 0.5 + 1); } else { // 存在焦点 this.light.setPositionX(this.light.width * 0.5); this.hiddenHit(); } }, hiddenLight: function () { this.light.setVisible(false); }, setVisible:function (isTrue) { this._super(isTrue); this.tf.setVisible(isTrue); }, textFieldEvent: function (textField, type) { if (this.tf.isVisible()){ switch (type) { case ccui.TextField.EVENT_ATTACH_WITH_IME: this.showLight(); break; case ccui.TextField.EVENT_DETACH_WITH_IME: this.hiddenLight(); break; case ccui.TextField.EVENT_INSERT_TEXT: this.showLight(); break; case ccui.TextField.EVENT_DELETE_BACKWARD: this.showLight(); break; default: break; } } } })