Как обнаружить в jquery, если разрешение экрана меняется? - PullRequest
30 голосов
/ 20 декабря 2011

Как я могу сделать так, чтобы каждый раз, когда пользователь изменял размер разрешения экрана [не окна браузера], страница выполняла функцию?

Ответы [ 6 ]

36 голосов
/ 20 декабря 2011

Хорошо, значит, вы используете jQuery. Итак, давайте создадим для него специальное событие.

(function () {
    var width = screen.width,
        height = screen.height;
    setInterval(function () {
        if (screen.width !== width || screen.height !== height) {
            width = screen.width;
            height = screen.height;
            $(window).trigger('resolutionchange');
        }
    }, 50);
}());

Теперь $(window).bind('resolutionchange', fn) должен делать то, что вы хотите.

17 голосов
/ 20 декабря 2011

$(window).resize()

http://api.jquery.com/resize/

$(window).resize(function() {

alert('window was resized!');

});
9 голосов
/ 20 декабря 2011

Попробуйте отследить screen.width и screen.height. Они будут возвращать разные значения при изменении разрешения экрана. Подробнее здесь .

function doSomething(){
    if ( screen.width < 1280 ){
        console.log('Too small')
    }else{
        console.log('Nice!')
    }
}

Однако, Насколько я знаю нет никаких событий, инициируемых при изменении разрешения экрана; Это означает, что вы не можете сделать это $(screen).resize(function(){/*code here*/});

Так что другим способом сделать это будет использование setTimeout(), например: [ не рекомендуется ]

var timer,
    checkScreenSize = function(){
        if ( screen.width < 1280 ){
            console.log('Too small')
        }else{
            console.log('Nice!')
        }
        timer = setTimeout(function(){ checkScreenSize(); }, 50);
    };

checkScreenSize();

В рекомендуемой версии будет использоваться requestAnimationFrame . Как описано здесь Полом Ирландским. Потому что, если вы запускаете цикл на невидимой вкладке, браузер не будет его запускать. Для лучшей общей производительности.

// shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       || 
          window.webkitRequestAnimationFrame || 
          window.mozRequestAnimationFrame    || 
          window.oRequestAnimationFrame      || 
          window.msRequestAnimationFrame     || 
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();


// usage: 
// instead of setInterval(checkScreenSize, 50) ....

(function loop(){
  requestAnimFrame(loop);
  checkScreenSize();
})();

[обновление]

Для тех, кто хочет реализовать requestAnimationFrame в ответ Натана , вот и все; Пользовательское событие jQuery, которое вызывается при изменении разрешения, использует requestAnimationFrame , когда доступно для меньшего использования памяти:

window.requestAnimFrame = (function(){
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function( callback ){ window.setTimeout(callback, 1000 / 60); };
})();

var width = screen.width,
    height = screen.height,
    checkScreenSize = function () {
        if (screen.width !== width || screen.height !== height) {
            width = screen.width;
            height = screen.height;
            $(window).trigger('resolutionchange');
        }
    };

(function loop(){
  requestAnimFrame(loop);
  checkScreenSize();
})();

Использование:

$(window).bind('resolutionchange', function(){
    console.log('You have just changed your resolution!');
});
3 голосов
/ 20 декабря 2011

Поскольку вы можете только изнутри определенного окна браузера проверять изменения в этом же окне браузера, невозможно узнать об изменениях разрешения дисплея.

Однако, если окно браузера также изменяется при изменении разрешения экрана, вы можете поймать это с помощью прослушивателя в window.width и window.height.

edit: кажется, мы можем получитьинформация, которую вы хотите получить от глобального объекта window.screen.См. https://developer.mozilla.org/en/DOM/window.screen.height и https://developer.mozilla.org/en/DOM/window.screen.width для получения дополнительной информации!

2 голосов
/ 03 марта 2013

Попробуйте это js:

var width = $(window).width();
var height = $(window).height(); 
var screenTimer = null;

function detectScreen (){
    $(window).resize(function() {
      height = $(window).height(); 
      width = $(window).width(); 
        getScreen ();
    });

    function getScreen (){
        return { 'height' : getHeight (), 'width': getWidth () };
    }
    screenTimer = setInterval ( getScreen (), 50 );
}
function getHeight (){
    console.log ( 'height: ' + height);
    $('#height').text(height);
    return height;
}
function getWidth (){
    console.log ( 'width: ' + width);
    $('#width').text(width);
     return width;   
}
detectScreen ();

$('#go').click (function (){
    detectScreen ();
});

$('#stop').click (function (){
    clearInterval(screenTimer);
});

И для html:

<span id="stop">Stop</span> | <span id="go">Go</span>
<br>
<div>height: <span id="height"></span> px</div>
<div>width: <span id="width"></span>px </div>
1 голос
/ 20 декабря 2011

Следующая функция запускает изменение размера окна, а также изменение разрешения, а также имеет задержку, чтобы избежать нескольких вызовов, пока пользователь изменяет размеры окна.

Я настроил скрипту дляВы здесь:

http://jsfiddle.net/EJK5L/

Изменить разрешение и функцию оповещения вас.Вы можете выполнять любую функцию, какую хотите.

Надеюсь, это поможет.

...