2010-01-19 138 views
21

SSCCE說明了一切:更改jQuery中克隆輸入元素的name屬性不工作在IE6/7

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>Test</title> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       $('#add').click(function() { 
        var ul = $('#ul'); 
        var liclone = ul.find('li:last').clone(true); 
        var input = liclone.find('input'); 
        input.attr('name', input.attr('name').replace(/(foo\[)(\d+)(\])/, function(f, p1, p2, p3) { 
         return p1 + (parseInt(p2) + 1) + p3; 
        })); 
        liclone.appendTo(ul); 
        $('#showsource').text(ul.html()); 
       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <ul id="ul"> 
      <li><input type="text" name="foo[0]"></li> 
     </ul> 
     <button id="add">Add</button> 
     <pre id="showsource"></pre> 
    </body> 
</html> 

Copy'n'paste'n'run它,點擊Add按鈕數次。在每一次點擊,你應該看到<ul>的HTML代碼中<pre id="showsource">露面和預期的代碼應該大致是:

<li><input name="foo[0]" type="text"></li> 
<li><input name="foo[1]" type="text"></li> 
<li><input name="foo[2]" type="text"></li> 
<li><input name="foo[3]" type="text"></li> 

這將按預期在FF,Chrome瀏覽器,Safari瀏覽器,Opera和IE8。

然而,IE6/7無法在改變name屬性併產生類似:

<li><input name="foo[0]" type="text"> 
<li><input name="foo[0]" type="text"> 
<li><input name="foo[0]" type="text"> 
<li><input name="foo[0]" type="text"></li> 

googled了一下,發現this very similar problem,他固定它,並張貼一段代碼應該如何有樣子。不幸的是,這正是我已經完成的工作,所以我懷疑他只在IE8中測試,而不是在IE6/7中測試。除了谷歌沒有透露太多的特定主題外。

任何見解?或者我真的必須搶回document.createElement

注意:我知道我可以對每個輸入元素使用相同的名稱並將它們檢索爲數組,但以上只是一個基本示例,實際上我確實需要更改name屬性,因爲它不僅包含索引,還包含其他信息,例如parentindex,排序等。它用於添加/重新排列/刪除(子)菜單項。

編輯:這涉及到this bug,jQuery的(我使用的是1.3.2),因此似乎是不創造投入呀?下面的工作是正常的:

$('#add').click(function() { 
    var ul = $('#ul'); 
    var liclone = ul.find('li:last').clone(true); 
    var oldinput = liclone.find('input'); 
    var name = oldinput.attr('name').replace(/(foo\[)(\d+)(\])/, function(f, p1, p2, p3) { 
     return p1 + (parseInt(p2) + 1) + p3; 
    }); 
    var newinput = $('<input name="' + name + '">'); 
    oldinput.replaceWith(newinput); 
    liclone.appendTo(ul); 
    $('#showsource').text(ul.html()); 
}); 

但我無法想象我是唯一一個遇到過jQuery問題的人。即使簡單的$('<input>').attr('name', 'foo')在IE6/7中也不起作用。是不是jQuery作爲一個交叉瀏覽器庫應該涵蓋這個問題之下的這個特定問題?

+1

我遇到了同樣的問題,可以找到解決辦法:http://stackoverflow.com/questions/2773308/jquery-clone-problem – jantimon 2010-05-05 17:07:24

回答

2

不是一個答案,是一個分析的問題問:

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>Test</title> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       $('#add').click(function() { 
        var ul = $('#ul'); 

        var liclone1 = ul.find('li:last').clone(true); 
        var liclone2 = ul.find('li:last')[0].cloneNode(true); 
        var liclone3 = $(ul.find('li:last')[0].cloneNode(true)); 
        var liclone4 = $('<li><input type="text" name="foo[88]"></li>'); 

        var linew = document.createElement("li"); 
        linew.innerHTML = '<input type="text" name="foo[99]">'; 

        $('#showsource').text(""); 
        $('#showsource').text($('#showsource').text() + $(liclone1)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(liclone2)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(liclone3)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(liclone4)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(linew)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(ul)[0].outerHTML); 
        $('#showsource').text($('#showsource').text() + $(ul)[0].innerHTML); 

       }); 
      }); 
     </script> 
    </head> 
    <body> 
     <ul id="ul"> 
      <li><input type="text" name="foo[0]"></li> 
      <li><input type="text" name="foo[1]"></li> 
     </ul> 
     <button id="add">Add</button> 
     <pre id="showsource"></pre> 
    </body> 
</html> 

結果:

<LI><INPUT name=foo[1]> 
<LI><INPUT name=foo[1]> 
<LI><INPUT name=foo[1]> 
<LI><INPUT name=foo[88]></LI> 
<LI><INPUT name=foo[99]></LI> 
<UL id=ul><LI><INPUT name=foo[0]> 

<LI><INPUT name=foo[1]> </LI></UL><LI><INPUT name=foo[0]> 
<LI><INPUT name=foo[1]> </LI> 

,所以我可以分析它,唯一的辦法就是讓新麗用的createElement或使用$(...)創建對象

3

不知您是否碰到this bug in IE(即使使用jQuery)?

本質上,在IE中,雖然可以提交它們(例如輸入元素)並讓它們成功提交,但不能更改元素的名稱屬性(常規或克隆)(然後通過名稱重新訪問它們)。

+1

感謝您的鏈接(+1)。你是對的,他們被提交,但我的第一個SSCCE會發送參數爲'foo [0]','foo [1]','foo [1]','foo [1]'...因此,只有一個'0'和多個'1'(克隆的克隆)。但是我可以重寫代碼,以便它只克隆原始代碼,但是我也需要**能夠在添加後重新訪問它們,因爲之後它們可能會涉及其他jQuery操作(如重新排列和排序)。 – BalusC 2010-03-18 21:03:29

4

我創建了這個問題的部分解決方案,這是我在這裏描述: http://www.danconnor.com/dynamic-name-input-attributes-with-ie-and-jquery-clones.html

基本上是:

$(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); 
}); 

肯定很爛,但絕對有效。

+0

在使用此解決方案一段時間後,我發現它在不同的IE版本中不可靠。相反,我建議使用mergeAttributes技巧;請參閱下面的答案。 – phatmann 2011-08-02 14:57:02

1

我知道這是舊的,但因爲我沒有真正發現任何爲我工作我做了一個非常簡單的解決方案,雖然難看:

HTML轉換使用jQuery 於文字,然後用js字符串函數按照你的意願做 並使用jquery插入字符串爲html。

只是任何人誰仍然遇到這個,像我這樣的:)

9

這裏是將在所有的瀏覽器,甚至是IE6和IE7設置元素的名稱的功能。它從http://matts411.com/post/setting_the_name_attribute_in_ie_dom的代碼改編而來。

function setElementName(elems, name) { 
    if ($.browser.msie === true){ 
    $(elems).each(function() { 
     this.mergeAttributes(document.createElement("<input name='" + name + "'/>"), false); 
    }); 
    } else { 
    $(elems).attr('name', name); 
    } 
} 

我發現使用replaceElement和outerHTML在不同版本的IE中是不可靠的。但上面的mergeAttributes技巧完美地工作!

+0

這對我有用。 – Omar 2011-11-22 16:09:12

+0

對我來說,這也適用於通過連接用方括號括起來的字符串將文本字段轉換爲文本字段數組的函數,如下所示: Before: 之後: 在類似的情況下,我需要更改字段的id屬性。它會以這種方式工作嗎? – 2014-02-07 19:41:28

+0

我不知道更改ID是否有相同的問題。請告訴我們! – phatmann 2014-02-09 05:32:46