状況をどのように処理するかを理解するのを手伝ってください。私たちにはリンクがあります。追加のリンクブロックを展開する、そのリンクのためのhover CSSルールがあります。jQuery preventDefaultに従って:モバイル上のホバー状態
$('li').children('a').on('click', function(e) {
\t
if ($(this).siblings('div').is(':hidden')) {
\t e.preventDefault();
}
});
ul {
list-style-type: none;
border: 1px solid black;
background-color: white;
}
a {
display: block;
height: 30px;
line-height: 30px;
}
li:hover div {
display: block;
}
li div {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<ul>
<li>
<a href="google.com">Google</a>
<div>
<a href="gmail.com">GMail</a>
<a href="maps.google.com">Maps</a>
</div>
</li>
</ul>
アイデア:拡張され、追加のリンクまで、第1のリンクのためのpreventDefaultする必要があります。デスクトップ上では違いは分かりません(ホバーCSSルールを削除して最初のリンクをクリックしようとすると、残りのリンクが隠されているので機能しません)。正しい行動:ユーザーは最初のリンクを見て、他のリンクを見て、その後、最初のリンクをクリックすることができます。
ホバーとクリックが同じなので、モバイルで問題が発生します。ユーザーが最初のリンクをクリックすると、クリックの瞬間に追加のリンクが非表示になっていても、hrefが実行されます。しかし、:hoverルールはリンクをクリックするのと同時に適用されるので、JSはリンクが既に開かれているかのように扱い、デフォルトを防ぎません。実際のクリックより1秒前に、私の現在のIFステートメントがモバイル機器では偽であることを意味します。正しいアプローチを見つけるのを手伝ってください。
jquery-mobileを使用しないソリューションは、温かく歓迎されています!ありがとう!
お寄せいただきありがとうございますが、残念ながらモバイルデバイスではコードに同じ問題があります。ユーザーが最初のリンクをクリック/タップすると、hrefが実行されます。それが私が避けようとしていた理由です。 PC上では完全に動作します。しかし、携帯電話は、JSチェックの前に隠れている場合は ":ホバー"を実行します。だから、JSの場合は、最初のタッチの直後に ":visible"と表示されます。 – Mike
興味深い。コードは私の携帯電話で動いています。最初のリンクをタップすると、追加のリンクが表示され、ページに留まります。しかし、それがあなたのテストデバイスで動作しない場合は、別の属性に 'href'を置くことがあります。たとえば:htmlで 'Google'を使用し、jsで 'window.location.href = $(this).data(" href ");' –
と同じです。問題はhrefではなく、問題は、DIVが隠されているかどうかをチェックするために、モバイルデバイス上ではクリックではなくJS catchイベントの前に表示されるため、JSがELSE文を実行するということです。あなたはGoogle Chromeのモバイルエミュレーションモードでそれを見ることができます、例えばiPhone 6を試してみてください。 – Mike