新しいjquery mobile 1.0 alpha 1リリースを使用してモバイルアプリを構築していますが、ボタンのテキストを切り替えることができる必要があります。テキストの切り替えは正常に機能しますが、テキストの置換を実行するとすぐにcssフォーマットが壊れます。
混乱したフォーマットのスクリーンショット: http://awesomescreenshot.com/03e2r50d2
<div class="ui-bar">
<a data-role="button" href="#" onclick="Podcast.play(); return false" id="play">Play</a>
<a data-role="button" href="#" onclick="Podcast.download(); return false" id="download">Download</a>
<a data-role="button" href="#" onclick="Podcast.consumed(); return false" id="consumed">Mark Old</a>
</div>
$("#consumed").text("Mark New");
ボタンを作成すると、いくつかの追加要素、いくつかの内部<span>
次のような要素:
<a data-role="button" href="#" onclick="Podcast.consumed(); return false" id="consumed">
<span class="ui-btn-inner ui-btn-corner-all">
<span class="ui-btn-text">Mark Old</span>
</span>
</a>
テキストを変更するには、次のセレクターが必要です。
$("#consumed .ui-btn-text").text("Mark New");
<a data-role="button" href="#" id="consumed">Mark Old</a>
あなたはしたい:
$('#consumed').text('Mark New');
$('#consumed').button('refresh');
その理由は、変更がjQuery mobileの将来のバージョンと後方互換性を持つようにするためです。
これとさまざまなオプションをオンラインで読み、より簡単な解決策があると思います。 data-role = "button"属性を使用してボタンに変換するリンクに対して確実に機能します。
ボタンのテキストを別のスパンに配置し、JavaScriptでスパンの内容を変更するだけです。
例えば.
<a data-role="button" href="#" id="consumed"><span id="oldBtnText">Mark Old</span></a>
その後、単純な
$('#oldBtnText').html("Old");
仕事をします。また、jQueryの構造が変更されても問題になりません。
リンクベースのボタン、または<input type="button">
ボタン。あなたが持っているなら
<input type="button" id="start-button" val="Start"/>
または
<a href="#" data-role="button" id="start-button">Start</a>
どちらの方法でも、表示されたテキストを変更できます
$("#start-button").changeButtonText("Stop");
プラグインは次のとおりです。
(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);
... jQuery Mobileがこれらのボタンを正確にレンダリングする方法に依存関係をコードに振りかけることはお勧めできません。プログラミングルール:ハックを使用する必要がある場合は、十分に文書化された再利用可能なコードチャンクに分離します。
これは私のために働く:
$('#idOfOriginalButton').prev('.ui-btn-inner').children('.ui-btn-text').html('new text');
解決策: http://forum.jquery.com/topic/changing-text-works-except-for-buttons
マークアップのような
<button id="consumed">Mark Old</button>
$("#consumed").html("Mark New");
$("span > span", $("#consumed").parent()).html("Mark New");
JQM 1.3.1(おそらく以前?)では、シンプルな.text()がサポートされているようです。
何らかの理由で、ボタンテキストを初めて変更するときに、「ui-btn-text」クラスのスパンがありません。だから私はこれを次のように回避します:
var button = $("#consumed");
var innerTextSpan = button.find(".ui-btn-text");
// not initialized - just change label
if (innerTextSpan.size() == 0) {
button.text(label);
// already initialized - find innerTextSpan and change its label
} else {
innerTextSpan.text(label);
}
簡単なソリューションに興味がある人のために、 Audero Text Changer というプラグインを作成しました。
新しいjqueryモバイルバージョンでは、ボタン内に内部spanタグがあります。
したがって、「a」タグのテキストを変更するのではなく、内側のスパンのテキストを変更する必要があります。
例えば.
$( "#consumed .ui-btn-text")。text( "test");