機能を持つ選択ボックス(またはネストされたoption
要素)の変更を監視しようとしています。しかし、 "setAttribute"だけが私のために突然変異観測者のコールバックを引き起こしています。Webkit Mutation選択ボックス属性の変更時にオブザーバコールバックが発生しない
ここで私が使用していたコードです:
~function(doc, $) {
var select = $('select');
// http://www.w3.org/TR/dom/#mutation-observers
var observer = new WebKitMutationObserver(function(mutations) {
alert(mutations.length + " mutations happened");
});
observer.observe(select, {
// monitor descendant elements – changing `selected` attr on options
subtree: true,
attributes: true
});
// this triggers Observer's reaction, but doesn't update select box UI
select.setAttribute('value', 'whee');
// this updates select box UI, but doesn't trigger mutation observer's callback
select.value = "whee";
// this also updates the UI, but doesn't trigger mutation observer's callback
select.getElementsByTagName('option')[0].selected = true;
//
// neither does manual selecting of options trigger mutation observer unfortunately :(
button.addEventListener('click', function(e) {
e.preventDefault();
// my goal is to react to this change here
select.value = Math.random() > .5 ? "whee" : "whoa";
}, false);
}(document, function(selector) { return document.querySelector(selector); });
そして、ここでアクションhttp://jsfiddle.net/gryzzly/wqHn5/
に私は、属性(<option>
または<select>
上value
上selected
)への変化に対応するために、任意の提案をしたいと思い、このコードだが、なぜオブザーバーは反応しないのですか?
私はこれをMac OS XのChrome 18.0.1025.168でテストしています。もちろん、プロダクションコードにはコンストラクタとプレフィックスが付いていないバージョンもプレフィックスとしてmoz
あります。これはテストコードです。
UPD。
夜間にもコードをテストしたところ、ChromeやChrome Canaryと同じように動作します。私は両方のブラウザ用のバグを満たしている:
- https://bugzilla.mozilla.org/show_bug.cgi?id=757077
- https://code.google.com/p/chromium/issues/detail?id=128991
をあなたもこの問題が迷惑見つけたら、コメントしてこれらのバグに投票してください。
未完成仕様の実験的実装に依存したいとは思わないでしょう。 –
Chromiumに対して報告された、関連するWebKitに根ざしたバグの別の表出と思われる:http://code.google.com/p/chromium/issues/detail?id=103551 –
@TimDown誰かが私が何かに頼っていると言った? :-)私は自分自身を実験しています! –