Existe-t-il un plug-in jQuery ou un script JavaScript qui parcourt automatiquement chaque survol CSS (trouvé dans une feuille de style externe) et le lie à un événement de double touché?
S'il n'y a pas encore quelque chose comme ça, peut-on le faire et comment (lignes directrices)?
MODIFIER:
Pour être clair, je ne suis pas à la recherche d'un double tap. Touchdown 1 est un onglet unique, tout comme Touchdown 2. Il peut y avoir moins de 0 secondes entre les deux ou autant que 3 minutes, c'est le choix de l'utilisateur.
Pas touche:
Touchez (iOS):
Essaye ça:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>iPad Experiment</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
if(navigator.platform == "iPad") {
$("a").each(function() { // have to use an `each` here - either a jQuery `each` or a `for(...)` loop
var onClick; // this will be a function
var firstClick = function() {
onClick = secondClick;
return false;
};
var secondClick = function() {
onClick = firstClick;
return true;
};
onClick = firstClick;
$(this).click(function() {
return onClick();
});
});
}
});
</script>
<style type="text/css">
a:hover {
color:white;
background:#FF00FF;
}
</style>
<body>
<a href="http://google.ca">Google</a>
<a href="http://stackoverflow.com">stackoverflow.com</a>
</body>
</html>
... ou consultez la démo sur mon site Web . Notez qu'il est configuré pour fonctionner uniquement sur l'iPad - la détection de toutes les versions de l'iOS est une autre question de mes livres;)
Cela fonctionne sur la base du fait que ...
Une fois que vous avez cliqué sur un lien de l'iphone ou de l'ipad, un survol simulé de la souris déclenche le style a: hover css sur ce lien. Si le lien a un gestionnaire javascript qui vous maintient sur la même page, l'état de survol ne changera pas tant que vous ne cliquez pas sur un autre lien.
J'ai utilisé ceci:
$(document).ready(function() {
$('.hover').bind('touchstart touchend', function(e) {
e.preventDefault();
$(this).toggleClass('hover_effect');
});
});
Avant, autoriser le survol sur certains éléments. Évidemment, vous aurez besoin de le modifier pour votre propre usage, mais c'est un bon moyen de permettre un effet de survol tactile.
Voici une autre version optimisée qui gère également closing the: hover
Vous devrez encapsuler votre site avec un
<div id="container"></div>
pour que cela fonctionne. Le simple fait de mettre la clôture sur le corps n'a rien fait
var bodyBound = false;
var container;
if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i))
{
container = $("#container");
// Provoke iOS :hover event
$("a.someLink").on("mouseover", handleHoverClick);
}
function handleClose(event)
{
container.off("click", handleClose);
bodyBound = false;
}
function handleHoverClick(event)
{
if (!bodyBound)
{
bodyBound = true;
// Somehow, just calling this function—even if empty—closes the :hover
container.on("click", handleClose);
}
}
J'ai créé cette mise à jour sur la solution Richard JP Le Guens. Cela fonctionne très bien, mais ma version corrige le problème reconnu par DADU.
J'ai aussi corrigé sa solution de contournement pour détecter les iPad. Ma solution détecte également tout autre appareil tactile (sauf IE10 sur une surface MS, je ne me souvenais pas du traitement spécial MS).
Mon correctif n'est pas une solution parfaite à 100%, mais il réinitialise le correctif de survol au moins lors du survol d'un autre lien.
<!DOCTYPE html>
<html>
<head>
<title>TouchDevice Experiment</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
if(document.createEvent("TouchEvent")) { // using document.createEvent is more reliable than navigator (Modernizr uses this practice)
$("a").each(function() { // have to use an `each` here - either a jQuery `each` or a `for(...)` loop
var onClick; // this will be a function
var firstClick = function() {
$("a").trigger("JWUnhover"); // triggering hoverfix reset if any link gets touched
onClick = secondClick;
return false;
};
secondClick = function() {
onClick = firstClick;
return true;
};
onClick = firstClick;
$(this).click(function() {
return onClick();
});
$(this).bind('JWUnhover', function(){ onClick = firstClick; });
});
}
});
</script>
<style type="text/css">
a:hover {
color:white;
background:#FF00FF;
}
</style>
</head>
<body>
<a href="http://google.ca">Google</a>
<a href="http://stackoverflow.com">stackoverflow.com</a>
</body>
</html>
Cela a fonctionné pour moi!
// Ipad Navigation Hover Support
$('#header .nav li a').bind('touchstart touchend', function(e) {
if( $(this).attr("href") != "" ){
window.location = $(this).attr("href");
}
});
Je ne connais aucun plugin jQuery pour faire une telle chose.
Vous ne pouvez pas déclencher une classe css psuedo telle que ": hover". Vous pouvez toutefois parcourir les éléments d'ancrage et ajouter une classe css ".hover" aux événements touchstart et touchend comme suit:
var pageLinks = document.getElementsByTagName('a');
for(var i = 0; i < pageLinks.length; i++){
pageLinks[i].addEventListener('touchstart', function(){this.className = "hover";}, false);
pageLinks[i].addEventListener('touchend', function(){this.className = "";}, false);
}
Pour ajouter un outil de reconnaissance des gestes au toucher, vous pouvez utiliser un plugin tel que: http://plugins.jquery.com/project/multiswipe
Il existe un moyen plus simple de résoudre le problème avec iOS et les états de survol, en utilisant CSS. Pour le lien que vous avez un problème avec définir la propriété cursor
à pointer
et l'état de survol sera ignoré sur iOS. Pour que tous les liens fonctionnent comme prévu, voir ci-dessous:
a
{cursor: pointer;}
Voici une version optimisée du code jQuery fourni par Richard JP Le Guen:
$(document).ready(function() {
$('a').each(function() {
var clicked = false;
$(this).bind('click', function() {
if(!clicked) return !(clicked = true);
});
});
});