2011-01-31 9 views
43

के लिए विकल्प मैं HTML अनुप्रयोग तत्वों की आईडी विशेषता को गतिशील रूप से सेट कर रहा हूं जो मेरे एप्लिकेशन में गतिशील रूप से बनाए गए हैं।IE में गतिशील रूप से इनपुट तत्व की आईडी विशेषता सेट करना: सेटएट्रिब्यूट विधि

मेरे कार्यान्वयन फ़ायरफ़ॉक्स में setAttribute विधि के साथ ठीक काम करता है। आईई में कामकाजी कार्यान्वयन पर किसी भी विचार या समाधान की सराहना की जाएगी।

var hiddenInput = document.createElement("input"); 
    hiddenInput.setAttribute("id", "uniqueIdentifier"); 
    hiddenInput.setAttribute("type", "hidden");      
    hiddenInput.setAttribute("value", ID); 
    hiddenInput.setAttribute("class", "ListItem"); 

मैं इस समस्या यह है कि निम्नलिखित workround का सुझाव से संबंधित ब्लॉग से कुछ नमूना कोड को संशोधित किया। फिर फ़ायरफ़ॉक्स बिट अच्छी तरह से काम करता है लेकिन आईई बिट

var hiddenInput = null; 

try { 
hiddenInput = document.createElement('<input name=\''+"hiddenInputName"+'\' />'); 
        hiddenInput.id = "uniqueIdentifier"; 
        //alert(document.getElementById("uniqueIdentifier")); 
        hiddenInput.type = "hidden"; 
       } catch (e) { }    
       if (!hiddenInput || !hiddenInput.name) { // Not in IE, then 
        var hiddenInput = document.createElement("input"); 
    hiddenInput.setAttribute("id", "uniqueIdentifier"); 
    hiddenInput.setAttribute("type", "hidden");      

      } 

चीयर्स।

+0

आईई का कौन सा संस्करण आप परीक्षण करते हैं? – gor

+0

इंटरनेट एक्सप्लोरर 8 – Terman

+1

वास्तव में क्या काम नहीं कर रहा है? क्या कोई त्रुटि संदेश है? क्या गलत है? –

उत्तर

60

IE7 और क्रोम में यह code काम:

var hiddenInput = document.createElement("input"); 
    hiddenInput.setAttribute("id", "uniqueIdentifier"); 
    hiddenInput.setAttribute("type", "hidden");      
    hiddenInput.setAttribute("value", 'ID'); 
    hiddenInput.setAttribute("class", "ListItem"); 

$('body').append(hiddenInput); 

हो सकता है कि समस्या कहीं और?

+4

त्वरित नोट:। पुराने IE संस्करणों कुछ आइटम के साथ कुछ मुद्दों है ... क) आप 'setAttribute साथ' name' विशेषता सेट नहीं कर सकते करना() ', और बी।) आप इसे सेट करने के लिए 'टाइप' विशेषता' सेट नहीं कर सकते हैं जब आप इसे DOM में जोड़ते हैं (यह केवल पढ़ा जाता है) c।) कक्षा सेट करने के लिए, आपको यहां" className "विवरण सेट करना होगा: http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html और IE को फ़िक्स केवल मानक मोड में दिए गए पृष्ठों पर हैं। – scunliffe

4

मुझे आईई में setAttribute के साथ किसी समस्या की जानकारी नहीं थी?

hiddenInput.id = "uniqueIdentifier"; 
+0

