「onchange」イベントは、ユーザーが何らかの値を入力した場合にのみトリガーされます。 Javascriptを介して値を自動的に変更すると、イベントを発生させることができないのはなぜですか?代替手段はありますか?
アニメーション:
コード:
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener ("DOMContentLoaded", function () {
var input = this.getElementsByTagName ("input")[0];
var div = this.getElementsByTagName ("div")[0];
var i = 0;
var seconds = 5;
div.innerHTML = "The following input should fire the event in " + seconds + " seconds";
var interval = window.setInterval (function () {
i ++;
if (i === seconds) {
window.clearInterval (interval);
input.value = "Another example";
div.innerHTML = "Nothing ! Now try change the value manually";
}
else {
div.innerHTML = "The following input should fire the event in " + (seconds - i) + " seconds";
}
}, 1000);
input.addEventListener ("change", function () {
alert ("It works !");
}, false);
}, false);
</script>
<style>
body {
padding: 10px;
}
div {
font-weight: bold;
margin-bottom: 10px;
}
input {
border: 1px solid black;
border-radius: 3px;
padding: 3px;
}
</style>
<title>Event</title>
</head>
<body>
<div></div>
<input type = "text" value = "Example" />
</body>
</html>
ありがとう
ほとんどの場合、コードで値を変更したときにイベントが発生することは望ましくありません。そのような場合は、 dispatchEvent
を介して最新のブラウザで合成イベントを発生させることができます。 詳細はこちら 。
したがって、特定の例では:
input.value = "Another example";
var event = document.createEvent("UIEvents"); // See update below
event.initUIEvent("change", true, true); // See update below
input.dispatchEvent(event);
更新:ベンジャミンが指摘 のように、上記が書かれたので、initUIEvent
は-に置き換えられました UIEvent
コンストラクター、つまり次のようになります。
input.value = "Another example";
var event = new UIEvent("change", {
"view": window,
"bubbles": true,
"cancelable": true
});
input.dispatchEvent(event);
または、change
イベントにバインドした関数をいつでも直接呼び出すことができます。これは、通常、私が行うことです。ただし、実際のイベントを使用して(たとえば、オブザーバーパターンを使用する場合)、変更をリッスンしているすべての人に通知するようにしたい場合があります。
initUIEvent
は非推奨になり、次のようにWeb標準から削除されていることに注意してください:developer.mozilla.org/en-US/docs/Web/API/UIEvent/initUIEvent
これは、initUIEvent
を使用しないことを除いて同じです。
input.value = 'Another example';
var event = new UIEvent('change', {
'view': window,
'bubbles': true,
'cancelable': true
});
input.dispatchEvent(event);
値をプロガンマ的に変更する場合、これがいつ発生するかはすでにわかっています。値を変更するときに、独自のメソッド(実際のトリガーイベントハンドラーから呼び出されるのと同じ)を呼び出すことができないとはどういうことですか?
編集:それ以外の場合、実際の火災を発生させる必要がある場合は、手動でイベントをディスパッチすることもできます。
CrowderのコードはTypeErrorしか与えませんでした(UIEvent.initUIEventへの十分な引数がありません)。これに変更します:
input.value = "Another example";
var event = document.createEvent("UIEvents");
event.initUIEvent("change", true, true, window, 1);
input.dispatchEvent(event);
そしてそれは動作します。