2011-01-11 24 views
12

मैं एक jQuery समारोह जो एक fieldset जब इसकी कथा क्लिक किया जाता है की सामग्री की दृश्यता को टॉगल करता है, बस fieldset सीमा छोड़ने (यदि वहाँ एक है) और किंवदंती दिखा दिया है:पतन fieldset जब कथा तत्व क्लिक

$('legend.togvis').click(function() { 
    $(this).siblings().toggle(); 
    return false; 
}); 

यह तब तक बढ़िया काम करता है जब तक फ़ील्ड में टेक्स्ट नोड्स न हों।

<fieldset><legend class='togvis'>Click Me</legend> 
    <p>I toggle when the legend is clicked.</p> 
    But I'm a recalcitrant text node and refuse to toggle. 
</fieldset> 

पाठ को चालू करने के प्रयास में नोड भी मैं इस कोशिश की:

$('legend.togvis').click(function() { 
    $(this).parent().contents().not('legend').toggle(); 
    return false; 
}); 

जो पहले समारोह के रूप में एक ही काम करता है। और यह:

$('legend.togvis').click(function() { 
    $(this).parent().contents(":not(legend)").toggle(); 
    return false; 
}); 

जो त्रुटि फेंकता

Message: 'style.display' is null or not an object 
Line: 5557 
Char: 3 
Code: 0 
URI: http://code.jquery.com/jquery-1.4.4.js 

कैसे एक fieldset (ऋण कथा) जब कथा क्लिक किया जाता है टॉगल करने के लिए की पूरे सामग्री प्राप्त करने के लिए पर कोई विचार?

ईटीए Eibx

$('legend.togvis').click(function() { 
    $(this).parent().contents().filter(
     function() { return this.nodeType == 3; }).wrap('<span></span>');//wrap any stray text nodes 
    $(this).siblings().toggle(); 
}); 
+0

ऐसा लगता है कि समस्या यह है कि टेक्स्ट नोड्स शैली नहीं है/नहीं। चूंकि '.ogoggle() 'नोड के सीएसएस को प्रभावित करके काम करता है, यह टेक्स्ट नोड्स को प्रभावित नहीं कर सकता है। शायद मुझे फ़ील्डसेट की सामग्री '.data() 'में स्टोर करने की आवश्यकता है और फिर बच्चों को हटा दें? – dnagirl

उत्तर

14

आप HTML, जावास्क्रिप्ट या सीएसएस में टेक्स्ट को गायब नहीं कर सकते हैं। इसे एक HTML तत्व में निहित होना आवश्यक है जिसमें display:none; लागू होगा या कुछ समान होगा।

निम्नलिखित कोड सबकुछ एक div में लपेट जाएगा, और अपनी किंवदंती को div के समान स्तर पर ले जायेगा, और जब आप किंवदंती पर क्लिक करेंगे तो div दिखाएं/छुपाएं।

$("fieldset legend").click(function() { 
    if ($(this).parent().children().length == 2) 
    $(this).parent().find("div").toggle(); 
    else 
    { 
    $(this).parent().wrapInner("<div>"); 
    $(this).appendTo($(this).parent().parent()); 
    $(this).parent().find("div").toggle(); 
    } 
}); 
+0

यह वास्तव में एक अच्छा समाधान है क्योंकि मार्कअप को उस फ़ंक्शन द्वारा जोड़ा जाता है जिसकी आवश्यकता होती है। – dnagirl

+0

धन्यवाद - लेकिन मैं अनुशंसा करता हूं कि आप कुछ कोड $ (दस्तावेज़) .ready() पर ले जाएं क्योंकि यह प्रत्येक क्लिक पर तत्व की जांच करेगा। यह सुनिश्चित करने के लिए स्मार्ट होगा कि सभी किंवदंतियों के पास सही बच्चे हैं। कुछ पंक्तियों में: http://jsbin.com/eleva3/2/edit –

+0

दुर्भाग्य से, यह कुछ लेआउट समस्याओं का कारण बन रहा है। हालांकि आप मुझे वास्तव में एक अच्छी दिशा में भेज रहे हैं। – dnagirl