आईडी को असाइन करना सीधे मेरे लिए काम नहीं करता है। उदाहरण के लिए एक असाइनमेंट के बाद मैं अलर्ट (document.getElementByID ("uniqueIdentifier") का आह्वान करता हूं); और यह शून्य देता है: = (धन्यवाद – Terman

+1

'आईडी' एक विस्तार नहीं है, यह एक डोम संपत्ति है। आईई का 'सेट एट्रिब्यूट()' कार्यान्वयन बुरी तरह टूटा हुआ है: सामान्य रूप से, यह गुणों के गुणों को मानचित्र करता है। इसका मतलब है कि "वर्ग" विशेषता सही तरीके से काम नहीं करता है, उदाहरण के लिए: समकक्ष संपत्ति 'className' है। इसका अर्थ यह भी है कि ईवेंट हैंडलर विशेषताएँ काम नहीं करती हैं, क्योंकि' setAttribute() 'को स्ट्रिंग विशेषता मान की अपेक्षा करनी चाहिए लेकिन ईवेंट हैंडलर गुण कार्य ऑब्जेक्ट्स होना चाहिए। –

+0

@ टिमडाउन: स्पष्टीकरण के लिए आह धन्यवाद। ठीक है, '।आईडी' एक "डोम संपत्ति" है लेकिन क्या यह एक ही समय में ईसीएमएएलएंड में एक वस्तु संपत्ति नहीं है? – jAndy

6

उपयोग jQuery attr विधि: आप सीधे नोड पर ही expando गुण सेट कर सकता है हालांकि। यह सभी ब्राउज़रों में काम करता है।

var hiddenInput = document.createElement("input"); 
$(hiddenInput).attr({ 
    'id':'uniqueIdentifier', 
    'type': 'hidden', 
    'value': ID, 
    'class': 'ListItem' 
}); 

या आप folowing कोड इस्तेमाल कर सकते हैं:

var e = $('<input id = "uniqueIdentifier" type="hidden" value="' + ID + '" class="ListItem" />'); 
+0

दिलचस्प, code.jquery.com/jquery-latest.js की जाँच करके, यह पहले से ही संस्करण पर है '1.5.0' :) लगता है इसका वाला की तरह बहुत जल्द जारी किया। – jAndy

+0

धन्यवाद। मैं एक जावास्क्रिप्ट टूलकिट का उपयोग करता हूं- मैं JQuery की सराहना करता हूं- लेकिन मैं थोड़ा सा बाध्य हूं कि जिस साइट पर मैं काम कर रहा हूं वह jQuery का अधिक लाभ नहीं उठाता है, और मैं बस लगातार बनाए रखने की कोशिश कर रहा हूं। – Terman

2

documentation का कहना है:

आप विशेषताओं (जैसे कि यह भी एक जावास्क्रिप्ट डॉट संपत्ति पर मैप किए जाते निर्धारित करने की आवश्यकता जब href, शैली, src या event-handlers), इसके बजाए मैपिंग का पक्ष लें।

तो, सिर्फ आईडी, मूल्य काम बदल सकते हैं और आप से किया जाना चाहिए।

+0

"प्रलेखन"? आपका मतलब एक ऐसी साइट है जो न तो मानकों को परिभाषित करती है या उन्हें लागू करती है (अर्थात् साइटपॉइंट)। हालांकि मैं इसके साथ सहमत होने के लिए होता हूं। –

+0

ठीक है यह ** आधिकारिक ** दस्तावेज नहीं है, लेकिन वे इस समस्या का वर्णन अच्छी तरह से करते हैं। – gor

58

setAttribute() भूल जाएं: यह बुरी तरह टूटा हुआ है और हमेशा ऐसा नहीं करता है जो आप पुराने आईई (आईई < = 8 और बाद के संस्करणों में संगतता मोड) में अपेक्षा कर सकते हैं। इसके बजाय तत्व के गुणों का प्रयोग करें। यह आमतौर पर इस विशेष मामले के लिए एक अच्छा विचार नहीं है। निम्न में से सभी प्रमुख ब्राउज़रों में काम करेंगे के साथ अपने कोड बदलें:

var hiddenInput = document.createElement("input"); 
hiddenInput.id = "uniqueIdentifier"; 
hiddenInput.type = "hidden";      
hiddenInput.value = ID; 
hiddenInput.className = "ListItem"; 

अद्यतन

प्रश्न में दूसरा कोड ब्लॉक में बुरा हैक अनावश्यक है, और कोड ऊपर में ठीक काम करता है आईई सहित सभी प्रमुख ब्राउज़रों 6. http://www.jsfiddle.net/timdown/aEvUT/ देखें। कारण है कि आप अपने alert() में null मिलता है कि जब यह कहा जाता है, नए इनपुट नहीं अभी तक दस्तावेज़ में है, इसलिए document.getElementById() कॉल यह नहीं मिल रहा।

+0

चीयर्स। लगभग लगता है जैसे मैंने पहले से ही कोशिश की है लेकिन मैं इसे – Terman

+0

