奇怪的问题,请问onclick和onkeydown的区别
请运行下面的代码:
我为textarea写了两和事件,一个是onclick事件,当你点击textarea的时候会alert一个string出来。第二个事件是onkeydown,和onclick事件调的同一个方法,但是就是出不来string,有谁写过关于teatarea的得到光标位置的代码。帮我看看!
源码如下,只要新建一个html文件,复制源码运行查看效果!
<html>
<head>
<title>textarea.jsp</title>
<script type="text/javascript">
function tellPoint() {
var rng = event.srcElement.createTextRange();
rng.moveToPoint(event.x, event.y);
rng.moveStart("character", -event.srcElement.value.length);
return rng.text.length;   
}
function getString(){
var poin=tellPoint();
var str = textarea.value.substring(0,poin);
var indexstr = new Array();
indexstr[0]=' ';
indexstr[1]='.';
indexstr[2]='{';
indexstr[3]='}';
indexstr[4]='(';
indexstr[5]=')';
indexstr[6]=';';
indexstr[7]='&&';
indexstr[8]='&';
indexstr[9]='=';
indexstr[10]='!';
indexstr[11]='||';
indexstr[12]='|';
indexstr[13]='>';
indexstr[14]='<';
indexstr[15]='+';
indexstr[16]='-';
indexstr[17]='*';
indexstr[18]='/';
indexstr[19]='%';
indexstr[20]='^';
indexstr[21]='?';
indexstr[22]=',';
var index = new Array();
maxindex = -1;
for(var i = 0 ; i<indexstr.length;i++){
index[i] = str.lastIndexOf(indexstr[i]);
if(index[i]>maxindex){
maxindex = index[i];
}
}
//alert(maxindex);
return str.substring(maxindex+1);
}
function oc(){
alert(getString());
}
function dk(){
var str = getString();
if (event.ctrlKey && event.keyCode=='13') {
alert(str);
}
}

</script>
</head><body>
<textarea rows="50" cols="50" id="textarea" onclick="oc();" onkeydown="dk();" >
public class A{
  private String name = 'asdf';
}
    </textarea>
光标位置:
<input type="text" value="0" id="pnum" size="8">
</body>
</html>

