Pouvez *vous* obtenir SVG sur un navigateur mobile à accepter la souris/les événements tactiles? Je ne peux pas
- Je afficher un code HTML, avec un intégré à SVG. Je le veux pour détecter les événements de la souris, mais il ne travaille pas sur le mobile (Android Jellybean). Il fonctionne très bien pour un navigateur de bureau.
Voici une page de démonstration: http://artsyenta.org/misc/ss/j.touchtry1.html .
Si vous faites glisser la souris sur les cercles de vous voir un journal de la souris entrées dans les éléments nommés "j_xxx". Cela fonctionne dans Firefox et Chrome.
Ouvrir votre tablette Android (j'ai aussi essayé ce que quelqu'un est iPhone, avec les mêmes résultats). Faites glisser votre doigt sur les cercles et vous obtenez un touchenter événement seule maintenant et puis. Rien d'autre montre.
Vous pouvez voir l'ensemble de la page et le code en affichant la source de la page. Il n'est pas long, la partie la plus longue est le SVG définition. Les pièces importantes sont:
$(document).ready(function() {
makeSomethingHappen("hello");
});
function makeSomethingHappen(svg) {
placeATop(true);
$('[class^=j_]')
.on("mouseover", function(event) { logAction(event, this); })
.on("mouseout", function(event) { logAction(event, this); })
.on("touchstart", function(event) { logAction(event, this); })
.on("touchend", function(event) { logAction(event, this); })
.on("touchenter", function(event) { logAction(event, this); })
.on("touchleave", function(event) { logAction(event, this); })
.on("touchEnter", function(event) { logAction(event, this); })
.on("touchLeave", function(event) { logAction(event, this); });
}
var cntAct = 0;
function logAction(ev, ele) {
cntAct++;
var logSpan = $('#logTrace');
logSpan.html("" + cntAct + ": " + ev.type + " '" + $(ele).attr("class")
+ "'<br/>" + logSpan.html());
}
Voici une partie de la SVG:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
id="jsvg" x="0px" y="0px" width="376.247px" height="364.318px" viewBox="140 110 130 120"
enable-background="new 0 0 376.247 364.318" xml:space="preserve">
<g id="Layer_1">
<path class="j_aa_" opacity="0.75" fill="#FFFFFF" stroke="#0071BC" stroke-width="0.9925" enable-background="new " d="M224.739,6.55l-6.414,23.957c-10.377-2.785-21.304-2.785-31.671,0L180.232,6.55C194.813,2.63,210.155,2.63,224.739,6.55z"/>
[snip]
</g>
</svg>
Encore une fois, je détecte les événements de la souris sur un navigateur de bureau, mais pas de toucher ou les événements de la souris pour un navigateur mobile. Est-il un manque de technique, ou qu'il manque quelque chose avec les mobiles? Il ne fonctionne pas avec l'iPhone navigateur, Google Chrome sur Jellybean et Firefox mobile.
Merci d'avance,
Jerome.
- Le support SVG sur les navigateurs mobiles est très limitée: caniuse.com/#search=svg
- Essayez d'utiliser le débogueur à distance sur mobile de google Chrome pour voir ce qui se passe étape par étape. Il devrait fonctionner, cependant, je ne pense pas que c'est une SVG de problème!
- Pour jgillich, par caniuse.com SVG est censé travailler sur Chrome. Pour F. X., j'ai essayé de débogage à distance sur mobile Chrome. J'ai deux pages, l'j.touchtry1.html avec SVG simple et à l'aide de la RaphaelJS bibliothèque (j.raphael6.html). L'ancienne page génère une occasionnelle événement mousedown. La dernière page génère de la "undefined" (événement.le type n'est pas défini lorsque l'événement est généré). J'ai désactivé un "n'ai-je changer pour un autre chemin SVG/fenêtre?" détecteur. Je devrais avoir des centaines de mousemove événements. J'obtiens maintenant et puis. Je vais essayer de débogage, le Raphaël des démos qui ne de travailler.
Vous devez vous connecter pour publier un commentaire.
Après beaucoup de recherche dans la plaine SVG événements et RaphaelJS événements, j'ai une solution pour chacun. Voici une RaphaelJS solution:
Le code n'est pas étanche à l'air, mais illustre les principaux points.
Tout d'abord, les événements doivent être enregistrés dans le addEventHandler() de l'appel. À l'aide de la RaphaelJS onmousemove(), etc., les gestionnaires ne fonctionne pas sur la tablette.
Deuxième, les événements tactiles vous avez besoin de creuser dans la liste de touche. Mon application se soucie uniquement de un seul doigt, et donc le [0] événement de la liste est assez. Il y a un certain nombre de listes -- touche, targetTouches, changedTouches -- donc choisir celle qui convient.
Troisième, de déterminer si la fenêtre doit bulle les événements. Je reçois plus de sensibilité à la touche si je l'appelle preventDefault().
J'ai testé cela sur un Google Nexus, iPad 3 et iPad Mini. De bons résultats.
J'ai aussi une solution pour SVG simple. C'est sur ce site:
http://my.opera.com/MacDev_ed/blog/2010/02/01/how-to-get-all-svg-elements-intersected-by-a-given-rectangle
Les différences pour ce que j'utilise et le code Javascript qu'il utilise est que, encore une fois, pour la touche la touche la liste des besoins d'accès. "racine" est l'ID de l'élément svg pour cet exemple. "logTrace" est une période qui reçoit des commentaires.
J'ai testé cette solution sur un Nexus et un iPad avec succès. Cependant, il se comporte mal sur un iPad Mini -- pourquoi se comportent différemment sur les deux appareils iPad?
J'ai aussi remarqué que la "plaine svg" la solution ne semble pas détecter de façon aussi précise que la RaphaelJS version. Près des bords de mes éléments SVG la détection n'est tout simplement pas très bon avec le svg simple de détection. Je suis toujours de bons résultats pour la RaphaelJS utilisation.
Otoh, que, le RaphaelJS utilisation est sensible à la SVG avoir (fill:none). La plaine SVG n'a pas de soins si (fill:none) est définie dans un élément. Choisissez votre poison.
J'ai eu ce problème et il s'avère que l'iPad considère l'opacité d'un objet pour son hit-fonction de test, donc si vous avez quelque chose à remplir:aucune il ne sera pas s'inscrire à un événement.
J'ai testé avec succès un chemin avec ce style:
et deux gestionnaires d'événements placés sur l'étiquette contenant le chemin d'accès:
la
load(id)
la fonction est stockée dans un fichier JS externe.Un autre hic, c'est que le SVG doit être placé directement dans le dom HTML et qui n'est pas référencée comme une
<embed .../>
, ce dernier provoque des exceptions de sécurité