site detectar javascript jquery iphone css mobile

javascript - detectar - mobile detect js



iphone/ipad provoca eventos de cambio de tamaƱo inesperados (7)

Estoy trabajando en una versión móvil de mi sitio. Estoy utilizando las consultas de medios y CSS tanto como sea posible, pero también estoy usando algunos javascript para, por ejemplo, convertir mi navegación en una lista de colapso / expansión en dispositivos más pequeños para ahorrar espacio.

Para manejar todo esto, estaba intentando usar el evento window.resize. Esto permite que la magia suceda en los navegadores de escritorio mientras se cambian de tamaño, pero obtengo cambios de tamaño en el iPad / iPhone cuando no los estoy esperando.

En los navegadores de escritorio, solo obtengo un evento de cambio de tamaño si realmente cambio el tamaño de la ventana. En navegadores móviles obtengo el evento de cambio de tamaño cuando cambio de orientación (esperado), pero también lo consigo cuando alterno para expandir / colapsar algo.

Aquí hay un ejemplo simple:

<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <title>Resize test</title> <style> .box {height: 10000px; background: green; display: none;} </style> <script> $(function(){ $(".opener").click(function(){ $(".box").slideToggle(); }); $(window).resize(function(){ alert("resized"); }); }); </script> </head> <body> <a href="#" class="opener">Open/close me</a> <div class="box"></div> </body> </html>

Cuando hace clic en el enlace en un navegador de escritorio, no hay alerta. Haga clic en el enlace en iPhone / iPad, recibirá la alerta. ¿Cual es el trato?


¿Está equivocada la suposición de que solo desea tener el efecto del evento de cambio de tamaño en un dispositivo sin contacto? Si es así, simplemente podría usar Modernizr y hacer un control como:

$(window).resize(function(e){ if(Modernizr.touch) { e.preventDefault(); } });


@ 3stripe tiene la respuesta correcta.

Esto es solo una pequeña modificación que lo hace más eficiente almacenando en caché el objeto de la ventana en lugar de crear instancias repetidas de jQuery (tenga en cuenta que el evento de cambio de resize puede ser llamado rápidamente en un cambio de tamaño real).

jQuery(document).ready(function($) { // Cached window jQuery object var $window = $(window); // Store the window width var windowWidth = $window.width(); // Resize Event $window.resize(function(){ // Check window width has actually changed and it''s not just iOS triggering a resize event on scroll if ($window.width() != windowWidth) { // Update the window width for next time windowWidth = $window.width(); // Do stuff here } // Otherwise do nothing }); });


Almacene el ancho de la ventana y verifique que realmente haya cambiado antes de continuar con su función de $(window).resize :

jQuery(document).ready(function($) { // Store the window width var windowWidth = $(window).width(); // Resize Event $(window).resize(function(){ // Check window width has actually changed and it''s not just iOS triggering a resize event on scroll if ($(window).width() != windowWidth) { // Update the window width for next time windowWidth = $(window).width(); // Do stuff here } // Otherwise do nothing }); });


Compruebe si está desplazando explícitamente el envoltorio del cuerpo html para ocultar la barra de direcciones cuando se carga la página.


Necesitaba especificar un ancho:

<meta name="viewport" content="width=1000, initial-scale=1.0, user-scalable=yes">

Estilos:

html, body { height:100%; width:100%; overflow:auto; }


Se siente raro comprobar el tamaño de la ventana para ver si ha cambiado. En su lugar, use los recursos que jQuery le brinda.

En el controlador de eventos, puede verificar el campo de target del evento de jQuery, que siempre se establece en el elemento DOM que originó el evento. Si el usuario cambia el tamaño de la ventana, el target será la ventana. Si el usuario cambia el tamaño de #someDiv , el target será #someDiv .

$(window).on(''resize'', function(event) { if ($(event.target).is($(window))) { doTheThing(); } });


descubrí la respuesta en en el enlace de la solución . es la respuesta de sidonaldson que me ayudó a resolver un problema enfrentado anteriormente como este. ty

la respuesta es:

var cachedWidth = $(window).width(); $(window).resize(function(){ var newWidth = $(window).width(); if(newWidth !== cachedWidth){ //DO RESIZE HERE cachedWidth = newWidth; } });