解决方案 »

  1.   

    function oc(){
    alert(getString());
    }
    function dk(){
    var str = getString();
    if (event.ctrlKey && event.keyCode=='13') {
    alert(str);
    }
    }这两个方法中。oc是给onclick调用的。
    dk是给onkeydown调用的;
    都是调用的getString()的方法;
    上面有关getString的业务逻辑可以不去细看,我想做的是一个IDE关键字提示的功能;你可能先用鼠标点击一个关键字,如,你点在public 的b后面,那么他会把pub提示出来;
    如果你用方向键移动到public的b后面,用快捷键Ctrl+Enter,却什么都出来不!我的本意是想用Ctrl+Enter快捷键代替鼠标点击的功能!
      

  2.   

    估计是这个导致
    if (event.ctrlKey && event.keyCode=='13')
      

  3.   

    function oc(){ 
    alert(getString()); 

    function dk(){ 
    var str = getString(); 
    if (event.ctrlKey && event.keyCode==13) { 
    alert(str); 


    event.keyCode 不是字符串是码
      

  4.   

    那是因为按住ctrl键,alert将会失效,你可以试试按住ctrl点击文本框,一样没有提示的。
      

  5.   

    解决了./**
    anthor:doublej
    得到文本域的操作实利;
    */
    function TextareaClass(obj) {
    this.obj = obj;
    //java中的边界符
    this.indexstr = new Array();
    //java中的关键字
    this.keylist = new Array();
    //光标的X
    this.x = 0;
    //光标的Y
    this.y = 0;
    //文本内的光标位置[用户关键字结束位置]
    this.len = -1;
    //用户关键字开始位置;
    this.maxindex = -1;
    this._init(obj);
    }
    /**
    初始化
    */
    TextareaClass.prototype._init = function (obj) {
    this.indexstr[0] = " ";
    this.indexstr[1] = ".";
    this.indexstr[2] = "{";
    this.indexstr[3] = "}";
    this.indexstr[4] = "(";
    this.indexstr[5] = ")";
    this.indexstr[6] = ";";
    this.indexstr[7] = "&&";
    this.indexstr[8] = "&";
    this.indexstr[9] = "=";
    this.indexstr[10] = "!";
    this.indexstr[11] = "||";
    this.indexstr[12] = "|";
    this.indexstr[13] = ">";
    this.indexstr[14] = "<";
    this.indexstr[15] = "+";
    this.indexstr[16] = "-";
    this.indexstr[17] = "*";
    this.indexstr[18] = "/";
    this.indexstr[19] = "%";
    this.indexstr[20] = "^";
    this.indexstr[21] = "?";
    this.indexstr[22] = ",";
    this.keylist[0] = "public";
    this.keylist[1] = "class";
    this.keylist[2] = "private";
    this.keylist[3] = "this";
    this.keylist[4] = "super";
    this.keylist[5] = "extend";
    this.keylist[6] = "inertface";
    this.keylist[7] = "String";
    this.keylist[8] = "int";
    this.keylist[9] = "float";
    this.keylist[10] = "double";
    this.keylist[11] = "byte";
    this.keylist[12] = "char";
    this.keylist[13] = "if";
    this.keylist[14] = "while";
    this.keylist[15] = "do";
    this.keylist[16] = "return";
    this.keylist[17] = "break";
    this.keylist[18] = "try";
    this.keylist[19] = "catch";
    this.keylist[20] = "abstract";
    this.keylist[21] = "case";
    this.keylist[22] = "continue";
    this.keylist[23] = "else";
    this.keylist[24] = "final";
    this.keylist[25] = "finally";
    this.keylist[26] = "implements";
    this.keylist[27] = "import";
    this.keylist[28] = "instanceof";
    this.keylist[29] = "long";
    this.keylist[30] = "protected";
    this.keylist[31] = "short";
    this.keylist[32] = "static";
    this.keylist[33] = "throw";
    this.keylist[34] = "throws";
    this.keylist[35] = "transient";
    this.keylist[36] = "void";
    this.keylist[37] = "enum";
    this.len = this._getpoint(obj);
    };
    /**
    得到当前光标的与文本的位置
    */
    TextareaClass.prototype._getpoint = function (obj) {
    var workRange = document.selection.createRange();
    obj.select();
    var allRange = document.selection.createRange();
    workRange.setEndPoint("StartToStart", allRange);
    var len = workRange.text.length;
    workRange.collapse(false);
    workRange.select();
    return len;
    };
    /**
    按下键盘事件
    */
    TextareaClass.prototype.onkeydown = function () {
    //Ctrl+Enter事件
    if (event.ctrlKey == true && event.keyCode == 17) {

    //移除
    if (document.all.mydiv != undefined) {
    document.all.mydiv.removeNode(true);

    //得到用户当前关键字
    var key = this._getkey();
    //通过用户当前关键字得到关键字集合
    var list = this._getkeys(key);
    if (list.length > 0) {
    var mydiv = document.createElement("div");
    mydiv.id = "mydiv";
    mydiv.className = "box";
    mydiv.style.position = "absolute";
    mydiv.style.width = 100;
    for (var i = 0; i < list.length; i++) {
    var myspan = document.createElement("span");
    myspan.className = "op";
    myspan.style.cursor = "hand";
    myspan.innerText = list[i];
    mydiv.appendChild(myspan);
    myspan.onclick = function () {
    var startstr = document.getElementById("demo").value.substring(0, this.maxindex);
    var endstr = document.getElementById("demo").value.substring(this.len);
    document.getElementById("demo").value = startstr + list[i] + endstr;
    //mydiv.style.position=
    };
    }
    mydiv.style.left = event.x;
    mydiv.style.top = event.y;
    document.body.appendChild(mydiv);
    }
    }
    };
    /**
    得到用户关键字
    */
    TextareaClass.prototype._getkey = function () {
    var context = this.obj.value;
    var index = new Array();
    for (var i = 0; i < this.indexstr.length; i++) {
    index[i] = context.lastIndexOf(this.indexstr[i]);
    if (index[i] > this.maxindex) {
    this.maxindex = index[i];
    }
    }
    return context.substring(this.maxindex + 1);
    };
    /**
    得到返回的关键字集合
    */
    TextareaClass.prototype._getkeys = function (key) {
    var keys = new Array();
    var k = 0;
    for (var i = 0; i < this.keylist.length; i++) {
    if (this.keylist[i].indexOf(key) == 0) {
    keys[k] = this.keylist[i];
    k++;
    }
    }
    return keys;
    };
      

  6.   

    onclick是鼠标点击,onkeydown是键盘敲击。。