@Tim नीचे दूंगा आपको बाधित करने के लिए क्षमा करें। लेकिन जैसा कि मैं कोड var hiddenInput = document.createElement ("इनपुट") लिखता हूं; hiddenInput.id = "uniqueIdentifier"; क्रोम ब्राउज़र पर, कंसोल लॉग केवल तत्व के बिना "अद्वितीय इंडेंटिफायर" दिखाता है । इसलिए जब मैं $ ('# uniqueIdentifier') का उपयोग करता हूं। प्रोप ("आईडी") ---> कंसोल मुझे "अपरिभाषित" बताता है। मेरी राय में, document.createElement ("input") पहले से ही एक तत्व बना चुका है: "इनपुट", और इस प्रकार हम इसे एक आईडी देते हैं, है ना? ऐसा क्यों होता है? धन्यवाद। – Stallman

+0

@ टिम डाउन, मुझे लगता है कि 'आईडी' को काम करने के लिए इसके चारों ओर उद्धरण की आवश्यकता है, जब तक कि मुझे कुछ याद आ रहा है? हालांकि महान जवाब। क्या यह कहना सुरक्षित है कि 'setAttribute() 'का उपयोग करने से यह अभी भी एक बेहतर तरीका है? –

2

मुझे एक ही समस्या थी! मैं तत्वों की आईडी विशेषता को बदलने/सेट करने में असमर्थ था। यह अन्य सभी ब्राउज़रों में काम करता था लेकिन आईई नहीं।यह शायद आपकी समस्या के लिए प्रासंगिक नहीं है, लेकिन यहाँ मैं क्या कर समाप्त हो गया है:

पृष्ठभूमि

मैं jQuery टैब के साथ एक MVC साइट का निर्माण किया गया था। मैं गतिशील रूप से टैब बनाना चाहता था और डेटाबेस में टैब को सहेजने वाले सर्वर पर AJAX पोस्टबैक करना चाहता था। मैं टैब के लिए एक int के रूप में एक अद्वितीय पहचानकर्ता का उपयोग करना चाहता था, इसलिए यदि उपयोगकर्ता ने एक ही नाम के साथ दो टैब बनाए हैं तो मुझे परेशानी नहीं होगी। मैं तो अद्वितीय ID इस्तेमाल किया जैसे टैब पहचान करने के लिए:

<ul> 
<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove List</span></li> 
<ul> 

जब मैं तो टैब कॉलबैक सूचकांक का उपयोग करता है पर निकालें कार्यों लागू किया, डायन 0 आधारित है। तब मेरे पास डीबी प्रविष्टि को कचरा करने के लिए सर्वर पर अद्वितीय आईडी वापस भेजने का कोई तरीका नहीं था। Tabremove घटना के लिए कॉलबैक jquery घटना और ui पैरामीटर देता है। कोड की एक पंक्ति के साथ मुझे अवधि की आईडी मिल सकती है:

var dbIndex = event.currentTarget.id; 

समस्या यह थी कि स्पैन टैग में कोई आईडी नहीं थी। तो बनाने कॉलबैक में मैं स्थापित करने का प्रयास आईडी इस तरह एक href से आईडी निकालने खरीद:

ui.tab.parentNode.id = ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6); 

कि फ़ायरफ़ॉक्स में नहीं बल्कि IE में ठीक काम किया। तो मैंने कुछ अन्य कोशिश की:

//ui.tab.parentNode.setAttribute('id', ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6)); 
//$(ui.tab.parentNode).attr({'id':ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6)}); 
//ui.tab.parentNode.id.value = ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6); 

उनमें से कोई भी काम नहीं किया! तो परीक्षण के कुछ घंटों और गूगलिंग के बाद मैंने छोड़ दिया और निष्कर्ष निकाला कि आईई गतिशील रूप से तत्व की आईडी विशेषता सेट नहीं कर सकता है।

जैसा कि मुझे दुख है कि यह शायद आपके मुद्दे से प्रासंगिक नहीं है लेकिन मैंने सोचा कि मैं साझा करूंगा।

समाधान

और कौन टैब मुद्दा मैं यहाँ था पर googleing द्वारा इस पाया आप सभी के लिए है कि मैं क्या tabsremove कॉलबैक में कर रही इस मुद्दे को हल करने के लिए समाप्त हो गया है:

var dbIndex = event.currentTarget.offsetParent.childNodes[0].href.substring(event.currentTarget.offsetParent.childNodes[0].href.indexOf('#list-') + 6); 

शायद सबसे कामुक समाधान नहीं, लेकिन हे इस मुद्दे को हल किया। अगर किसी के पास कोई इनपुट है तो कृपया साझा करें ...

संबंधित मुद्दे