ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript カスタム テキスト ボックス カーソルのコードの詳細

JavaScript カスタム テキスト ボックス カーソルのコードの詳細

黄舟
黄舟オリジナル
2017-03-23 14:42:261471ブラウズ

この記事では、テキストボックスカーソルをカスタマイズするための参考値となるJavaScriptメソッドの例を中心に紹介します。以下のエディターで見てみましょう

テキストボックス(入力またはテキストエリア)のカーソルはスタイルで変更できません(カラーによるカーソルの色の変更を除く)。しかし、著者は、個人が独自の Web サイトを作成するときに、テキスト ボックス内のカーソルが独自のスタイルになることを望んでいます。したがって、テキスト ボックスのカーソルをシミュレートして、独自のスタイルでカーソルをデザインしてみてください。以下は作者の個人的な感想です。

【************************基本的な考え方******************** **** *******】

キーボード操作において、カーソルの基本操作は左矢印、右矢印、バックスペースキー(バックスペース)の最も基本的な3つのキーに他なりません。

左矢印: カーソルを左に移動し、文字を追加または文字を削除します

右矢印: カーソルを右に移動し、文字を追加または文字を削除します

Backspaceキー: 文字の削除

【******** JS を通してカーソルの基本機能を実装する方法について話すとき、最初にいくつかの html と css を紹介しましょう ********]

***html***

<p class="cursor_module">
  <p class="cursor_content"></p><span class="cursor"></span>
</p>

注: 上記の HTML 形式はカーソルのみをシミュレートしており、文字の入力 には引き続きフォーム要素が必要です。ページでは、作成者は実際のフォーム要素を非表示にし、カーソルをシミュレートする HTML のみを表示します

<form id="chatting_form" class="clearfix" enctype="application/x-www-form-urlencoded">
    <label for="chatting_msg"></label><input type="text" id="chatting_msg" autofocus name="chatting_msg">
 </form>

1 行目: シミュレートされたカーソル 2 行目: フォーム要素内のカーソル

***CSS* * *

.cursor_module{
  position: relative;
}
.cursor_content{
  position: absolute;
  top: 0;
  left: 0;
  width: auto;
  max-width: 90%;
  word-wrap: break-word;
  overflow: hidden;
  display: inline-block;
  white-space: pre;
}
.cursor{
  position: absolute;
  top: 0;
  left: 0;
  width: 6px;
  height: 16px;
  display: inline-block;
  background: green;
  z-index: 1000;
}

【******************************* JSを正式に導入開始********* * **********************]

**左矢印**

1 テキストが入力されていない場合は、左矢印を押します。 、カーソルはまだ左の値が 0 の位置にあります。

2. テキストを入力した後 (つまり、テキスト ボックスの値が空でない場合)、左矢印を押すと、カーソルが左に移動します。

制限事項: 左の値が 0 の位置に移動する場合、左矢印を押し続けても、カーソルは左に移動し続けません [カーソルは左の値が 0 より大きい場合にのみ移動できます。 0]

if(cCode===37 && chatting_msg.value!=&#39;&#39;){
   if(aSpan_l>0){
      aSpan.style.left=aSpan_l-aSpan_w+&#39;px&#39;;
   }
}

**右矢印**

1. テキスト入力がない場合は、右矢印を押します。カーソルは左側の値が 0 の位置にあります。

2. テキストを入力したら、右矢印を押してカーソルを右に移動します。

制限事項: テキストコンテンツの最後の文字の後ろに移動する場合、右矢印を押し続けても、カーソルは右に移動し続けません[カーソルの左の値が文字の幅と等しい場合] p要素、カーソルは最後の文字の位置にあります】

else if(cCode===39 && chatting_msg.value!=&#39;&#39;){
  aSpan.style.left=aSpan_l+aSpan_w+&#39;px&#39;;
    if(aSpan_l===aP_width){
       aSpan.style.left=aP_width+&#39;px&#39;;
     }
}

**Backspace**

1. 文字が存在しない場合、deleteキーを押すと、シミュレートされたカーソルは左に移動せずに残ります。元の位置で

2. 文字を削除すると、カーソルの位置が 1 単位左に移動します (この例では 6 ピクセル)。作成者は入力ボックスの値を変更しましたか? p 要素の innerHTML に値を割り当てるコード行 [aP.innerHTML=chatting_msg.value;] がキーアップ

イベント処理

プログラムに配置されていますか? イベントがkeydown(またはkeypress)の場合、p要素のinnerHTMLにテキストボックスの値が代入されますが、実際には「ab」の2文字を入力するとp内に表示される内容が変わります。要素は最初の文字「a」のみです。

