説明のしやすさのため、できれば以下の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/***追加・編集ここまで***/
回答1件
あなたの回答
tips
プレビュー