- ベストアンサー
コマンドボタンでショットカットキーを実行
- JavaScriptを使用して、コマンドボタンが押された際にショートカットキー「Ctrl+Z」を実行する方法を知りたい。
- 特定のフォーム内のテキストデータをアンドゥするために、JavaScriptを使用してショートカットキー「Ctrl+Z」を実行する方法を教えてください。
- コマンドボタンをクリックしたときに、特定のフォーム内のテキストデータをアンドゥする方法をJavaScriptで実装したい。具体的には、ショートカットキー「Ctrl+Z」を押すのと同じ効果を実現したい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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>
その他の回答 (2)
- babu_baboo
- ベストアンサー率51% (268/525)
たまに、とうこしてみる。ぜんかくくうはくは、はんかくになおしてちょ! ださくなので、おれいはいらないじょ! ばぶぅ~ <!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)
アンドゥのロジックは難しそうですね。どこかにネタがあるかなあ。 素人的に思いつくのは、 「TEXTAREAにフォーカスがある時、3秒間隔のタイムインターバルで、その内容を 取得して、前と変わっていたら配列にプッシュして、アンドゥボタンが押される度に 配列からポップして、TEXTAREAの内容をおきかえる」とか 単にボタンで「crtl+z」のキーストロークを送出するだけなら、Activexで簡単に 出来るけど、IEだけで、しかも無条件に動作させるには高度に信頼済のサイトに登録した ページだけです。
お礼
ご回答ありがとうございました。 >アンドゥのロジックは難しそうですね。 承知しました。 何か既定の手法があるのかと思っていましたが、 仕方ないですね。 再考してみます。
お礼
エラーの原因が分かりました!!! ブラウザ(ie)の設定でした。 [インターネットオプション]→[セキュリティ]タブ→[レベルのカスタマイズ(C)]ボタン で、 「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」 を、 「無効する」になっていたのを、「有効にする」に変更すると、 うまくいきました。 希望通り、コマンドボタンで<TEXAREA>のアンドゥが実現できました。 感動しました。 ありがとうございました。
補足
再度のご回答、ありがとうございます。 >var wsh = new ActiveXObject("WScript.Shell"); のところでエラーになるようです。 なぜでしょうか。 >document.getElementById("t1").focus(); だけにすると、正常に、<textarea>にフォーカスが移動するのですが。 何か設定の問題でしょうか。 お分かりになりましたら、ご教授くださいませ。