Können *Sie* Holen Sie sich SVG auf mobilen browser akzeptieren Maus/touch-events? Ich kann nicht
Ich die Anzeige einer HTML -, mit eingebettetem SVG. Ich will es erkennt Maus-Ereignisse, aber es funktioniert nicht auf dem Handy (Android Jellybean). Es funktioniert gut für einen desktop-browser.
Hier ist eine demonstrations-Seite: http://artsyenta.org/misc/ss/j.touchtry1.html .
Wenn Sie ziehen Sie die Maus über die Kreise, die Sie sehen, ein log der Maus die Einträge in der Elemente mit den Namen "j_xxx". Das funktioniert in Firefox und Chrome.
Öffnen Sie Ihr Android-tablet (ich habe auch versucht diese auf jemandes iPhone, mit dem gleichen Ergebnis). Ziehen Sie Ihren finger über die Kreise und Sie erhalten eine touchenter event nur hin und wieder. Nichts anderes zeigt.
Sehen Sie die ganze Seite und code anzeigen, indem Sie die Seite Quelle. Es ist nicht lange, das längste Teil ist die SVG-definition. Die wichtigsten Teile sind:
$(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());
}
Hier ist ein Teil des 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>
Wieder, ich kann Maus-Ereignisse auf einem desktop-browser, aber keine touch-oder Maus-events, die für einen mobilen browser. Ist es eine fehlende Technik, oder es fehlt etwas mit den Handys? Schlägt es mit den iPhone-browser, Google Chrome auf Jellybean und Firefox mobile.
Vielen Dank im Voraus,
Jerome.
- SVG-Unterstützung auf mobilen Browsern ist sehr begrenzt: caniuse.com/#search=svg
- Versuchen Sie, den remote-debugger auf mobilen Chrome, um zu sehen, was passiert, Schritt für Schritt. Es sollte aber funktionieren, ich glaube nicht, es ist ein SVG-Problem!
- Für jgillich, pro caniuse.com SVG ist angeblich arbeitet an Chrome. Für F. X., habe ich versucht, eine remote-debugging auf mobilen Chrome. Ich habe zwei Seiten, die j.touchtry1.html mit plain SVG und einer mit der Bibliothek RaphaelJS (j.raphael6.html). Die ehemalige Seite erzeugt eine gelegentliche mousedown-Ereignis. Die letztere Seite erzeugt einige "undefined" (event.der Typ ist nicht gesetzt, wenn das Ereignis generiert wird). Ich schaltete eine "habe ich den Wechsel auf ein anderes SVG-Pfad/Fenster?" - Detektor. Ich hätte Hunderte von mousemove-Ereignisse. Ich bekomme einige jetzt und dann. Ich werde versuchen, Debuggen, Raphael demos, die funktionieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem eine Menge Forschung in Reine SVG-Veranstaltungen und RaphaelJS Ereignisse, ich habe eine brauchbare Lösung für jeden. Hier ist ein RaphaelJS Lösung:
Code ist nicht luftdicht, sondern veranschaulicht die wichtigsten Punkte.
Ersten, die Ereignisse müssen registriert werden, durch den addEventHandler () - Aufruf. Mit der RaphaelJS onmousemove(), etc., Handler funktioniert nicht auf dem tablet.
Zweite, für touch-Ereignisse, die Sie brauchen, zu Graben, in die Liste berührt. Meine Anwendung kümmert sich nur um einen einzigen finger, und die [0] - Ereignis der Liste ist genug. Es gibt eine Reihe von Listen -- berührt, targetTouches, changedTouches -- so wählen Sie einen passenden aus.
Dritten, zu bestimmen, ob das Fenster muss Blasen-die Ereignisse. Ich bekomme mehr Sensibilität auf Berührungen, wenn ich preventDefault().
Getestet habe ich diese auf einem Google Nexus, iPad 3 und iPad Mini. Gute Ergebnisse.
Ich habe auch eine Lösung für plain-SVG. Es basiert auf dieser site:
http://my.opera.com/MacDev_ed/blog/2010/02/01/how-to-get-all-svg-elements-intersected-by-a-given-rectangle
Sind die Unterschiede für das, was ich benutze und der Javascript verwendet er, ist, dass, wieder, für berührt, der berührt die Liste muss zugreifen. "root" ist das svg-element-ID für dieses Beispiel. "logTrace" ist eine Spanne, die Sie empfängt, Kommentare.
Getestet hab ich diese Lösung auf ein Nexus und ein iPad erfolgreich. Allerdings verhält es sich so schlecht auf einem iPad Mini-warum Verhalten sich anders bei zwei iPad-Geräten?
Mir ist auch aufgefallen, dass die "plain svg" - Lösung scheint nicht zu erkennen, genau wie die RaphaelJS version. In der Nähe von den Rändern meiner SVG-Elemente die Erkennung ist einfach nicht sehr gut mit der reinen svg-Erkennung. Ich bin konsequent immer gute Ergebnisse für die RaphaelJS verwenden.
OTOH, die RaphaelJS verwenden, ist zu empfindlich, um die SVG mit (fill:none). Der plain-SVG kümmert sich nicht, wenn (fill:none) ist in einem element. Wählen Sie Ihr Gift.
Hatte ich dieses problem, und es stellt sich heraus, das iPad hält die Deckkraft eines Objekts für seine hit-test-Funktion, so dass, wenn Sie etwas mit fill:none wird es nicht registrieren, ein Ereignis.
Habe ich erfolgreich getestet, ein Weg mit diesem Stil:
und zwei event-Handler platziert auf den tag mit dem Pfad:
den
load(id)
Funktion wird gespeichert, in eine externe JS-Datei.Andere Haken ist, dass die SVG hat zu sein gelegt direkt in die HTML-dom-und nicht referenziert als
<embed .../>
, die letztere bewirkt Sicherheit Ausnahmen