JQuery Mobileページを動的に強化するにはどうすればよいのだろうか?
私はこれらの方法を使用しようとしました:
$('[data-role="page"]').trigger('create');
そして
$('[data-role="page"]').page();
また、チェックボックスのみの拡張マークアップを防ぐにはどうすればよいですか?
この記事は、ブログの一部としても見つけることができます[〜#〜] here [〜#〜]。
動的に作成されたコンテンツマークアップを強化する方法はいくつかあります。 jQuery Mobileページに新しいコンテンツを動的に追加するだけでは不十分です。新しいコンテンツは従来のjQueryで拡張する必要がありますモバイルスタイリング。これはかなり重いタスクを処理するため、いくつかの優先順位が必要です。可能な場合はjQuery Mobileできるだけ強化を行う必要がありません。 1つのコンポーネントのみをスタイルする必要がある場合は、ページ全体を拡張しないでください。
これはどういう意味ですか?ページプラグインがpageInitイベントをディスパッチするとき、ほとんどのウィジェットは自身を自動初期化するために使用します。ページで見つかったウィジェットのインスタンスを自動的に強化します。
ただし、クライアント側で新しいマークアップを生成するか、Ajaxを介してコンテンツをロードしてページに挿入する場合、createイベントをトリガーして、新しいマークアップに含まれるすべてのプラグインの自動初期化を処理できます。これは任意の要素(ページdiv自体も)でトリガーでき、各プラグインを手動で初期化するタスク(リストビューボタン、選択など)を節約できます。
これを念頭に置いて、拡張レベルについて説明しましょう。それらの3つがあり、それらはより少ないリソースを要求するものからより高いものにソートされます。
重要:以下の拡張方法は、現在/アクティブなページでのみ使用されます。動的に挿入されたページの場合、それらのページとそのコンテンツは、DOMに挿入されると拡張されます。アクティブページ以外の動的に作成されたページでメソッドを呼び出すと、エラーが発生します。
すべてのjQuery Mobileウィジェットは動的に拡張できます。
Listview :
マークアップの強化:
$('#mylist').listview('refresh');
リストビュー要素の削除:
$('#mylist li').eq(0).addClass('ui-screen-hidden');
拡張の例: http://jsfiddle.net/Gajotres/LrAyE/
refresh()メソッドはリストに追加された新しいノードにのみ影響することに注意してください。これはパフォーマンス上の理由で行われます。
リストビューのハイポイントの1つは、フィルタリング機能です。残念ながら、何らかの理由で、jQuery Mobileは既存のリストビューにフィルターオプションを動的に追加できません。幸いなことに、回避策があります。可能であれば、現在のリストビューを削除し、ファイラーオプションをオンにして別のリストビューを追加します。
これが実際の例です: https://stackoverflow.com/a/15163984/18486
$(document).on('pagebeforeshow', '#index', function(){
$('<ul>').attr({'id':'test-listview','data-role':'listview', 'data-filter':'true','data-filter-placeholder':'Search...'}).appendTo('#index [data-role="content"]');
$('<li>').append('<a href="#">Audi</a>').appendTo('#test-listview');
$('<li>').append('<a href="#">Mercedes</a>').appendTo('#test-listview');
$('<li>').append('<a href="#">Opel</a>').appendTo('#test-listview');
$('#test-listview').listview().listview('refresh');
});
マークアップの強化:
$('[type="button"]').button();
拡張の例: http://jsfiddle.net/Gajotres/m4rjZ/
もう1つ、ボタンを作成するためにinput要素を使用する必要はありません。基本的なdivで行うこともできます。以下に例を示します。 http://jsfiddle.net/Gajotres/L9xcN/
マークアップの強化:
$('[data-role="navbar"]').navbar();
拡張の例: http://jsfiddle.net/Gajotres/w4m2B/
動的navbarタブを追加する方法を以下に示します。 http://jsfiddle.net/Gajotres/V6nHp/
そしてもう1つpagebeforecreateイベント: http://jsfiddle.net/Gajotres/SJG8W/
マークアップの強化:
$('[type="text"]').textinput();
マークアップの強化:
$('[type="range"]').slider();
拡張の例: http://jsfiddle.net/Gajotres/caCsf/
Pagebeforecreateイベント中の強化例: http://jsfiddle.net/Gajotres/NwMLP/
スライダーは動的に作成するには少しバグがあります。詳細については、こちらを参照してください。 https://stackoverflow.com/a/15708562/18486
マークアップの強化:
$('[type="radio"]').checkboxradio();
または、別のラジオボックス/チェックボックス要素を選択/選択解除する場合:
$("input[type='radio']").eq(0).attr("checked",false).checkboxradio("refresh");
または
$("input[type='radio']").eq(0).attr("checked",true).checkboxradio("refresh");
マークアップの強化:
$('select').selectmenu();
残念ながら、折りたたみ可能な要素は特定の方法で拡張できないため、代わりにtrigger( 'create')を使用する必要があります。
マークアップの強化:
$(".selector").table("refresh");
これはテーブル拡張の標準的な方法ですが、この時点では機能しません。したがって、代わりにtrigger( 'create')を使用してください。
パネル-New
パネルマークアップの強化:
$('.selector').trigger('pagecreate');
パネルのコンテンツの動的な追加のマークアップの強化:
$('.selector').trigger('pagecreate');
ページ全体のコンテンツを生成/再構築する場合、一度にすべてを実行するのが最善であり、これを使用して実行できます。
$('#index').trigger('create');
拡張の例: http://jsfiddle.net/Gajotres/426NU/
残念ながら、私たちにとってtrigger( 'create')はヘッダーとフッターのマークアップを強化できません。その場合、大きな銃が必要です。
$('#index').trigger('pagecreate');
拡張の例: http://jsfiddle.net/Gajotres/DGZcr/
これは公式のjQuery Mobileドキュメントで見つけることができないため、ほとんど神秘的な方法です。それでも、jQuery Mobileバグトラッカーで簡単に見つかります。バグトラッカーは、本当に必要な場合を除き、使用しないように警告します。
注:。trigger( 'pagecreate');は、ページの更新ごとに1回しか使用できないと仮定すると、正しくないことがわかりました。
http://jsfiddle.net/Gajotres/5rzxJ/
サードパーティの拡張プラグインがいくつかあります。既存のメソッドの更新として作成されるものと、壊れたjQM機能を修正するために作成されるものがあります。
ボタンのテキストの変更
残念ながら、このプラグインの開発者は見つかりませんでした。オリジナルSOソース: ボタンテキストjqueryモバイルの変更
(function($) {
/*
* Changes the displayed text for a jquery mobile button.
* Encapsulates the idiosyncracies of how jquery re-arranges the DOM
* to display a button for either an <a> link or <input type="button">
*/
$.fn.changeButtonText = function(newText) {
return this.each(function() {
$this = $(this);
if( $this.is('a') ) {
$('span.ui-btn-text',$this).text(newText);
return;
}
if( $this.is('input') ) {
$this.val(newText);
// go up the tree
var ctx = $this.closest('.ui-btn');
$('span.ui-btn-text',ctx).text(newText);
return;
}
});
};
})(jQuery);
ページのヘッダーとフッターのコンテンツの高さが一定の場合、divは簡単なCSSトリックで使用可能なスペース全体をカバーするように簡単に設定できます。
#content {
padding: 0;
position : absolute !important;
top : 40px !important;
right : 0;
bottom : 40px !important;
left : 0 !important;
}
そして、これはGoogle maps api3
デモ: http://jsfiddle.net/Gajotres/7kGdE/
このメソッドは、コンテンツの正しい最大の高さを取得するために使用でき、pageshowイベントで使用する必要があります。
function getRealContentHeight() {
var header = $.mobile.activePage.find("div[data-role='header']:visible");
var footer = $.mobile.activePage.find("div[data-role='footer']:visible");
var content = $.mobile.activePage.find("div[data-role='content']:visible:visible");
var viewport_height = $(window).height();
var content_height = viewport_height - header.outerHeight() - footer.outerHeight();
if((content.outerHeight() - header.outerHeight() - footer.outerHeight()) <= viewport_height) {
content_height -= (content.outerHeight() - content.height());
}
return content_height;
}
そして、これがライブのjsFiddleの例です: http://jsfiddle.net/Gajotres/nVs9J/
覚えておくべきことが1つあります。この関数は、利用可能な最大のコンテンツの高さを正しく取得し、同時に同じコンテンツを拡大するために使用できます。残念ながら、imgをコンテンツ全体の高さに拡大するために使用することはできません。imgタグには3pxのオーバーヘッドがあります。
これはいくつかの方法で実行できますが、目的の結果を得るにはそれらを組み合わせる必要がある場合があります。
方法1:
次の属性を追加することで実行できます。
data-enhance="false"
ヘッダー、コンテンツ、フッターコンテナーに。
これは、アプリの読み込み段階でも有効にする必要があります。
$(document).one("mobileinit", function () {
$.mobile.ignoreContentEnabled=true;
});
jquery-mobile.jsが初期化される前に初期化します(以下の例を見てください)。
詳細については、こちらをご覧ください。
http://jquerymobile.com/test/docs/pages/page-scripting.html
例: http://jsfiddle.net/Gajotres/UZwpj/
ページを再作成するには、これを使用します。
$('#index').live('pagebeforeshow', function (event) {
$.mobile.ignoreContentEnabled = false;
$(this).attr('data-enhance','true');
$(this).trigger("pagecreate")
});
方法2:
2番目のオプションは、次の行を使用して手動で行うことです。
data-role="none"
方法3:
特定のHTML要素は、マークアップの強化を防ぐことができます。
$(document).bind('mobileinit',function(){
$.mobile.page.prototype.options.keepNative = "select, input";
});
例: http://jsfiddle.net/Gajotres/gAGtS/
再びjquery-mobile.jsが初期化される前に初期化します(以下の例を見てください)。
リストビューのようにコンポーネントを最初から作成するときに、このエラーが発生することがあります。
初期化前にリストビューのメソッドを呼び出すことはできません
これは、マークアップ拡張の前にコンポーネントを初期化することで防止できます。これは、これを修正する方法です。
$('#mylist').listview().listview('refresh');
何らかの理由でデフォルトのjQuery Mobile CSSを変更する必要がある場合は、!important
オーバーライド。デフォルトのcssスタイルは変更できません。
例:
#navbar li {
background: red !important;
}
jsFiddle
例: http://jsfiddle.net/Gajotres/vTBGa/
JQMobile 1.4から、すべての子で.enhanceWithin()を実行できます http://api.jquerymobile.com/enhanceWithin/
var content = '<p>Hi</p>';
$('#somediv').html(content);
$('#somediv').enhanceWithin();