jQueryMobileで動的に挿入した要素(例えばフォームのセレクトメニューなどをページ表示後に新たに書き換えた場合など)のCSSが適用されない場合の対処法。
結論から言うと、
$(“#textbox”).html(str).trigger(“create”);
などの形で、.trigger(“create”)メソッドを発効させる必要がある。
わたしが作成しようとしたのは、「セレクトメニューを変更すると選択した数に応じてページ上のテキストボックスの数も変化する」というもの。
こんなイメージ。
サンプルをダウンロード
jQueryMobileでのhtmlメソッドで
// 要素数セレクタを生成
var str = "";
for(var i=1; i<=100; i++){
if(i == n){
str += "<option value='" + i + "' selected>" + i + "</option>";
continue;
}
str += "<option value='" + i + "'>" + i + "</option>";
}
$("#numberOfTextbox").html(str);
などとすると設定したIDのタグ(この場合は、#numberOfTextbox)のHTML部分が書き換わる。
この記述は、最初にページが表示された直後は問題ないが、ページ表示後に何かのタイミングで.html()メソッドのみを使ってページを書き換えようとするとCSSがjQueryMobileのものではなく普通の表示になってしまう。
.html()メソッドの後に続けて.trigger(“create”)メソッドを記述してあげるとjQueryMobileのCSSがきちんと適用される。
このサンプルでわたしは同じタグの要素に順番にアクセスできるeqメソッドの使い方も学んだ。
例えばliタグのインデックス番号3番目の値を取得するなら、
var hoge = $(“li”).eq(3).val();
のように使う。(インデックス番号は0から開始)
サンプル中でも、
// .textboxクラスを持つタグの要素数を取得
var len = $(".textbox").size();
// 文字列要素を数値型に変換
var n = new Array();
for(var i=0; i<len; i++){
n[i] = Number($(".textbox").eq(i).val()); // eqで要素インデックスにアクセスし、valメソッドで値を取得
}
のように使っている。(この場合、textboxという名前のクラスをつけた要素にアクセスしている)
なお、size()メソッドで要素数の取得もできる。
valメソッドは、値の設定もできる。
// テキストボックスの値を書き換え
for(var i=0; i<len; i++){
$(".textbox").eq(i).val(n[i]);
}
上記サンプルの全ソースコード
HTML部分
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- for iPhone -->
<meta name="viewport" content="width=device-width ,initial-scale=1.0 ,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
<meta name="apple-mobile-web-app-capable" content="yes"/> <!--フルスクリーンモード-->
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<!-- /for iPhone -->
<!-- for jQuery -->
<link rel="stylesheet" href="jquery/css/jquery.mobile-1.3.0.min.css"/>
<script src="jquery/jquery.js"></script>
<script src="main.js"></script>
<script src="jquery/jquery.mobile-1.3.0.min.js"></script>
<!-- /for jQuery -->
<title>バブルソート</title>
<style>
p{
font-family: 'メイリオ', Osaka;
}
strong{
font-weight: 900;
font-size:2em;
}
</style>
</head>
<body>
<section id="index" data-role="page" data-title="バブルソート">
<div data-role="header" data-position="fixed" data-theme="b">
<h1>バブルソート</h1>
<a href="#info" class="ui-btn-left" data-transition="fade" data-icon="info" data-iconpos="notext">Info</a>
</div>
<div data-role="content" data-theme="c">
<div data-role="fieldcontain">
<label for="flip-order">Select order:</label>
<select name="order" id="flip-order" data-role="slider">
<option value="asc">昇順</option>
<option value="desc">降順</option>
</select>
</div>
<div data-role="fieldcontain">
<label for="numberOfTextbox">要素数:</label>
<select id="numberOfTextbox" onchange="setTextBox(this.value)">
</select>
<button onclick="bubbleSort()">並べ替える</button>
</div>
<div id="textbox" data-role='fieldcontain'></div>
</div>
<footer data-role="footer" data-position="fixed" data-theme="b">
Copyright 2014 torisky.com
</footer>
</section>
<!-- 情報 -->
<section id="info" data-role="page" data-title="Info">
<header data-role="header" data-position="fixed" data-theme="b">
<a href="#index" data-transition="fade" data-icon="home" data-iconpos="notext">戻る</a>
<h1>Info</h1>
</header>
<div data-role="content" data-theme="c">
<h2>バブルソートのアルゴリズム</h2>
<p>バブルソートのアルゴリズムを以下に示す<br>
<em>JavaScript</em>での記述
</p>
<pre>
※MAXは並べ替える配列の要素数
for(var i=0; i<MAX-1; i++){
for(var j=i+1; j<MAX; j++){
if(n[i] < n[j]){ // 降順の場合
var work = n[i];
n[i] = n[j];
n[j] = work;
}
}
}
</pre>
</div>
<footer data-role="footer" data-theme="b">
Copyright 2014 torisky.com
</footer>
</section>
</body>
</html>
JavaScript部分
/* main.js */
// テキストボックスの値を取得してバブルソートする
function bubbleSort(){
// ソート順を取得(昇順asc/降順desc)
var order = $("#flip-order").val();
// .textboxクラスを持つタグの要素数を取得
var len = $(".textbox").size();
// 文字列要素を数値型に変換
var n = new Array();
for(var i=0; i<len; i++){
n[i] = Number($(".textbox").eq(i).val()); // eqで要素インデックスにアクセスし、valメソッドで値を取得
}
// バブルソート
for(var i=0; i<len-1; i++){
for(var j=i+1; j<len; j++){
var formula = (order == "asc" ? formula = n[i] > n[j] : n[i] < n[j]);
if(formula){
var work = n[i];
n[i] = n[j];
n[j] = work;
}
}
}
// テキストボックスの値を書き換え
for(var i=0; i<len; i++){
$(".textbox").eq(i).val(n[i]); // valメソッドは値の設定もできる
}
}
// テキストボックスを生成する
function setTextBox(n){
var str = "";
for(var i=0; i<n; i++){
num = "box" + i;
digit = Math.floor(Math.random() * 1000);
str += "<input type='text' class='textbox' name='" + num +"' value='" + digit + "'>";
}
$("#textbox").html(str).trigger("create"); // .trigger("create")
// 動的に挿入されたフォーム要素の初期化
}
// ページロード時にHTML書き換え
$(function(){
var n = 5; // 最初に表示するテキストボックスの数
setTextBox(n);
// 要素数セレクタを生成
var str = "";
for(var i=1; i<=100; i++){
if(i == n){
str += "<option value='" + i + "' selected>" + i + "</option>";
continue;
}
str += "<option value='" + i + "'>" + i + "</option>";
}
$("#numberOfTextbox").html(str);
});


コメント