2010-05-05 14 views
6

मैं एक div क्लोन करने और इस div में इनपुट फ़ील्ड के नाम बदलने की कोशिश कर रहा हूं। यह अधिकांश ब्राउज़रों के लिए बहुत अच्छा काम करता है लेकिन आईई 7 इनपुट फ़ील्ड के नाम विशेषता को नहीं बदलता है।jQuery क्लोन समस्या

डेमो: http://jsbin.com/iduro/7

एचटीएमएल

<body> 
    <pre></pre> 
    <div><input value="Hello World" name="test"></div> 
</body> 

जे एस

var lastRow = $("body div:last"), 
    newRow = lastRow.clone(true) 
       .show() 
       .insertAfter(lastRow); 

newRow.find('input').attr("name","test2"); 

$("pre").text(newRow[0].innerHTML); 

परिणाम:

फ़ायरफ़ॉक्स: (काम करता है) <input value="Hello World" name="test2">

IE8 (काम करता है) <INPUT value="Hello World" name=test2 jQuery1273063250500="4">

IE7 (बग): <INPUT value="Hello World" name=test jQuery1273063303968="4">

जैसा कि आप देख IE7 के नाम test2 को नहीं बदलता है।

क्या कोई स्पष्ट कारण या काम आसपास है?

+1

इस संबंधित प्रश्न को देखें: http://stackoverflow.com/questions/2094618/changing-name-attr-of-cloned-input-element-in-jquery-doesnt-work-in-ie6-7 –

उत्तर

2

मैं इसे अभी ठीक कर सकता हूं। जब तक डोम से इनपुट फ़ील्ड संलग्न नहीं होता है तब तक आप नाम बदल सकते हैं और रेडियो बटन ठीक से काम कर सकते हैं।

// Old Code 
$("div:last").clone(true).children("input").attr("name","newName"); 

// New Code 
$("div:last").clone(true).children("input").fixCloneBug ("newName"); 

निष्पादन समय को कम करने के लिए केवल jQuery ईवेंट, कक्षा नाम और प्रकार विशेषता कॉपी की जाती है।

fixCloneBug विधि:

(function($) 
{ 


    if (! $.browser.msie || parseInt($.browser.version) > 7) 
     // NO FIX FOR IE 7+ FF WEBKIT 
     $.fn.fixCloneBug = function(newName){ return this.attr("name", newName) }; 
    else 
     // FIX IE 5-7 
     $.fn.fixCloneBug = function(newName) 
     { 
      var $cloned = $(); 

      this.each(function() 
      { 
        /* -._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ 

         Create a new element with className and jQuery events of the buggy element 

        */   

        var  $elem = $(this), 

          $newElem = $(document.createElement($elem.attr('tagName'))); 

          // USE SAME TYPE 

        $newElem.attr('type', $elem.attr('type')); 


          // SET NAME 
        $newElem.attr('name', this.name); 
        $newElem.attr('name', newName); 

          // ADD TO DOM 

        $newElem.insertBefore($elem); 

          // CLONE EVENTS 
        $newElem.data("events", $elem.data("events")); 

          // CLASS NAME 
        $newElem.attr('className', this.className); 

        /* -._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ 

         Delete buggy element 

        */ 

        $elem.remove(); 


        // Add to result 
        $cloned.push($newElem); 
      }) 

      return $cloned; 

     } 

}(jQuery)); 

हो सकता है कि आपको लगता है $newElem.attr('name', this.name); बेकार तथापि है यह मुझे एक jQuery 1.4 सुविधा का उपयोग करने की अनुमति देता है:

.fixCloneBug (function(i,oldname){ return oldname+"_new" })

0

यदि आप फ़ॉर्म को पोस्ट करते समय सेट के रूप में एक्सेस करने पर पैन करते हैं तो नाम बदलने की कोई आवश्यकता नहीं है - केवल ब्रैकेट के भीतर कोई मान न डालें और जब आप सरणी को पकड़ लेंगे तो यह आपके लिए बढ़ेगा सर्वर साइड:

<input name="test[]" />

आप से js तुम सिर्फ एक चयनकर्ता द्वारा दिया उचित संग्रह पर get उपयोग कर सकते हैं सूचकांक द्वारा हर एक का उपयोग कर सकेंगे करने की जरूरत है। या आप आईडी गुणों को test_1 असाइन कर सकते हैं।

+2

मैं कोशिश करता हूं रेडियो बटन की एक पंक्ति क्लोन करें। हालांकि नाम बदलना काम नहीं करता है, उपयोगकर्ता केवल दो पंक्तियों के लिए दोनों पंक्तियों के लिए एक रेडियो बटन चुन सकता है। – jantimon

+0

@prodigtalson +1। एक ही समाधान में चलते समय मेरी समस्या हल की और मेरी समस्या हल हो गई। मैंने केवल टेक्स्ट इनपुट का उपयोग किया और कथन का चयन किया, इसलिए उपर्युक्त वर्णित रेडियो मुद्दे अभी भी हो सकते हैं। – canadiancreed

+0

उपयोगी जानकारी, लेकिन -1 क्योंकि यह पूछा गया सवाल का जवाब नहीं देता है। – RMorrisey

0

रेडियो बटन के लिए सरल समाधान है:

$("div:last").find("radio").each(function(){ 
    var name="someNewName"; 
    var id="someNewId"; 
    if (!$.browser.msie || parseInt($.browser.version) > 7) { 
     this.name = name; 
     this.id=id; 
    } 
    else { 
     (this).attr("outerHTML", "<input type=radio id=" + id + " name=" + name + " />"); 
    } 
}); 

यह तत्व के बाहरी HTML को बदल देगा ताकि तत्व (रेडियो बटन) के लिए HTML ओवरराइट हो। एक ही समाधान के लिए आवेदन किया जा सकता है: अन्य नियंत्रणों के लिए भी खोजें ("इनपुट")/ढूंढें ("चेकबॉक्स")।

1

इस (कच्चे कोड) की कोशिश

$(some_cloned_element).each(function(i, elem){ 
    var newName = "yay_i_love_my_new_name"; 
    if ($.browser.msie === true){ // evil browser sniffing *cries* 
     $(elem).replaceWith(document.createElement(
      this.outerHTML.replace(/name=\w+/ig, 'name='+newName+'_'+i) 
     )); 
    } else { 
     $(elem).attr('name',newName+'_'+i); 
    } 
    $("body").append(some_cloned_element); 
}); 

जांच जब मैं = 50 और फिर ब्रेक/बाहर निकलें

बेहतर तरीका: उपयोग नाम के रूप में name=picture[]

जैसी सरणी

Refernece

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