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

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

新規登録して質問してみよう
ただいま回答率
85.37%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

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

Q&A

解決済

1回答

14272閲覧

JavaScriptでElement.valueをセットしたときに、onChangeイベントを発火させる方法

takey

総合スコア312

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

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

0グッド

0クリップ

投稿2020/04/17 10:17

編集2020/04/18 02:56

説明のしやすさのため、できれば以下のcodepenを見てください。

https://codepen.io/taketakeyyy/pen/NWGNMmL

コード

html

1<select id="id-sel_lang"> 2 <option value="c" selected>C</option> 3 <option value="cpp">C++</option> 4 <option value="js">JavaScript</option> 5</select> 6 7<br> 8<input type="button" value="click" id="id-btn">

javascript

1const sel_lang = document.getElementById("id-sel_lang"); 2sel_lang.addEventListener("change", function(){ 3 console.log("変わりました"); 4}); 5 6const btn = document.getElementById("id-btn"); 7btn.addEventListener("click", function(){ 8 sel_lang.value = "js"; 9});

やりたいこと

1つのセレクトボックスと、1つのボタンがあります。

セレクトボックスにはonchangeイベントを追加しています。これにより、セレクトボックスをマウスを使って変更すると、consoleに「変更しました」と表示されます。

ボタンをクリックすると、セレクトボックスの値は"JavaScript"に変わります。しかし、onchangeイベントは発火せず、consoleには何も表示されません。

私がやりたいことは、ボタンをクリックしたときに、onchangeイベントを発火させたいです。

ただし、「onchangeに登録している関数に名前をつけて外に出し、ボタンのclickイベントでその関数を呼び出す」ようなことはしたくありません。できればJavaScriptの処理でonchangeを発火させるようなことをしたいです。

もっと言えば、私は、

javascript

1btn.addEventListener("click", function(){ 2 /*私はここの部分を書き換えられる権限しかない*/ 3});

という状況です。

なにか良い方法がありますでしょうか?よろしくお願いします。

【解決後】最終的なコード

yambejp様の回答どおりに、HTMLElement.prototypeに、dispatchEventを実行するtriggerを新しく定義する方法で解決しました。

javascript

1const sel_lang = document.getElementById("id-sel_lang"); 2sel_lang.addEventListener("change", function(){ 3 console.log("変わりました"); 4}); 5 6/***追加・編集ここから***/ 7 8HTMLElement.prototype.trigger = function(eStr) { 9 var e = document.createEvent("HTMLEvents"); 10 e.initEvent(eStr, true, true ); 11 this.dispatchEvent(e); 12} 13 14const btn = document.getElementById("id-btn"); 15btn.addEventListener("click", function(){ 16 if (sel_lang.value === "js") { return; } 17 sel_lang.value = "js"; 18 sel_lang.trigger("change"); 19}); 20 21/**追加・編集ここまで**/

あるいはHTMLElementを汚したくない場合、sel_langに追加する方法でも解決できました。

javascript

1const sel_lang = document.getElementById("id-sel_lang"); 2sel_lang.addEventListener("change", function(){ 3 console.log("変わりました"); 4}); 5 6/***追加・編集ここから***/ 7 8sel_lang.trigger = function(eStr) { 9 var e = document.createEvent("HTMLEvents"); 10 e.initEvent(eStr, true, true ); 11 this.dispatchEvent(e); 12} 13 14const btn = document.getElementById("id-btn"); 15btn.addEventListener("click", function(){ 16 if (sel_lang.value === "js") { return; } 17 sel_lang.value = "js"; 18 sel_lang.trigger("change"); 19}); 20 21/***追加・編集ここまで***/

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

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

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

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

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

m.ts10806

2020/04/17 10:21

念のためHTMLもご提示ください。
guest

回答1

0

ベストアンサー

こんな感じで処理してください

投稿2020/04/17 10:22

yambejp

総合スコア116468

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

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

yambejp

2020/04/17 12:27 編集

<script> HTMLElement.prototype.trigger=function(eStr){ var e = document.createEvent("HTMLEvents"); e.initEvent(eStr, true, true ); this.dispatchEvent(e); } window.addEventListener('DOMContentLoaded', ()=>{ const sel_lang = document.getElementById("id-sel_lang"); sel_lang.addEventListener("change", function(){ console.log("変わりました"); }); const btn = document.getElementById("id-btn"); btn.addEventListener("click", function(){ if(sel_lang.value !== "js"){ sel_lang.value = "js"; sel_lang.trigger('change'); } }); }); </script> <select id="id-sel_lang"> <option value="c" selected>C</option> <option value="cpp">C++</option> <option value="js">JavaScript</option> </select> <br> <input type="button" value="click" id="id-btn">
yambejp

2020/04/17 10:34

HTMLElementのprototypeをいじるのが嫌な場合は、単品のsel_langに triggerを追加してもよいでしょう
ku__ra__ge

2020/04/17 12:19 編集

質問と直接関係ない疑問で申し訳ないのですが、なぜコメントで回答コードを書かれるのでしょうか?回答はあとから編集可能ですし、回答にはpre記法も使えるのにコメントにコードを書くのにはなにか理由があるのかな、と思いまして。
yambejp

2020/04/17 12:19

すみません、投稿制限がかかっていて回答欄に100文字くらいしか アップロードができない環境から回答しているからです。 (コメント欄は意外にもうちょいアップできる)
yambejp

2020/04/17 12:26 編集

やはりcodepenとかに貼ったほうがよいですよね (ちょっとボリュームが多いのだと貼るのですが・・・) https://codepen.io/yambejp/pen/oNjxMKK clickしてもchangeしない場合があったので修正してあります
takey

2020/04/18 02:09

HTMLElement.prototypeを初めて知りました。 とてもシンプルなコードで、理解しやすかったです。 ありがとうございました!
ku__ra__ge

2020/04/18 09:31

なるほどそういうことだったんですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問