2010-09-27 27 views
10

मैंजावास्क्रिप्ट के एक टुकड़े का उपयोग कर दो तारों के बीच टॉगल करने का कोई तरीका?

if(something.val() == 'string1') 
{ 
    something.val('string2'); 
} 
else if(something.val() == 'string2') 
{ 
    something.val('string1') 
} 

की तरह लेकिन कोड की एक पंक्ति में कुछ करना चाहता हूँ। मैं काफी याद नहीं कर सकते कि यह कैसे हुआ, लेकिन यह प्रश्न चिह्न और कोलन शामिल है ...

उत्तर

24

प्रयास करें:

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

यह एक त्रिगुट अभिव्यक्ति कहा जाता है।

+0

बिल्कुल वही जो मैं ढूंढ रहा था - धन्यवाद! – Bojangles

+5

लेकिन यह 'string1' सेट करेगा, भले ही मान 'string3' है, न केवल' string2' –

+0

@ dev-null-dweller के लिए यह कोई समस्या नहीं है - मैं 'उत्तर' के बीच एक बटन में टेक्स्ट टॉगल कर रहा हूं और 'रद्द करें' :) – Bojangles

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

या स्पष्टीकरण

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

के लिए आप त्रिगुट ऑपरेटर का उपयोग करने के लिए मतलब है:

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

आप jquery ऑब्जेक्ट को वापस क्यों पकड़ रहे हैं? – jcolebrand

7

देखो मा, कोई त्रिगुट ऑपरेटर!

निम्नलिखित कार्य करता है क्योंकि जावास्क्रिप्ट शॉर्ट सर्किट बूलियन अभिव्यक्तियां।

something == string1 तो string2 का मूल्यांकन है - string2 के बाद से एक truthy मूल्य है और अगले अभिव्यक्ति शामिल है या आपरेशन जारी रखने के लिए कोई जरूरत नहीं है। रोकें और string2 वापस करें।

यदि something !== string1 तो यह अगले ऑपरेंड को छोड़ देगा क्योंकि यदि यह गलत है, तो अगले ऑपरेंड (AND के साथ) का मूल्यांकन करने में कोई बात नहीं है। यह ओआर ऑपरेशन में "कूद" जाएगा और string1 लौटाएगा।

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

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

आप काम किया चाहते हैं: हालांकि

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

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

अंत में, मैं त्रिगुट ऑपरेटर उपयोग करते हुए आ सकती है क्योंकि इस समाधान अन्य प्रोग्रामर से स्पष्ट नहीं हो सकता है जाएगा। यदि आप जावा या अन्य भाषाओं से आते हैं, तो आप सभी बुलियन ऑपरेटर की वजह से फ़ंक्शन को बुलियन लौटने की उम्मीद कर सकते हैं।

+0

ठीक है, तो आपको अभी भी कहीं भी 'कुछ' को असाइन करना होगा। आपने असाइन नहीं किया था, आपने केवल तुलना की थी। – jcolebrand

+0

@ डैनियल ... हाँ, मुझे यह पता है। मेरा बिंदु टर्नरी की तुलना में तेज़ी से पढ़ता था, और आपको अभी भी अपनी चालाक पोस्ट में असाइनमेंट दिखाना होगा;) – jcolebrand

+0

+1 चालाक समाधान, हालांकि आपको यह समझा जाना चाहिए * क्यों * यह काम करता है। –

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

एक jQuery समारोह के साथ @ डैनियल कोड का उपयोग कर के बारे में कैसे:

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

एक टर्नरी ऑपरेटर पर मेरे समाधान का उपयोग करने के लिए वास्तव में कोई फायदा नहीं है - मैंने सोचा कि वैकल्पिक संस्करण पेश करना अच्छा होगा :)। अच्छा हालांकि! यह पहले से ही एक jQuery वस्तु नहीं है? तो इसे '$' फ़ंक्शन के साथ लपेटने की कोई आवश्यकता नहीं है। साथ ही, jQuery को 'वैल' को एक सेटर के रूप में कॉल करते समय शायद 'यह' लौटाता है, ताकि आप उन दो पंक्तियों को एक एकल लाइन रिटर्न स्टेटमेंट में विलय करने में सक्षम हो सकें। –

+0

वास्तव में आप सही हैं। टिप के लिए धन्यवाद :) मैं कोड अपडेट कर दूंगा। और मुझे टर्नरी ऑपरेटर पर आपका पसंद है क्योंकि प्रश्न चिह्न मुझे डराते हैं: पी – fehays

1

jQuery 1.4 के रूप में, आप यह कर सकते हैं:

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

थोड़ा जटिल, लेकिन धन्यवाद :-) – Bojangles

2

एक और तरीका है वस्तु का उपयोग कर यह करने के लिए गुण:

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

qu में जैसा अनुमान:

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

यह एक बेहद सवाल है, लेकिन यदि आप इसका उत्तर देने जा रहे हैं तो शायद आप एक उदाहरण कार्यान्वयन जोड़ सकते हैं, आप करेंगे सबसे ऊपर जवाब दिए गए जवाब देखें। चीयर्स – webLacky3rdClass

+0

बहुत चालाक! मैं इसका इस्तेमाल करने के लिए लुभाना चाहता हूं लेकिन दो कारणों से; 1, यह तुरंत स्पष्ट नहीं है कि यह कोड क्या करता है और 2, आजकल मैं '[स्ट्रिंग 2, स्ट्रिंग 1] = [स्ट्रिंग 1, स्ट्रिंग 2] ' – Bojangles

+0

@Bojangles दो स्विच दो स्ट्रिंग्स, हाँ, लेकिन आप ES6 का उपयोग कैसे करेंगे आपके मूल प्रश्न के लिए विशेषताएं? – kolossal7