簡単に言うと、テキストボックス内に文字を表示すること自体は、キーダウンやキープレスで問題なく表示されますが、テキストの内容がp要素に表示される場合は、「反応してください」「ゆっくりしてください。」 【ヒント: 作者はその他の文字キー以外の処理を行っていません】

【************************* ***補足* *****************************】

1.バックスペースキーを押したとき 位置決め、バックスペースキーを押したときに「移動」機能をキャンセルする必要があります

-------JM.removeHandler(chatting_msg,'input',move,false);

2、コード内に存在するJM.xxxxは作者のコードベースです JM.addHandler(...): イベントハンドラーを追加

JM.removeHandler(...): イベントハンドラーを削除 JM。 getStyle( ...): コンピューターのスタイルの値を取得します

    >>>>>>>>>>>具体的代码可以参考《Javascript高级程序设计》这本书

3、笔者自定义的这个光标现在只适合于输入英文、数字、标点符号,暂时不支持输入中文

《《《《《《《    完整代码    》》》》》》》》》

var Cursor=(function () {
  var chatting_msg=JM.getEles(&#39;[name=\&#39;chatting_msg\&#39;]&#39;)[0];
  var cursor_module=JM.getEles(&#39;.cursor_module&#39;)[0];
  var chatting_footer=JM.getEles(&#39;.chatting_footer&#39;)[0];
  //create elements
  var cP=document.createElement(&#39;p&#39;);
  var cSpan=document.createElement(&#39;span&#39;);
  JM.addClass(cP,&#39;cursor_content&#39;);
  JM.addClass(cSpan,&#39;cursor&#39;);
  JM.addNodes(cursor_module,cSpan);
  JM.addNodes(cursor_module,cP);
  //keydown
  JM.addHandler(chatting_msg,&#39;keydown&#39;,function (event) {
    var ev=JM.getEvent(event),
      cCode=JM.getCharCode(ev);
    var aP=JM.getEles(&#39;.cursor_content&#39;)[0],
      aSpan=JM.getEles(&#39;.cursor&#39;)[0];
    var aP_width=parseInt(JM.getStyle(aP,&#39;width&#39;));//get aP real width
    var aSpan_l=parseInt(JM.getStyle(aSpan,&#39;left&#39;)),//get span left
      aSpan_w=parseInt(JM.getStyle(aSpan,&#39;width&#39;));//get span width
    var val=chatting_msg.value;
    //left arrow
    //没有value值,按左箭头不动
    //有value值,按右箭头,光标向左移,但移到前面一个字符的后面就不可以再移动
    if(cCode===37 && chatting_msg.value!=&#39;&#39;){
      if(aSpan_l>0){
        aSpan.style.left=aSpan_l-aSpan_w+&#39;px&#39;; 
      }
    }
    //right arrow
    //没有value值,按右箭头不动
    //有value值,按右箭头,光标向右移,但移到最后一个字符的后面就不可以再移动
    else if(cCode===39 && chatting_msg.value!=&#39;&#39;){
      aSpan.style.left=aSpan_l+aSpan_w+&#39;px&#39;;
      if(aSpan_l===aP_width){
        aSpan.style.left=aP_width+&#39;px&#39;;
      }
    }
    //backspace
    else if(cCode===8){
      if(chatting_msg.value!=&#39;&#39;){
        aP.innerHTML=chatting_msg.value;
        if(aSpan_l!=0){
          aSpan.style.left=aSpan_l-aSpan_w+&#39;px&#39;;
        }
      }else{
        aSpan.style.left=0;
      }
      //if enter backspace,remove move event
      JM.removeHandler(chatting_msg,&#39;input&#39;,move,false);
    }
    else{
      //show value by keyup not keydown,because keydown will slow step;
      JM.addHandler(chatting_msg,&#39;keyup&#39;,function () {
        aP.innerHTML=chatting_msg.value;
      },false);
      JM.addHandler(chatting_msg,&#39;input&#39;,move,false);
    }
  },false);
  //move cursor in the text
  var move=function () {
    var aSpan=JM.getEles(&#39;.cursor&#39;)[0],
      aSpan_l=parseInt(JM.getStyle(aSpan,&#39;left&#39;)),
      aSpan_w=parseInt(JM.getStyle(aSpan,&#39;width&#39;));
    aSpan.style.left=aSpan_l+aSpan_w+&#39;px&#39;;
  };
})();

以上がJavaScript カスタム テキスト ボックス カーソルのコードの詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。