2010-09-27 8 views

Odpowiedz

24

Spróbuj:

something.val(something.val() == 'string1' ? 'string2' : 'string1'); 

To się nazywa trójskładnikowych wyrażenie.

+0

Dokładnie tego, czego szukałem - dzięki! – Bojangles

+5

Ale to spowoduje ustawienie 'string1', nawet jeśli wartość to' string3', nie tylko dla 'string2' –

+0

@ dev-null-dweller to nie problem - przełączam tekst w przycisku pomiędzy" Reply "a" "Anuluj" :) – Bojangles

0
something.val(something.val() == 'string1'? 'string2' : 'string1'); 

lub wyjaśnienia

val astring = something.val() == 'string1'? 'string2' : 'string1'; 
something.val(astring); 
1

To znaczy, aby użyć operatora potrójny:

something.val((something.val() == 'string1') ? 'string2' : 'string1'); 
+0

dlaczego zgrywasz obiekt jquery z powrotem? – jcolebrand

7

Look mA, żaden operator trójargumentowy!

Poniższe działa z powodu wyrażeń logicznych zwarć JavaScript.

Jeśli something == string1 następnie ocenić string2 - od string2 jest truthy wartość i następny wyraz polega operacja OR nie ma potrzeby, aby kontynuować. Zatrzymaj i zwróć string2.

Jeśli something !== string1 to pominie następny operand, ponieważ jeśli jest fałszywe, nie ma sensu oceniać następnego argumentu (z AND). To "przeskoczy" do operacji OR i zwróci string1.

function toggleString(something, string1, string2) { 
    return something == string1 && string2 || string1; 
} 

something.val(toggleString(something.val(), "string1", "string2")); 

Jeśli chcesz zadanie zrobienia:

function toggleValue(something, string1, string2) { 
    something.val(something.val() == string1 && string2 || string1); 
} 

toggleValue(something, "string1", "string2"); // something is a jQuery collection 

w końcu jednak chciałbym skończyć się za pomocą operatora potrójny ponieważ rozwiązanie to może być niejasne dla innych programistów. Jeśli pochodzisz z Javy lub innych języków, możesz oczekiwać, że funkcja zwróci wartość logiczną z powodu wszystkich operatorów boolowskich.

+0

Ok, więc musisz jeszcze przypisać gdzieś "coś". Nie przypisałeś, tylko porównałeś. – jcolebrand

+0

@Daniel ... tak, wiem o tym. Chodzi mi bardziej o to, że trójpierścienie czyta się szybciej, i wciąż musisz pokazać zadanie w swoim sprytnym poście;) – jcolebrand

+0

+1 sprytne rozwiązanie, chociaż powinieneś wyjaśnić, * dlaczego * to działa. –

0
something.val(something.val() == 'string1' ? 'string2' : 'string1'); 
2

Jak na temat korzystania @ kodu Daniela wraz z funkcji jquery:

$.fn.toggleVal = function (str1, str2) { 
    return this.val(this.val() == str1 && str2 || str1); 
}; 
$("input").toggleVal('string 1', 'string 2'); 
+1

Naprawdę nie ma żadnej korzyści z używania mojego rozwiązania przez operatora trójskładnikowego - po prostu pomyślałem, że byłoby miło zaoferować alternatywną wersję :). Nice though! nie jest "tym" już obiektem jQuery? Nie trzeba więc owijać go funkcją '$'. Ponadto jQuery prawdopodobnie zwraca 'this' podczas wywoływania' val' jako ustawiającego, więc możesz połączyć te dwie linie w pojedynczą instrukcję return. –

+0

Rzeczywiście masz rację. Dzięki za cynk :) Zaktualizuję kod. I podoba mi się twój przez operatora trójskładnikowego, bo znaki zapytania mnie przerażają: P – fehays

1

Jako jQuery 1.4, można to zrobić:

something.val(function(index, val) { 
    return val == 'string1' ? 'string2' : 'string1'; 
}); 
+0

Mały kompleks, ale dziękuję :-) – Bojangles

2

Innym sposobem, aby to zrobić za pomocą obiektu właściwości:

{ 'string1': 'string2', 'string2': 'string1' }[value] 

Podobnie jak w wersji qu estation:

something.val(
    { 'string1': 'string2', 'string2': 'string1' }[something.val()] 
) 
+0

To jest niezmiernie pytanie, ale jeśli masz zamiar odpowiedzieć na to, być może możesz dodać przykładową implementację, zauważ, że większość przegłosowanych odpowiedzi robi. Pozdrawiam – webLacky3rdClass

+0

Bardzo sprytny! Kusiłbym się, by go użyć, ale z dwóch powodów; 1, nie jest od razu jasne, co ten kod robi i 2, obecnie użyłbym destrukcji ES6 jak '[string2, string1] = [string1, string2]' – Bojangles

+0

@Bojangles two switch two string, yes, ale jak byś użył ES6 funkcje oryginalnego pytania? – kolossal7

Powiązane problemy