Изменить текст кнопки jquery mobile
Я использую новую версию 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");
Ответы
Ответ 1
Когда вы создаете кнопку, она добавляет некоторые дополнительные элементы, некоторые внутренние элементы <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");
Ответ 2
<a data-role="button" href="#" id="consumed">Mark Old</a>
Вы хотите:
$('#consumed').text('Mark New');
$('#consumed').button('refresh');
Причина заключается в том, чтобы ваши изменения были обратно совместимы с будущими версиями jQuery mobile.
Ответ 3
Я прочитал это и различные варианты онлайн и думаю, что у меня может быть более простое решение. Он определенно работает для ссылок, которые вы превращаете в кнопку с атрибутом data-role = "button".
Просто поместите текст кнопки в отдельный диапазон, а затем измените содержимое диапазона в своем JavaScript.
например.
<a data-role="button" href="#" id="consumed"><span id="oldBtnText">Mark Old</span></a>
Тогда простая
$('#oldBtnText').html("Old");
Будет выполнять эту работу. Это также не должно быть проблемой, если jQuery изменяет их структуру.
Ответ 4
Я написал простой плагин для этого либо для кнопки на основе ссылок, либо для кнопки <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 отображает эти кнопки, это не очень хорошая идея. Правило программирования: если вы должны использовать хак, изолируйте его с хорошо документированным, повторно используемым фрагментом кода.
Ответ 5
Это работает для меня:
$('#idOfOriginalButton').prev('.ui-btn-inner').children('.ui-btn-text').html('new text');
решение:
http://forum.jquery.com/topic/changing-text-works-except-for-buttons
Ответ 6
Для разметки типа
<button id="consumed">Mark Old</button>
$("#consumed").html("Mark New");
$("span > span", $("#consumed").parent()).html("Mark New");
Ответ 7
В новой мобильной версии jquery внутри кнопки есть внутренний тег span.
Таким образом, вы не должны изменять текст тега 'a', но изменять текст внутреннего интервала.
например.
$( "# consumed.ui-btn-text" ). text ( "test" );
Ответ 8
Для тех, кто интересуется простым решением, я создал плагин под названием Audero Text Changer.
Ответ 9
Как и в JQM 1.3.1 (возможно, раньше?), поддерживается простой .text().
Ответ 10
По какой-то причине у меня нет класса "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);
}