2010-01-20 5 views
10

में jQuery द्वारा सेट आईफ्रेम 'नाम' विशेषता का अजीब व्यवहार मैं एक फॉर्म में फ़ाइल को एक आईफ्रेम में पोस्ट करके एक AJAX शैली फ़ाइल अपलोड कर रहा हूं और आईई में कुछ अजीब व्यवहार देखा है (ऐसा लगता है कि 6 & दोनों में होता है 8)। मूल रूप से आईई में फॉर्म target iframe ठीक से नहीं है, इसलिए प्रतिक्रिया एक नई विंडो (iframe में के बजाय) में दिखाई देती है। आप HTML/जे एस के निम्नलिखित न्यूनतम सेट के साथ समस्या को पुन: कर सकते हैं:आईई

<html> 
<head> 
    <script src="http://code.jquery.com/jquery-1.3.2.js"></script> 
    <script> 
    $(document).ready(function(){ 
     var frameName = "myFrame"; 
     var $iframe = $("<iframe src=\"about:blank\" />") 
       .attr("name", frameName) 
       .appendTo("body"); 
     var $uploadForm = $("<form action=\"http://www.google.com/search\" />") 
       .attr("target", frameName) 
       .append("<input type=\"text\" name=\"q\" />") 
       .append("<input type=\"submit\" />") 
       .appendTo("body"); 
    }); 
    </script> 
</head> 
<body> 
</body> 
</html> 
अब

(इससे पहले कि आप एक जवाब के बाद), मैं कुछ जांच (IE8 के डेवलपर उपकरण का उपयोग कर) किया था और ऐसा लगता है कि वास्तव में .attr("name", frameName) जोड़ रहा है name="myFrame" के बजाय submitName="myFrame" के रूप में विशेषता। इस आधार पर, मैं थोड़ा nastier करने के लिए iframe निर्माण कोड बदल कर समस्या हल हो जाती:

var $iframe = $("<iframe src=\"about:blank\" name=\"" + frameName + "\" />") 
     .appendTo("body"); 

यह परिवर्तन करने iframe में प्रपत्र पोस्ट के रूप में वांछित बनाता है।

  • नहीं .attr("name", ...) काम क्यों अपेक्षा के अनुरूप है:

    मेरे सवालों का कर रहे हैं?

  • क्या यह jQuery में एक बग है, आईई में एक बग (निश्चित रूप से नहीं!?!), या क्या मुझे कुछ याद आ रही है?
  • submitName विशेषता & से कहां से आती है इसका उद्देश्य क्या है?

उत्तर

16

IE में एक बग

हार्ड, मुझे पता है, लेकिन वहाँ हम कर रहे हैं:

आपको लगता है कि बुरा मिल जाए, यह कोशिश (निश्चित रूप से नहीं!?!) ।

ऐतिहासिक रूप से (*), name विशेषता को स्थापित करने में आईई में कई समस्याएं हैं। यह केवल आंशिक रूप से पकड़ता है। उदाहरण के लिए फॉर्म फ़ील्ड नामों पर, यह form.elements[name] लुकअप को प्रभावित नहीं करता है। यह एक और मामला प्रतीत होता है जहां name संपत्ति सेट करना अविश्वसनीय है।

जबकि jQuery इस तरह की ब्राउज़र कीड़े के आसपास काम करने का प्रयास करता है, यह सब कुछ नहीं पकड़ता है, और इसे हल करने के लिए कोई ज्ञात तरीका नहीं है।

(*: आईई में 7 तक। यदि आप देशी दस्तावेज़ में IE8 चलाते हैं तो मानक मोड मोड का उपयोग करके मोड और यदि आवश्यक हो तो एक्स-यूए-संगत हेडर/मेटा, दोनों त्रुटियां फसल नहीं होती हैं।)

