Подтвердить что ты не робот

Iphone/ipad запускает непредвиденные изменения размера

Я работаю над мобильной версией своего сайта. Я использую медиа-запросы и CSS как можно больше, но я также использую javascript, чтобы, например, превратить мою навигацию в список коллапса/расширения на более мелких устройствах, чтобы сохранить комнату.

Чтобы справиться со всем этим, я пытался использовать событие window.resize. Это позволяет магии происходить на настольных браузерах, пока они изменяются, но я получаю изменения размера на iPad/iPhone, когда я их не ожидаю.

В настольных браузерах я получаю только событие изменения размера, если я действительно изменяю размер окна. В мобильных браузерах я получаю событие изменения размера, когда меняю ориентацию (ожидаю), но я также получаю ее, когда я переключаюсь на расширение/сбой.

Вот простой пример:

<!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>

Когда вы нажимаете ссылку в обозревателе рабочего стола, нет предупреждения. Нажмите ссылку на iPhone/iPad, вы получите предупреждение. Какая сделка?

4b9b3361

Ответ 1

Сохраните ширину окна и убедитесь, что он действительно изменился, прежде чем приступить к вашей функции $(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 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

    });

});

Ответ 2

Мне нужно было указать ширину:

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

Стили:

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

Ответ 3

Является ли предположение неправильным, что вы хотите только иметь эффект события изменения размера на устройстве без касания? Если это так, вы можете просто использовать Modernizr и сделать чек вроде:

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

Ответ 4

Убедитесь, что вы явно прокручиваете оболочку тела html, чтобы скрыть адресную строку при загрузке страницы.

Ответ 5

@3stripe имеет правильный ответ.

Это небольшая модификация, которая делает ее более эффективной, кэшируя оконный объект, а не повторно создавая экземпляр jQuery (помните, что событие resize может быть вызвано быстро при фактическом изменении размера).

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 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

    });

});

Ответ 6

я узнал ответ в stackoverflow it self ссылку на решение. это ответ sidonaldson, который помог мне решить проблему, возникшую раньше. ти

ответ:

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

Ответ 7

Кажется, он взломан, чтобы проверить размер окна, чтобы узнать, изменилось ли оно. Вместо этого используйте ресурсы, которые предоставляет jQuery!

В обработчике событий вы можете проверить поле jQuery event target, которое всегда устанавливается в элемент DOM, который инициировал событие. Если пользователь изменяет размер окна, target будет окном. Если пользователь изменяет размер #someDiv, target будет #someDiv.

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