.on()
jQuery 、 SVG xlink
、および Internet Explorer / Safariの組み合わせでかなり厄介な問題に遭遇したようです。
削減されたケースの例は次のとおりです: http://codepen.io/mikehdt/pen/MwqORK
この例には 2 つのボタンがあります。1 つは SVG を使用し、もう 1 つは SVG コードを直接埋め込みます。
SVG とボタンは次のようになっています (ドキュメントの後半にあるものを.icons-svg
試してみると、Safari が悲しくなるように見えるので、最初に注意してください)。xlink
<div class="icons-svg"><svg xmlns="http://www.w3.org/2000/svg"><symbol viewBox="0 0 1792 1792" id="icon-plus"><title>plus</title><path d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"></path></symbol></svg></div>
<a href="https://www.google.com" class="button">
<span>Hey, what are you doing?</span>
<svg class="icon icon-plus"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-plus"></use></svg>
</a>
<a href="https://www.google.com" class="button">
<span>Hey, what are you doing?</span>
<svg width="100%" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1600 736v192q0 40-28 68t-68 28h-416v416q0 40-28 68t-68 28h-192q-40 0-68-28t-28-68v-416h-416q-40 0-68-28t-28-68v-192q0-40 28-68t68-28h416v-416q0-40 28-68t68-28h192q40 0 68 28t28 68v416h416q40 0 68 28t28 68z"/></svg>
</a>
見栄えを良くするためのいくつかの超基本的な CSS:
.button {
position: relative;
display: inline-block;
width: 100px;
padding: 10px;
background-color: #ccc;
}
.icon {
width: 100%;
fill: currentColor;
}
.icons-svg {
display: none;
}
jQuery は、次のように、動的バインディングのために on を使用しています。
$(function(){
$(document).on('click', '.button', function(event){
event.preventDefault();
alert('You clicked the button');
});
});
Chrome や Firefox と同様に、SVG を使用するリンクの + をクリックすると、警告メッセージが表示されます。ただし、IE と Safari では、イベントを防止してリンクをたどるスクリプトのトリガーに失敗します。
埋め込まれている SVG をクリックすると意図したとおりに直接動作しますが、アセットを適切に再利用するには、これは実行不可能なソリューションです。
機能するもの:
使用せずに使用する.on()
と.click()
、すべてのブラウザーが機能しますが、動的バインディングが失われます。使用.on()
しても使用しない場合xlink
は、すべてのブラウザーが機能します。この問題が発生するのは、.on()
との組み合わせだけです。xlink
なぜこれを行うのですか?
アイコンに SVG を使用する場合は、リソースを外部に保持し (したがってキャッシュ可能)、動的バインディングを必要とする Ajax イベントをサイトに配置します。
他の誰かがこれに遭遇したことがありますか?この組み合わせで IE と Safari をうまく動作させることができましたか? これはブラウザや jQuery のバグでしょうか、それとも Chrome と Firefox が誤って対処しているものでしょうか?