• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コマンドボタンでショットカットキーを実行。)

コマンドボタンでショットカットキーを実行

このQ&Aのポイント
  • JavaScriptを使用して、コマンドボタンが押された際にショートカットキー「Ctrl+Z」を実行する方法を知りたい。
  • 特定のフォーム内のテキストデータをアンドゥするために、JavaScriptを使用してショートカットキー「Ctrl+Z」を実行する方法を教えてください。
  • コマンドボタンをクリックしたときに、特定のフォーム内のテキストデータをアンドゥする方法をJavaScriptで実装したい。具体的には、ショートカットキー「Ctrl+Z」を押すのと同じ効果を実現したい。

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

No.1です。ボタンを押してキーストロークを送信はそのままではだめですね。 ボタンを押した時点で、イベント発生元がTEXTAREAの外になります。 たぶん、event.srcElementはRead Onlyだろうから、 FOCUSを元に戻せば出来た。 <textarea id="t1" name="t1" cols=50 rows=10></textarea> <script type="text/javascript"> function undo(){ var wsh = new ActiveXObject("WScript.Shell"); document.getElementById("t1").focus(); wsh.SendKeys("^z"); wsh=null; } <script>

asakichi00
質問者

お礼

エラーの原因が分かりました!!! ブラウザ(ie)の設定でした。 [インターネットオプション]→[セキュリティ]タブ→[レベルのカスタマイズ(C)]ボタン で、 「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」 を、 「無効する」になっていたのを、「有効にする」に変更すると、 うまくいきました。 希望通り、コマンドボタンで<TEXAREA>のアンドゥが実現できました。 感動しました。 ありがとうございました。

asakichi00
質問者

補足

再度のご回答、ありがとうございます。 >var wsh = new ActiveXObject("WScript.Shell"); のところでエラーになるようです。 なぜでしょうか。 >document.getElementById("t1").focus(); だけにすると、正常に、<textarea>にフォーカスが移動するのですが。 何か設定の問題でしょうか。 お分かりになりましたら、ご教授くださいませ。

その他の回答 (2)

回答No.3

たまに、とうこしてみる。ぜんかくくうはくは、はんかくになおしてちょ! ださくなので、おれいはいらないじょ! ばぶぅ~ <!DOCTYPE html> <title></title> <body> <form id="frm1" action="#"> <div>  <TEXTAREA name="t1" id="t1" cols="50" rows="10">文字を書いてね  </TEXTAREA><br>  <INPUT type="button" value="undo" name="b1" onclick="undo.textPop();" width="54" height="0" alt="アンドゥー"> </div> </form> <script type="text/javascript"> //@cc_on var TextUndo = function ( n ) {  this.n = n;  this.t = [];  this.t.push( n.value );  this.max = 10;  this.b = null; }; TextUndo.prototype.textPush = function ( ) {  if( this.b == this.n.value ) return;  this.t.push( this.b = this.n.value );  if( this.max < this.t.length ) this.t.shift(); }; TextUndo.prototype.textPop = function ( ) {  if( 0 < this.t.length ) this.n.value = this.t.pop(); }; TextUndo.Listener = function ( e ) {  var obj, n = e./*@if( @_jscript ) srcElement @else@*/ target /*@end@*/;  n.id && ( obj = this.memo[ n.id ] ) && obj.textPush(); }; TextUndo.create = function ( nid ) {  if( 'undefined' === typeof this.memo ) {   this.memo = [ ];   document./*@if( @_jscript ) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/    'keydown', function ( e ) { TextUndo.Listener( e ); }, false );  }  var n = document.getElementById( nid );  return ( n && /^TEXT$|^TEXTAREA$/.test( n.nodeName ) ) ?   this.memo[ nid ] = new TextUndo( n ): null; }; var undo = TextUndo.create( 't1' ); </script>

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

アンドゥのロジックは難しそうですね。どこかにネタがあるかなあ。 素人的に思いつくのは、 「TEXTAREAにフォーカスがある時、3秒間隔のタイムインターバルで、その内容を 取得して、前と変わっていたら配列にプッシュして、アンドゥボタンが押される度に 配列からポップして、TEXTAREAの内容をおきかえる」とか 単にボタンで「crtl+z」のキーストロークを送出するだけなら、Activexで簡単に 出来るけど、IEだけで、しかも無条件に動作させるには高度に信頼済のサイトに登録した ページだけです。

asakichi00
質問者

お礼

ご回答ありがとうございました。 >アンドゥのロジックは難しそうですね。 承知しました。 何か既定の手法があるのかと思っていましたが、 仕方ないですね。 再考してみます。

関連するQ&A