2012-05-02 10 views
14

機能を持つ選択ボックス(またはネストされた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>valueselected)への変化に対応するために、任意の提案をしたいと思い、このコードだが、なぜオブザーバーは反応しないのですか?

私はこれをMac OS XのChrome 18.0.1025.168でテストしています。もちろん、プロダクションコードにはコンストラクタとプレフィックスが付いていないバージョンもプレフィックスとしてmozあります。これはテストコードです。

UPD。

夜間にもコードをテストしたところ、ChromeやChrome Canaryと同じように動作します。私は両方のブラウザ用のバグを満たしている:

をあなたもこの問題が迷惑見つけたら、コメントしてこれらのバグに投票してください。

+0

未完成仕様の実験的実装に依存したいとは思わないでしょう。 –

+1

Chromiumに対して報告された、関連するWebKitに根ざしたバグの別の表出と思われる:http://code.google.com/p/chromium/issues/detail?id=103551 –

+2

@TimDown誰かが私が何かに頼っていると言った? :-)私は自分自身を実験しています! –

答えて

4

@gryzzly、私は詳細な応答とクロムのバグを更新しました:http://code.google.com/p/chromium/issues/detail?id=128991#c4

変更オブザーバーは、DOMシリアライズされた状態を観察に限定されています。 突然変異観測者が何かを観察できるかどうか知りたい場合は、 は要素のinnerHTML出力を見てください。 が が生成するマークアップの変更に反映された状態の変化を見ることができれば、突然変異観察者は約 を聞くことができるはずです。

TL;これは意図したとおりに動作しています。 HTMLSelectElement.valueのようなIDL属性の変更を観察するには、おそらくonclickやonchangeのような入力イベントが最適です。

+0

ありがとうございました。私はコメントを書いています:https://code.google.com/p/chromium/issues/detail?id=128991#c5 –

+0

@gryzzly:adamkさんのコメントにバグがあります。幸いにも、フォーム要素の 'value'のようなプロパティの変更がDOM属性に反映されない場合、' change'や 'input'イベントのような代替イベントがあります。 –

+1

@TimDown私が問題のページに書いたように、問題は、JSがこの 'select.value =" foo ";'のような値を変更すると、UIが更新され、フォームが送信されるときに値が新しいものになり、 'change'と' input'イベントは発生しません。 –

関連する問題