私は自分のサイトのモバイル版に取り組んでいます。メディアクエリと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のリンクをクリックすると、アラートが表示されます。どうしたんだ?
$(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
});
});
受け入れられた答えのバニラジャバスクリプトバージョンはここにあります
document.addEventListener('DOMContentLoaded', function() {
// Store the window width
var windowWidth = window.innerWidth
// Resize Event
window.addEventListener("resize", function() {
// Check window width has actually changed and it's not just iOS triggering a resize event on scroll
if (window.innerWidth != windowWidth) {
// Update the window width for next time
windowWidth = window.innerWidth
// Do stuff here
}
// Otherwise do nothing
})
})
幅を指定する必要がありました:
<meta name="viewport" content="width=1000, initial-scale=1.0, user-scalable=yes">
スタイル:
html, body
{
height:100%;
width:100%;
overflow:auto;
}
非タッチデバイスでのみサイズ変更イベントの効果を持ちたいという仮定は間違っていますか?その場合、Modernizrを使用して次のようなチェックを行うことができます。
$(window).resize(function(e){
if(Modernizr.touch) {
e.preventDefault();
}
});
StackOverflow自体で解決策を見つけました ソリューションのリンク 。これは、sidonaldson
による答えであり、このような以前に直面した問題の解決に役立ちました。 ty
答えは:
var cachedWidth = $(window).width();
$(window).resize(function(){
var newWidth = $(window).width();
if(newWidth !== cachedWidth){
//DO RESIZE HERE
cachedWidth = newWidth;
}
});
@ 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'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
});
});
ページが読み込まれたときにアドレスバーを非表示にするために、HTMLボディラッパーを明示的にスクロールしているかどうかを確認します。