jQuery Mobile でアプリケーションを作成しました。ページが表示されるたびに、一部の要素を非表示/表示するために、いくつかの JavaScript を実行する必要があります (セッション状態によって異なります)。
私はこれに多くの時間を費やしましたが、JavaScript が期待どおりに要素を非表示にしない理由を理解できません。少しランダムに思えます。実際、DOM は一貫しているように見えます。非表示にする必要がある要素と表示される要素には がありdisplay: none
ますがdisplay: block
、ブラウザで表示できるものと一致しません。
私は問題を非常に単純なケースにまで減らすことができました。これは基本的なボイラープレート テンプレートに JavaScript を追加したものです。
page1.html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
<script src="test.js"></script>
</head>
<body>
<div data-role="page" id="page1">
<div data-role="header">
<h1>Page Title</h1>
<div id="el1">ELEMENT 1</div>
<div id="el2">ELEMENT 2</div>
</div><!-- /header -->
<div data-role="content">
<p>Page content goes here.</p>
<a href="page2.html">PAGE 2</a>
</div><!-- /content -->
<div data-role="footer">
<h4>Page Footer</h4>
</div><!-- /footer -->
</div><!-- /page -->
</body>
</html>
page2.html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0.1/jquery.mobile-1.0.1.min.js"></script>
<script src="test.js"></script>
</head>
<body>
<div data-role="page" id="page2">
<div data-role="header">
<h1>Page Title</h1>
<div id="el1">ELEMENT 1</div>
<div id="el2">ELEMENT 2</div>
</div><!-- /header -->
<div data-role="content">
<p>Page content goes here.</p>
<a href="page1.html">PAGE 1</a>
</div><!-- /content -->
<div data-role="footer">
<h4>Page Footer</h4>
</div><!-- /footer -->
</div><!-- /page -->
</body>
</html>
test.js
$(document).bind("pagechange", function(event, data) {
console.info('Changed to page: ' + data.toPage.attr('id'));
$('#el1').hide();
$('#el2').show();
});
これら 3 つのファイルをローカル サーバーに置くことで、簡単にテストできます。page1.html
とpage2.html
はほぼ同じページ (テスト用) で、test.js
hide#el1
と showだけ#el2
です。この JavaScript は、ページが変更されると常に正常に実行されます (コンソール ステートメントは常に表示されます) #el1
。
繰り返しになりますが、私が最も困惑しているのは、(Chrome コンソールで) DOM を直接見るとすべてが正しいように見えることです。CSS は明らかdisplay: none
に ですが、要素はまだ表示されています。
この問題の原因は何ですか?