2016-10-26 17 views
1

が動的に変更された<img>要素があります。変更が発生すると、MutationObserverが起動され、MutationRecordが記録されます。問題は、私がMutationRecordからデータにアクセスしようとするときに、古いデータを私に与えることです。例えば変異オブザーバ:突然変異記録から現在のデータを取得するには?

これは、元のimg要素です。

<img src="#" /> 

JS

MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 

var observer = new MutationObserver(function(mutations){ 
console.log(mutations); 
console.log(mutations[0].target.currentSrc); 


}); 

var element = document.querySelector("#shirt-design"); 

observer.observe(element, { 
    attributes: true, 
    childList: true 
}); 

srcが動的に変更された後、currentSrcは "image.jpg" のようなものでなければなりません。 MutationRecordは新しいデータを表示しますが、直接アクセスしようとすると古いデータが表示されます。例えば

console.log(mutations[0].target.currentSrc); //shows # 

console.log(mutations[0].target.currentSrc); //SHOULD BE image.jpg 

どのように私はMutationRecordから現在のデータにアクセスすることができますか?私はMutationRecordから何をしたいです

EDIT

naturalWidthです。それはが#(これはそれ)であるかのように私に0を与えます。 現在の画像のnaturalWidthを取得するにはどうすればよいですか?

console.log(mutations[0].target.naturalWidth); //0 
console.log(mutations[0].target.naturalWidth); //SHOULD BE number > 0 

MutationRecordがから変更またはobserver前であることを信じて私をリードし、私も(MutationObserver関数内)以下、このコードを試してみましたが、結果は0た2

EDIT、変更が行われる前に発砲しています。

console.log(document.querySelector("#shirt-design").naturalWidth); //0 

私はここで何が欠けていますか?

+0

'.target'は突然変異が影響を受けるノードです。なぜ、 ''の 'childList:true'ですか? – Andreas

+0

あなたは本当に 'src'ですか?おそらく、それは交換されるノード全体でしょうか? – wOxxOm

+0

@wOxxOm変更されているのは、jQuery 'attr()'を使った 'src'だけです。 –

答えて

0

だから、<img>の読み込みが完了する前に、MutationRecordが取得されていることがわかりました。私がしなければならなかったのは、それがロードされるのを待つことでした。そして、私はMutationRecordから正しいデータを得ることができました。

var observer = new MutationObserver(function(mutations){ 
    console.log(mutations); 
    //wait for img to load 
    document.querySelector("img").addEventListener("load", function(){ 
    console.log(mutations[0].target.currentSrc); 
    }); 
}); 
関連する問題