SendKeys()が一番最後に実行されてしまう。

このQ&Aのポイント
  • コマンドボタンをクリックすることで、<textarea>に文字を自動入力する際、SendKeys()を使用して改行をさせたいが、全ての文字がセットされた後にまとめて改行される現象が発生している。
  • 解決策について行き詰っており、この問題を解決する方法を教えていただきたい。
  • よろしくお願いします。
回答を見る
  • ベストアンサー

SendKeys()が一番最後に実行されてしまう。

SendKeys()が一番最後に実行されてしまう。 コマンドボタン(<input type="button onclick="jidou();">)をクリックすることで、 <form>内の<textarea>に、連続して文字を自動入力させようとしています。 このとき、挿入する文字の途中に、何度かSendKeys("{ENTER}")を挟んで改行をさせているのですが、なぜか、全ての文字がセットされたあとで、最後にまとめて、改行(SendKeys("{ENTER}"))されてしまいます。 解決に行き詰っています。どなたかご存知の方、ご教授願えないでしょうか。 よろしくお願いします。 function jidou() {   :  (文字挿入)   : var wsh = new ActiveXObject("WScript.Shell"); document.getElementById("textarea1").focus(); wsh.SendKeys("{ENTER}"); wsh=null;   :  (文字挿入)   : }

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.8

単純に・・・ ボタンを押したらtextareaに改行入りの定型文を挿入したいってこと? <script type="text/javascript"> function insText(id,text){ var T=document.getElementById(id); T.focus(); if(window.getSelection) { var pos = T.selectionStart; var t1 = T.value.substring(0,pos); var t2 = T.value.substring(pos); T.value = t1 + text + t2; } else { var s = document.selection.createRange(); s.text = text; } } </script> <p> <input type="button" value="あ行" onclick="insText('hoge','あ\nい\nう\nえ\nお')"> <input type="button" value="か行" onclick="insText('hoge','か\nき\nく\nけ\nこ')"> </p> <p> <textarea id="hoge" cols="40" rows="10"></textarea> </p>

asakichi00
質問者

補足

ご回答ありがとうございます。 >ボタンを押したらtextareaに改行入りの定型文を挿入したいってこと? ご指摘の通りです。言葉足らずで大変失礼しました。 そして、steel_gray様のご回答に従い、コーディングしましたら、 無事うまくいきました。 大変勉強になりました。ありがとうございました。

その他の回答 (7)

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

あ~あ  否定の先読み(!パターン)  肯定の先読み(=パターン)  グループ化のみ(?パターン) の3つはjavascriptでも使えるんですね。 先週気づいてたら、別のやつにも使えたのに...残念

asakichi00
質問者

補足

yyr446様、think49様、ご回答、誠にありがとうございます。 また、ご連絡が遅れましたことをお詫び申し上げます。 御二方のご回答ともに、 <textarea>内にすでに文字が入力されている状態で、その中の特定の文字の後ろを改行させるやりかたですね。 やはり、yyr446様のご回答のとおり、 >ブラウザーがjavascriptの1ステートメント実行中に、外から割り込んでも、 >そのステートメントが終わるまでは、受け付けられません。 ということで、途中でSendKeysを実行できないのですね。 そして、別の方法として、一旦、<textarea>に文字を入力して、そのあとに改行させるというやり方になるわけでしょうか。 しかし、その場合、同じ文字でも改行させてたくない場合でも、改行されるということでしょうね。 解決策としては、このあたりなのでしょうね。 私と希望としては、1つのボタンクリックで 文字入力+改行+文字入力+改行+文字入力+・・・ を一気に入力したかったのですが、今回はこの方法はあきらめ、お二方のご回答を参考にして対応します。 しかしながら、皆様のご回答には大変勉強になりました。 本当にありがとうございました。

  • think49
  • ベストアンサー率59% (285/482)
回答No.6

ちょっとは入り込みにくい雰囲気ですが、書きだしたい欲求には勝てませんでした…。(苦笑) (全角空白は半角空白に置換してください) ------ <script type="text/javascript"><!-- function add_Kaigyo(event, targetId, search){  var button = event.target || event.srcElement;  var doc = button.ownerDocument;  var target = doc.getElementById(targetId); // target.value = target.value.split(search).join(search+"\n");  target.value = target.value.replace(new RegExp(search+"(?!\n)", 'g'), search+"\n"); } //--></script> </head> <body> <form>  <p><textarea id="hoge" cols="80" rows="30">foo test hoge test hello test</textarea></p>  <p><input type="button" value="改行を挿入する" onclick="add_Kaigyo(event, 'hoge', 'test');"></p> </form> ------ "test\n" を置換対象から除外したいなら、このまま。 そうでないなら、コメントアウトしたコードにすればOKです。

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

というわけで、 後からの処理になりますが、任意の<textarea>内の任意の文字の後ろに「改行」を セットする関数を作りました。  ※コードの全角空白は半角空白にかえて下さい。 function add_Kaigyo(target,search){  var Regexp = new RegExp("");  Regexp.compile(search,"g");  var target_str=target.value;  var new_str=target_str.replace(Regexp,function(){    if(RegExp.rightContext.charAt(0)!="\n")    return arguments[0]+'\n';    else return arguments[0];  });  Regexp = null;  target.value=new_str; } 使い方の例、 <textarea id="hoge" cols="80" rows="30"></textarea> を対象として、「。」の後ろで改行を挿入したい場合、  var search="。"; // <=正規表現パターンでも指定可能!  var target=document.getElementById("hoge");  add_Kaigyo(target,search); と使えます。

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

No1.2.3の回答者です。 「Sendkeysコマンドは一番最後に実行されてしまうのを解決したい」です。 ==> 肝心な事を書き忘れてました。 ブラウザーがjavascriptの1ステートメント実行中に、外から割り込んでも、 そのステートメントが終わるまでは、受け付けられません。OSレベルで フォースすれば止まらなくはないですが、ブラウザー強制終了という事になります。 よって、別案を提示しようとしている次第です。

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

「   :  (文字挿入)   : 」 部分のコードを少しでも書いてください。でないと意味が解りません。 「コマンドボタン(<input type="button onclick="jidou();">)をクリックすることで、 <form>内の<textarea>に、連続して文字を自動入力させようとしています。」 と矛盾してませんか。自動入力ってだれがするのですか、全部キーストローク送出で 自動入力させてるのですか? 補足: ベストアンサー下さいね!

asakichi00
質問者

補足

再三のご回答ありがとうございます。 >部分のコードを少しでも書いてください。 たとえば、 selection.text = "あああ"; 理解不足で大変申し訳ございませんが、 >矛盾してませんか。 の意味がわかっていません。教えていただけませんか。 >だれがするのですか この<textarea>に入力する人、つまり、システム利用者です。 >全部キーストローク送出で自動入力させてるのですか? 手入力もあります。定型的な部分をボタンで一括入力させたいのです。 >ベストアンサー下さいね! 期待しております。

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

「function idou()の中で"\n"を挿入しては」 という意味なんですが.. function jidou() {   :  (文字挿入)   :  ("\n"挿入)   :  (文字挿入)   : }

asakichi00
質問者

補足

「入力者は改行に”¥n”を入力しない」 の意味は、 「ああああ¥nいいい¥nううう・・・・」 なお、質問の主旨は、 「Sendkeysコマンドは一番最後に実行されてしまうのを解決したい」です。 よろしくお願いします。

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

何故Enterのキーストロークを送出する必要があるのか わかりません。 改行させたいなら、”¥n”を入れるだけだと思うんですが...

asakichi00
質問者

補足

>何故Enterのキーストロークを送出する必要があるのか >わかりません。 >改行させたいなら、”¥n”を入れるだけだと思うんですが... 質問にも書きましたが、<testarea>へ書き込むからです。 入力者は、改行するたびに、”¥n”を入力しないと思われます。 それだけのことです。 よろしくお願いします。

関連するQ&A

  • WSH動作しない!!(WScript.SleepとSendKeys?)

    WSHが動作しなくて困っています。 動作するコードとしないコードは次のとおりです。 いずれも@ITに掲載されているサンプルコードをそのままです。 動作しないコードについても,notepadの起動まではできます。 どうやら,sleepとsendkeysが動いてくれないようです。 <正常に動作するコード> Set objShell = WScript.CreateObject("WScript.Shell") WScript.Echo "メモ帳を起動します。" objShell.Run "notepad.exe" http://www.atmarkit.co.jp/fwin2k/operation/wsh03/wsh03_02.html <動作しないコード> Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "notepad.exe" WScript.Sleep 1000 objShell.SendKeys "hello" http://www.atmarkit.co.jp/fwin2k/operation/wsh05/wsh05_04.html ■動作環境 Win XP Pro IE 6.0 ちなみに,WSHファイルに対する実行権限はあります(フルコントロールです)。 以上なのですが,何か点検するべき事項などありましたらご教示ください。

  • Mac(Safari)でのSendkyesコマンドで、コマンドキーの使

    Mac(Safari)でのSendkyesコマンドで、コマンドキーの使いたい。 ブラウザのSafariで、「ページの再読み込み」を コマンドボタン(<input type="button")で行いたいのですが、 「javascript:location.reload()」を使わずに、 以下のような感じで、「ページの再読み込み」のショートカットキーの 「コマンドキー+r」を使おうとしているのですが、うまくいきません。 (location.reloadを使うと、postで送信されているデータが受け取れなかったので) ↓============================= <input name="cancel" type="button" value="元に戻す" onclick="sai_yomikomi();"> <script language="JavaScript"> <!-- function sai_yomikomi(){ var wsh = new ActiveXObject("WScript.Shell"); wsh.SendKeys("^r"); wsh=null; } // --> </script> ↑============================= よろしくお願いします。 あるいは、Windowsの「F5」キーに相当するキーはないのでしょうか。 併せてよろしくお願いします。

  • あるページを開いた際、常にそのページの一番下まで改ページする。

    あるページを開いた際、常にそのページの一番下まで改ページする。 お世話になっております。 <script language="JavaScript"> <!-- var wsh = new ActiveXObject("WScript.Shell"); wsh.SendKeys("{END}"); wsh=null; // --> </script> のような感じで、 あるページを開いた際に、常にそのページの最下部を表示させたいのですが、 うまくいきません。 どうかご教授ください。よろしくお願いします。  

  • Sendkeysのタイミング

    2日前に"sendkeysとfindwindow"というタイトルで質問した者です。 まだ解決できなくてまだ困っています。 内容は、  今、MSDEをアンインストールするプログラムを組んでます。  IsUn0411.exeをshell関数の引数にして、起動させると  途中いくつかメッセージが出てきます。  ユーザーには触らせたくないので、  これらのメッセージを全てFindWindowで探して、  SendKeysでキーを飛ばしました。  アンインストール自体は出来るのですが、問題は  最後の”コンピュータからプログラムの削除”という画面です。  これも同じくFindWindowで探すことはできるのですが、  最後SendKeysでキー("{ENTER}")を飛ばしても消えてくれなくて困っています(>_<)。 というもので、なぜメッセージが消えないのか原因が分かりました。 SendKeys関数で"{ENTER}"キーを送信してはいるのですが、 問題はタイミングでした。 ”コンピュータからプログラムの削除”というウィンドウがアンインストール中に すでに出ているため、"{ENTER}"キーを飛ばしてしまいメッセージが消えない・・・ということでした。 そこで、再び質問です。 アンインストールが終了して、OKボタンが有効になったときに"{ENTER}"キーを 送りたいのですが、何か良い方法はありませんか? 私が思いつくのはGetCodeExitProcssしかありません。 これだと完全にexeが終了した場合に使うものなので、 まだメッセージが残っているときは使えませんよね・・・。 では、よろしくお願いします。

  • 特定のフォルダを階層下まで表示を変えたい

    ほかのカテゴリで質問したのですが回答がありませんでした。 すべてのフォルダではなく、ある特定のフォルダの表示だけを階層下まで「詳細」に変更したいのです。 すべてのフォルダですとWindowsの処理で可能ですし、階層下までをしなくてもいいのなら、WSHで下のように書いて、その中へフォルダをドラッグしたらできました。 '----------------------------------------------------- Set objShell = WScript.CreateObject("WScript.Shell") objShell.SendKeys "{ENTER}" WScript.Sleep 200 objShell.SendKeys "%V" WScript.Sleep 200 objShell.SendKeys "^D" WScript.Sleep 200 objShell.SendKeys "%{f4}" '---------------------------------------- どなたか、階層下まで同じ処理をする方法か、それともそのような処理ができるフリーソフトをご存知ないでしょうか?

  • findwindowとsendkeys

     今、MSDEをアンインストールするプログラムを組んでます。  IsUn0411.exeをshell関数の引数にして、起動させると  途中いくつかメッセージが出てきます。  ユーザーには触らせたくないので、  これらのメッセージを全てFindWindowで探して、  SendKeysでキーを飛ばしました。  アンインストール自体は出来るのですが、問題は  最後の”コンピュータからプログラムの削除”という画面です。  これも同じくFindWindowで探すことはできるのですが、  最後SendKeysでキー("{ENTER}")を飛ばしても消えてくれなくて困っています(>_<)。  ネットで色々なページを検索して探してはいるのですが、  参考になるところが見つからなくて・・・。  すみませんが、どなたか良いやり方をご存じの方、教えてください。  よろしくお願いします。

  • VBSのSendKeysでクリックができない

    音声認識アプリケーションからvbsを実行できるのですが、ここで一度だけマウスクリックしたい状況が出てきて困っています。 Dim WSHShell As Object Set WSHShell = CreateObject("Wscript.Shell") WSHShell.AppActivate "操作したいアプリケーション名" WSHShell.SendKeys "{TAB}" 'OK WSHShell.SendKeys "{ENTER}" 'OK WSHShell.SendKeys "{CLICK LEFT, 10, 10}" 'NG TABキーやENTERキーは動作するのですが、3番目のマウスクリックがExceptionといわれエラーになってしまいます。Sendkeysでマウスクリックを送信するにはどうしたらよいのでしょうか?ネットで調べたリファレンスだと上記のような書き方で良さそうなのですが・・・ 音声認識アプリケーションはドラゴンスピーチ11Jで、OSはWin 7 ProとWin 8、どちらも64ビットです。

  • キー操作 (WSH:コピー&ペースト)

    ホームページ上のデータをクリップボードに取り込んで メモ帳に写したいです。 キー操作でのコピー&ペーストがうまくいきません。 どこがいけないのでしょうか(WSHを使ってます)。 set WshShell = WScript.CreateObject("WScript.Shell") WshShell.SendKeys "^A" '「Ctrl」を押しながら「A」を押す WshShell.SendKeys "^C" '「Ctrl」を押しながら「C」を押す WSHShell.Run "notepad.exe" 'メモ帳を開く WshShell.SendKeys "^V" '「Ctrl」を押しながら「V」を押す よろしくお願いします。

  • WSHで自動化ソフトを作りたいけど、エクセルとの連携、エラー防止はどうすれば?

    以下の業務を自動をするために、WSHでプログラムを作っていますが、4点困っていることがあります。 ●●●業務内容●●● 1、業務のメールボックスをactivateする。 2、sendkeys("{Enter}")を使って、メールを開く。 3、AlTからEditツールのEDIT、を選択し、メールを編集状態にする。 4、CTRL+Fで、文字列検索。(「発表日」を検索します。) 5、「発表日」の下に発表される日時が8桁で表示されているので、sendkeysを使い、コピー。 6、業務に使うエクセルファイルをactivateする。 ■■ここでVBAを使いたいのですが、WSH内のプラグラム内で、VBAを入力することは可能でしょうか?■■ 7、エクセルファイルを開いたら、発表日がある列の空白セルのひとつにペースト。(上のセルから順にペーストしていくので、 i=1 activate.cells(F,i) i=i=1 do while i=10のようにコマンドするつもりです。) 8、業務のメールボックスを再びActivateする。 ■■(業務のメールボックスは新しいメールをタブでふぴじする仕組みになっているので、どうのようにActivateすればいいか困っています。)■■ 9、開いてあるメールを閉じる。(Sendkeysで閉じる予定です)(これから処理する全てのメールを開いたまま、プログラムを実行すれば、確実にエラーが起きるような数のメールなので。) 10、メールボックスに戻るので、{down}と{enter}で次のメールを開く。 繰り返し。 ●●●困っていること●●● 1、sendkeysをなるべく使わずに実行したい。 sendkeysでは、たとえば他のプラグラム(セキュリティーソフトなど)が実行された場合でも、そのまま実行され続けるので、リスクが大きい。 2、仮に1で書いたような事態が起きた場合、プログラムを自動的に停止するようにしたいが、どのやってコンピューターにエラーが起きていると判断させるかわからない(違うメールやプログラムを開いている場合に呈する等)。 3、エクセルと連携させて、Sendkeysを減らしたい。 4、繰り返し処理はこの場合、どうやって命令するのか。 ●●●今のコード●●● var WShell = WScript.CreateObject("WScript.Shell"); WShell.AppActivate("業務に使うメールソフト(別のウィンドウに開いてある必要があります)"); WShell.Sendkeys("{ENter}"); WScript.sleep(100); WShell.sendkeys("%"); WScript.sleep(100); WShell.sendkeys("a"); WScript.sleep(100); WShell.sendkeys("d"); WScript.sleep(100); WShell.sendkeys("^F"); WScript.sleep(100); WShell.sendkeys("検索したい文字列"); WScript.sleep(100); WShell.sendkeys("{ESC}"); WShell.sendkeys("{DOWN}"); WScript.sleep(100); WShell.sendkeys("+{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}"); WScript.sleep(100); WShell.sendkeys("^c") WScript.sleep(100); WShell.AppActivate("EXCEL"); WScript.sleep(10000); WShell.sendkeys("セルまで移動") WShell.sendkeys("^V"); WShell.AppActivate("業務に使うメールソフト"); WShell.sendkeys("%"); WShell.sendkeys("w"); WShell.sendkeys("window がある番号"); WShell.sendkeys("%"); WShell.sendkeys("^W"); WShell.sendkeys("{DOWN}"); WScript.Echo "作業が完了しました。"

  • WSHスクリプトでブラウザ更新

    教えてください。 WSHスクリプトでブラウザの更新をF5ではなくてControl + Rしたいのです。 Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Sleep 2000 WshShell.AppActivate "テスト" WScript.Sleep 2000 WshShell.SendKeys "^R" WScript.Sleep 2000 WScript.Echo "終了" 最初の一回目の実行時はできるのですが、それ以降更新してくれません。 よろしくお願いいたします。