dポイントプレゼントキャンペーン実施中!

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


<form name="frm1" method="POST" action="・・・">
<TEXTAREA name="t1" cols=50 rows=10></TEXTAREA>
<INPUT type="button" value="undo" name="b1" onclick="undo();" width="54" height="0" alt="アンドゥー">

</form>

↑このフォームで、「undo」ボタンが押されたときに、
<TEXTAREA></TEXTAREA>内のデータをアンドゥ、
つまり、ショットカットの「crtl+z」を実行するようにしたいのですが、
行き詰っております。
javascriptで実現したいと考えているのですが、
分かる方おられましたらご教授願えませんでしょうか。
よろしくお願いします。

A 回答 (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>

この回答への補足

再度のご回答、ありがとうございます。

>var wsh = new ActiveXObject("WScript.Shell");

のところでエラーになるようです。
なぜでしょうか。

>document.getElementById("t1").focus();
だけにすると、正常に、<textarea>にフォーカスが移動するのですが。
何か設定の問題でしょうか。
お分かりになりましたら、ご教授くださいませ。

補足日時:2010/05/28 14:59
    • good
    • 0
この回答へのお礼

エラーの原因が分かりました!!!
ブラウザ(ie)の設定でした。

[インターネットオプション]→[セキュリティ]タブ→[レベルのカスタマイズ(C)]ボタン
で、
「スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行」
を、
「無効する」になっていたのを、「有効にする」に変更すると、
うまくいきました。

希望通り、コマンドボタンで<TEXAREA>のアンドゥが実現できました。
感動しました。
ありがとうございました。

お礼日時:2010/05/28 15:22

たまに、とうこしてみる。

ぜんかくくうはくは、はんかくになおしてちょ!
ださくなので、おれいはいらないじょ! ばぶぅ~

<!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>
    • good
    • 0

アンドゥのロジックは難しそうですね。

どこかにネタがあるかなあ。
素人的に思いつくのは、
「TEXTAREAにフォーカスがある時、3秒間隔のタイムインターバルで、その内容を
取得して、前と変わっていたら配列にプッシュして、アンドゥボタンが押される度に
配列からポップして、TEXTAREAの内容をおきかえる」とか

単にボタンで「crtl+z」のキーストロークを送出するだけなら、Activexで簡単に
出来るけど、IEだけで、しかも無条件に動作させるには高度に信頼済のサイトに登録した
ページだけです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

>アンドゥのロジックは難しそうですね。

承知しました。
何か既定の手法があるのかと思っていましたが、
仕方ないですね。
再考してみます。

お礼日時:2010/05/28 14:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!