देव उपकरण में दिखाई देने वाले submitName आईई बग के दृश्यों के पीछे एक दिलचस्प झलक है, क्योंकि यह सार्वजनिक रूप से दिखाई देने वाले डोम में दिखाई नहीं देता है। यदि आप <input> तत्व या <form> पर name विशेषता को सृजन के बाद भी लिखा गया है, तो यह वही काम करता है।

तो क्या हो रहा प्रतीत होता है कि IE-अप-टू-7 गुण एक अन्यथा-अदृश्य संपत्ति को name कहा जाता है, आंतरिक रूप से submitName कहा जाता है के सभी उपयोग पुनर्निर्देश, प्रपत्र फ़ील्ड्स के लिए डेटा क्षेत्र हिस्से के रूप में उत्पन्न होगा बदल जाता है एक फॉर्म सबमिशन का, लेकिन जो [i] फ्रेम, लक्ष्यीकरण के मामले में HTMLCollection अनुक्रमण, रेडियो-ग्रुपिंग, getElementsByName, या, के लिए उपयोग की जाने वाली वास्तविक name विशेषता को परिवर्तित नहीं करता है।

+0

पृष्ठभूमि के लिए धन्यवाद, मुझे लगता है कि यह एक निश्चित उत्तर है जैसा कि मैं प्राप्त करने जा रहा हूं, किसी भी पूर्व-आईई डेवलपर्स पोस्टिंग को रोक रहा हूं (हालांकि मैं उन्हें इस तथ्य को स्वीकार करने की कल्पना नहीं कर सकता: पी), इसलिए मैं स्वीकार कर रहा हूं यह। यह जानकर अच्छा लगा कि कम से कम बग वास्तव में IE8 में चला जाता है यदि आपके पास सही कार्यप्रणाली है। आप चीजों को आप का उल्लेख के साथ कोई समस्या का अनुभव किया है - – Alconja

+0

'getElementsByName', रेडियो-समूहीकरण और इतने पर भी काम कर रहे हैं, हालांकि' name' गुण ही केवल 'submitName'" विशेषताओं का "परिवर्तन रहने लगते हैं? मैंने IE8 में i7 संगतता मोड में इसका परीक्षण किया, और सब कुछ काम करने लग रहा था। – cic

+0

कुछ अधिक जानकारी: http://thunderguy.com/semicolon/2005/05/23/setting-the-name-attribute-in-internet-explorer/ – cic

0

क्या आपने jQuery 1.4 में markup creation improvements देखा है? विश्वास करने के लिए

$('<iframe />', 
{ 
    name: frameName, 
    src: 'about:blank' 
}).appendTo("body"); 
+0

कोई फर्क नहीं पड़ता: नए '{attrs}' ऑब्जेक्ट से 'name' सेट करना' attr() 'का उपयोग करके इसे सेट करने में विफल रहता है। – bobince

+0

शर्म, फिर भी, मार्कअप सुधार दिखाए जाने योग्य हैं। +1 bobince –

+0

हाँ मैंने नया वाक्यविन्यास देखा है (इस परियोजना के लिए 1.3.2 के साथ अटक गया है), लेकिन यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता है ... समस्या अभी भी नए वाक्यविन्यास और 1.4 का उपयोग कर मौजूद है (मुझे विश्वास है कि आप क्या करते हैं लिखा है कि मेरे मूल '.attr (" name ", frameName) के बराबर प्रभावी है ')। – Alconja

2

मैन्युअल सेट करते समय यह केवल एक jQuery समस्या नहीं है, यह भी होता है।

यदि सेट करने के लिए setAttribute() विधि का उपयोग करना है, तो भी jQuery के बिना, यह वही होता है जब फ़ॉर्म या iframe अभी बनाया गया है! उसी तरह, innerHTML का उपयोग कर आप इसे ठीक कर सकते हैं ... हाँ, एक बार फिर, यह माइक्रोसॉफ्ट मेरा दिन को नष्ट कर रहा है:/

4

इस

$("<iframe name='frameName' />") 

तरह तत्व बनाने समस्या मेरे लिए हल