5

एक div टैग का प्रयोग करें करने के लिए समाधान, बहुत धन्यवाद के साथ सामग्री को अलग करने, की तरह कुछ:

<fieldset> 
    <legend class='togvis'>Click Me</legend> 
    <div class="contents"> 
    <p>I toggle when the legend is clicked.</p> 
    But I'm a recalcitrant text node and refuse to toggle. 
    </div> 
</fieldset> 

तो फिर तुम केवल div टॉगल करने के लिए की जरूरत है।

$('legend.togvis').click(function() { 
    $(this).closest("contents").toggle(); 
    return false; 
}); 

अद्यतन केवल मामले में आप HTML आप निम्नलिखित कर सकते हैं संपादित नहीं कर सकते, लेकिन यह केवल तभी कार्य करेगा सभी ग्रंथों कम से कम एक टैग भीतर कर रहे हैं:

$('legend.togvis').click(function() { 
    $(this).parents("fieldset").find("*:not('legend')").toggle(); 
    return false; 
}); 

ऑनलाइन डेमो यहाँ:http://jsfiddle.net/yv6zB/1/

+0

वह – hunter

+0

धन्यवाद करने में सक्षम नहीं हो सकता है, मैंने इसे ध्यान में रखा है – amosrivera

+0

अभी भी – hunter

0

क्या आप बस अपने पाठ को सिबिलिग टैग में संलग्न कर सकते हैं:

<fieldset><legend class='togvis'>Click Me</legend> 
    <div><p>I toggle when the legend is clicked.</p> 
    But I'm a recalcitrant text node and refuse to toggle.</div> 
</fieldset> 
+0

वह – hunter

10

चूंकि टेक्स्ट नोड तत्व नहीं हैं, इसलिए उन्हें टॉगल करने का कोई तरीका नहीं है।

एक अंतिम उपाय के रूप में, अगर आप उन्हें एक तत्व के साथ रैप नहीं कर सकते, आप किंवदंती के अलावा सब कुछ हटा सकते हैं और तत्वों को जोड़ने और पाठ बाद में वापस नोड:

$(document).ready(function() { 
    $('legend.togvis').click(function() { 
     var $this = $(this); 
     var parent = $this.parent(); 
     var contents = parent.contents().not(this); 
     if (contents.length > 0) { 
      $this.data("contents", contents.remove()); 
     } else { 
      $this.data("contents").appendTo(parent); 
     } 
     return false; 
    }); 
}); 

आपको लगता है कि समाधान here परीक्षण कर सकते हैं।

+0

+1 को अच्छी तरह से करने में सक्षम नहीं हो सकता है, jquery ऑब्जेक्ट्स को कैश करने के लिए सर – hunter

+0

+1 – JCM

+0

यह मेरे लिए काम करना चाहिए। मैं रिपोर्ट फ़िल्टरिंग नियंत्रण के साथ एक फ़ील्ड टॉगल करने में सक्षम होना चाहता था, इसलिए मेरे पास कुछ ड्रॉप डाउन और कुछ टेक्स्ट बॉक्स और उनके साथ के लेबल थे। –

0

मैं स्वीकार किए जाते हैं जवाब पसंद आया, लेकिन यह मेरी प्रयोजनों के लिए पर्याप्त मजबूत नहीं मिला। बस बाल तत्वों की संख्या की लंबाई की जांच करना कई परिदृश्यों का समर्थन नहीं करता है। इस प्रकार, मैं इस तरह के कार्यान्वयन का उपयोग करने पर विचार करता हूं:

$("fieldset legend").click(function() { 
    var fieldset = $(this).parent(); 
    var isWrappedInDiv = $(fieldset.children()[0]).is('div'); 

    if (isWrappedInDiv) { 
     fieldset.find("div").slideToggle(); 
    } else { 
     fieldset.wrapInner("<div>"); 
     $(this).appendTo($(this).parent().parent()); 
     fieldset.find("div").slideToggle(); 
    } 
}); 
संबंधित मुद्दे