2010-10-24 23 views
33

Używam nowego wydania jquery mobile 1.0 alpha 1 do zbudowania aplikacji mobilnej i muszę mieć możliwość przełączania tekstu przycisku. Przełączanie tekstu działa dobrze, ale zaraz po dokonaniu zamiany tekstu formatowanie css zostanie zerwane.Przycisk zmiany jquery mobile

Zrzut ekranu zawiedli formatowania: 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"); 
+3

dlaczego używasz onclick w HTML z jQuery w miejscu ??? – naugtur

Odpowiedz

67

Podczas tworzenia przycisku to dodaje kilka dodatkowych elementów, niektóre wewnętrzne <span> elementy, które wyglądają tak:

<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> 

Aby zmienić tekst , potrzebujesz tego selektora:

$("#consumed .ui-btn-text").text("Mark New"); 
+0

działa jak mistrz, dzięki! –

+0

@CaffeineFueled - welcome :) –

+17

Powinien istnieć lepszy sposób osiągnięcia tego, np. Za pomocą '$ ('ul') .listview ('refresh');' call, aby zaktualizować listę. Chociaż opisany sposób działa, bierze pod uwagę wewnętrzną wiedzę o tym, jak wygląda końcowy układ elementów. Ten szczegół implementacji może się zmienić w przyszłości. Ale ponieważ jQuery mobile jest wciąż w fazie alfa, +1 dla pragmatycznego rozwiązania. –

1

Dla znaczników jak

<button id="consumed">Mark Old</button> 

$("#consumed").html("Mark New"); 
$("span > span", $("#consumed").parent()).html("Mark New"); 
+0

Chciałbym móc zagłosować na ciebie więcej niż jeden :) – Iducool

8

Napisałem prosty plugin to zrobić dla obu przycisku łącza oparte lub przycisku <input type="button">. Więc jeśli masz

<input type="button" id="start-button" val="Start"/> 

lub

<a href="#" data-role="button" id="start-button">Start</a> 

Tak czy inaczej, można zmienić wyświetlany tekst z

$("#start-button").changeButtonText("Stop"); 

Oto plugin:

(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); 

... ponieważ zraszanie kodu uzależnia od exac sposób, w jaki jQuery Mobile wyświetla te przyciski, nie jest dobrym pomysłem. Reguła programowania: jeśli musisz użyć hacka, odizoluj go od dobrze udokumentowanego, wielokrotnego użytku fragmentu kodu.

+0

Podoba mi się to rozwiązanie, ponieważ jeśli klasa .ui-btn-text zmieni się pewnego dnia w jQuery Mobile, będzie tylko kilka linii kodu do zmiany zamiast pakietu html i javascript. – Libby

+0

najlepsze rozwiązanie, działa jak urok, również jak Libby zauważył, że hack jest czysty przez abstrakcję. –

3

Działa to dla mnie:

$('#idOfOriginalButton').prev('.ui-btn-inner').children('.ui-btn-text').html('new text'); 

rozwiązanie od: http://forum.jquery.com/topic/changing-text-works-except-for-buttons

+1

+1, ponieważ pozwala to zmienić tekst po kliknięciu przycisku. '$ (" button "). bind (" kliknięcie ", funkcja (event, ui) { \t \t $ (this) .prev (". ui-btn-inner "). children ('. ui-btn-text „) .html (” nowy tekst "); \t \t return false; \t});' – styfle

12
<a data-role="button" href="#" id="consumed">Mark Old</a> 

Chcecie:

$('#consumed').text('Mark New'); 
$('#consumed').button('refresh'); 

Powodem jest umożliwienie zmiany być wstecznie kompatybilny z przyszłymi wersjami jQuery mobile.

+0

metoda ta nie powiedzie się z «nieprzechwyconego wyjątek: nie można wywołać metody na przycisk przed inicjalizacja; usiłował wywołać metodę«odświeżania»», gdy Próbuję tego (Firefox 12.0). Zaakceptowana odpowiedź zadziałała dla mnie. Korzystanie z jQM 1.1.0 i jQ 1.7.1. – PahJoker

+0

Przyjęta odpowiedź jest nieco bzdurą, mimo że działa, chcesz używać interfejsu API jQuery w jak największym stopniu, aby zapewnić kompatybilność w przyszłości. Ta odpowiedź będzie działała poprawnie po zainicjowaniu przycisku, upewnij się, że owinąłeś kod w '$ (document) .ready (function() {...});' –

+0

To nie działa, nawet jeśli przycisk jest zainicjowany . http://jsfiddle.net/4Bgx7/1405/ – Alejo

9

Przeczytałem tę i różne opcje w Internecie i sądzę, że mogę mieć prostsze rozwiązanie. Z pewnością działa dla linków, które zamieniasz w przycisk z atrybutem data-role = "button".

Po prostu umieść tekst przycisku w osobnym przęśle, a następnie zmień jego zawartość w JavaScript.

np.

<a data-role="button" href="#" id="consumed"><span id="oldBtnText">Mark Old</span></a> 

Wtedy prosty

$('#oldBtnText').html("Old"); 

będzie wykonać zadanie.Nie powinno to stanowić problemu, jeśli jQuery zmieni ich strukturę.

+1

To było jedyne podejście, które działało w jQM 1.4.0. Nie widzę zagnieżdżonych przęseł, do których Nick odwołuje się w swojej odpowiedzi. – DOK

+0

B-E-A-U-T-I-F-U-L. To taki żart kosztownego wiecznego pióra, który działa w kosmosie przeciwko rozwiązaniu ołówkowemu. –

0

W nowej wersji mobilnej jQuery wewnątrz przycisku znajduje się wewnętrzny znacznik zakresu.

Nie należy zatem zmieniać tekstu znacznika "a", ale zmieniać tekst wewnętrznej przęsła.

np.

$ ("# spożywany .ui-btn-text"). Text ("test");

0

Od JQM 1.3.1 (może wcześniej?) Prosty .text() wydaje się być obsługiwany.

0

Z jakiegoś powodu nie mam przypisanego zakresu "ui-btn-text" po raz pierwszy, gdy chcę zmienić tekst przycisku. Więc obejść to tak:

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); 
}