質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1367閲覧

任意のイベント中に別のイベントを発火させたい

onushinosenzo

総合スコア22

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/08/29 03:27

編集2019/08/29 05:52

やりたいこと

疑似コピー機能として、ブラウザ上で文字列がselectされて、かつcmdキー+Cキーが押された時に、javascriptの変数に格納しようとしています。
添付したコードは以下のような動作をさせようとしています。

  1. selectイベントが起きたらselectされている文字列を変数”selectedText”に格納
  2. cmdキーとcキーのkeydownを確認したら、変数”copiedText”に”selectedText”を格納

現状

1,2共に単独だと動きますが、何か文字列をselectしていると2の動作ができません
何かイベントが行われている最中では、他のイベントは認識されないのでしょうか?
また解決策を教えていただきたいです。

普段はPythonを書いており、javascriptは初心者です。
OSはmacでブラウザはChromeです。
よろしくお願いいたします。

javascript

1window.addEventListener("select",selectText, false); 2window.addEventListener("keydown",pressFunction, false); 3window.addEventListener("keyup",releaseFunction, false); 4function selectText(){ 5 var selectedText = document.getSelection().toString(); 6 return selectedText 7} 8var keyStatus = {}; 9// キーを押されたら実行する処理 10function pressFunction(e,selectedText) 11{ 12 keyStatus[e.keyCode] = true; // 該当のキーコードをtrueにする 13 if(keyStatus[91] && keyStatus[67]) { // cmdとC両方trueなら 14 var copiedText = selectedText; 15 } 16} 17// キーが離されたら実行する処理 18function releaseFunction(e) 19{ 20 keyStatus[e.keyCode] = false; // 該当のキーコードをfalseにする 21}

追記

javascript

1 var keyStatus = {}; 2 var listener = {selectedText: '', handleEvent: function handleEvent (e) { 3 // e.preventDefault(); 4 switch(e.type){ 5 case "select": 6 var selectedText = document.getSelection().toString(); 7 console.log(selectedText); 8 break; 9 10 case "keydown": 11 keyStatus[e.keyCode] = true; // 該当のキーコードをtrueにする 12 console.log(e.keyCode); 13 if(keyStatus[91] && keyStatus[67]) { // cmdとC両方trueなら 14 console.log(selectedText); 15 var copiedText = selectedText; 16 console.log(copiedText); 17 } 18 break; 19 case "keyup": 20 keyStatus[e.keyCode] = false; 21 break; 22 } 23 }};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

リスナー間で値を共有するなら、addEventListenerの第二引数に「handleEvent プロパティを持つlistenerオブジェクト」を指定し、event.type で分岐処理すると良いも思います。
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener#The_event_listener_callback

JavaScript

1var listener = {selectedText: '', handleEvent: function handleEvent () {}}; 2 3window.addEventListener('select', listener, false); 4window.addEventListener('keydown', listener, false); 5window.addEventListener('keyup', listener, false);

Re: onushinosenzo さん

投稿2019/08/29 03:59

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onushinosenzo

2019/08/29 05:52 編集

ご回答ありがとうございます。追記に追加したコードのように書き直したのですが、いまだに文字列select中にkeydownがキャッチできず、またselectedTextも共有できていないようなのですが、どこが間違えているか教えて頂けないでしょうか?
think49

2019/08/29 10:33

> var selectedText = document.getSelection().toString(); ローカル変数は関数呼び出し完了時にクリアされます。 関数の外側にあるオブジェクト(listener)を this で参照して下さい。 何のために、listener.selectedText を定義したのかを考えてみて下さい。
guest

0

var selectedText;を関数の外側に置かないと、ほかの関数から参照できません。

投稿2019/08/29 03:32

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onushinosenzo

2019/08/29 06:09

ご回答ありがとうございます。追記に追加したコードのように書き直したのですが、いまだに文字列select中にkeydownがキャッチできず、またselectedTextも共有できていないようなのですが、どこが間違えているか教えて頂けないでしょうか?
kei344

2019/08/29 08:39

handleEvent でどう扱うかはわかりませんが、少なくとも var selectedTextと書くものでは無いのでは。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問