2011-10-07 26 views
6

Tengo un problema con jQuery 1.6.4, iOS 5 y el registro de eventos touchstart/touchend (como se indica en el título, obviamente).jQuery events en iOS 5

tomar el código siguiente:

<!DOCTYPE html> 
<html lang="fr"> 
<head> 
    <meta charset="utf-8" /> 
    <script type="text/javascript" src="mmpa/jquery-1.6.4.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      var $body = $('body'); 
      $('<button>').html('test jQuery').bind('touchstart', function() { alert('touchstart'); }).appendTo($body); 
     }); 
    </script> 
</head> 
<body> 
    <button ontouchstart="alert('touchstart');">test pure JS</button> 
</body> 
</html> 

El botón "pura JS" muestra la alerta en iOS 4.3 y iOS 5, pero el botón "jQuery" sólo funciona en iOS 4.3. Probado en el simulador de iPad/iPhone, 4.3 y 5; también probado en el iPhone 4.3, el iPhone 5.0 y el iPad 5.0 reales. La misma reacción si uso un <input type="button"> o incluso un simple <a> en lugar de un <button>.

¿Es un problema relacionado con jQuery como creo?

+0

no utilice el enlace ('touchstart') y ontouchstart = "". Use uno de ellos, y prefiera no usar javascript en línea. –

+1

Esa fue una prueba de concepto para mostrar que JS en línea funciona cuando jQuery no lo hace. Por supuesto que nunca, nunca uso JS en línea en código real. – Cyrille

+0

Pude producir este error con jQ 1.5.2 y el evento click, así que tal vez deba modificar el título para que sea algo así como "jQuery Events en iOS 5" – webXL

Respuesta

8

contestada por un individuo en foros dev Apple: Me necesitan de obligar() sólo después el elemento ha sido añadido a la DOM, así:

var btn = $('<a>').html('test jQuery').appendTo($body); 
btn.bind('touchstart', function(e) { alert('touchstart'); }); 
+2

¿Qué sucede si usa live() en lugar de bind() ? ¿Alguna explicación de por qué dejó de funcionar en iOS 5? – Crashalot