2017-02-15 11 views
1

Firefoxがカスタム要素の属性を「クリア」しているという印象があります。Firefoxでポリマーのカスタム要素のデータセットが空です

以下のスクリプトはChromeのネイティブWebコンポーネントサポートで動作しますが、Firefoxでは、クリックイベントハンドラを実行するとデータセットが空になっているようです。

document.addEventListener('DOMContentLoaded', function() { 
    var popups = document.querySelectorAll('iron-image[data-popup]'); 
    for (var i=0; i < popups.length; i++) { 
     var img = popups[i]; 
     console.log(img.dataset.popup); // <--- this works 

     img.addEventListener('click', function(ev) { 
      var app = document.querySelector('sh-app'); 
      app.showPopup(ev.target.dataset.popup); // <-- This fails, dataset is empty 
     }); 
    } 
}); 

側注:私もWebComponentsReadyイベントを試してみましたが、それは何らかの理由ですべてで焼成されません。

誰もがこの問題に遭遇して原因を理解していますか? これはPolymer(この場合は<iron-image>)、Web Componentsポリフィル、またはFirefoxのその実装のバグですか?

答えて

2

Event retargeting

基本的に、あなたはそれを正規化するPolymer.domを使用してイベントをラップする必要があります。

document.addEventListener('DOMContentLoaded', function() { 
    var popups = document.querySelectorAll('iron-image[data-popup]'); 
    for (var i=0; i < popups.length; i++) { 
     var img = popups[i]; 
     console.log(img.dataset.popup); // <--- this works 

     img.addEventListener('click', function(ev) { 
      var app = document.querySelector('sh-app'); 
      var event = Polymer.dom(ev); // you wrap the event using Polymer.dom 
      app.showPopup(event.localTarget.dataset.popup); // instead of target you should use localTarget 
     }); 
    } 
}); 
+0

ありがとうございます!それは完全に機能します。私はドキュメントのその部分を忘れていました。たぶん一度しか読んでいなかったし、それについて忘れてしまった:「私がやるまでは、おそらくそれは必要ないでしょう」 – Andre

+0

@andreサイドノートbtw、通常のforループ。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake –

関連する問題