2016-06-13 87 views
1

我有克隆這樣一種形式(commonStuff)(和HTML頁面,在jQuery Mobile的,那裏的形式出現多次設計,克隆):如何重命名克隆表單中的所有id(javascript)?

var commonClone = commonStuff.cloneNode(true); 

這個功能

function renameNodes(node) { 
    var i; 
    if (node.length) { 
     for (i = 0; i < node.length; i += 1) { 
      renameNodes(node[i]); 
     } 
    } else { 
     // rename any form-related elements 
     if (typeof node.form !== 'undefined') { 
      node.id = currentPrefix + '_' + node.id; 
      node.name = currentPrefix + '_' + node.name; 

     // This assumes that form elements do not have child form elements! 
     } else if (node.children) { 
      renameNodes(node.children); 
     } 
    } 
} 

它向表單中的任何元素的id和名稱添加前綴'form1_','form_2'(currentPrefix),並將其應用於commonClone(並遞歸給他的兒子)。

renameNodes(commonClone); 

它在文本輸入的情況下很好地工作等

<div data-role="fieldcontain" class="ui-field-contain ui-body ui-br"> 
     <label for="foo" class="ui-input-text">Age:</label> 
     <input type="text" name="age" id="age" value="" class="ui-input-text ui-body-c ui-corner-all ui-shadow-inset"> 
    </div> 

但它在單選按鈕上故障等

<div data-role="fieldcontain"> 
     <fieldset data-role="controlgroup" data-type="horizontal"> 
      <legend>Address:</legend> 
       <input type="radio" name="radio-address" id="radio-address_female" value="1" checked="checked" /> 
       <label for="radio-address_female">Address 1</label> 

       <input type="radio" name="radio-address" id="radio-address_male" value="2" /> 
       <label for="radio-address_male">Address 2</label> 
     </fieldset> 
    </div> 

施加重命名到外的div像「fieldcontain」和'控制組'。它的作品,如果我刪除這兩個div,但圖形效果是不可接受的...

至於現在,我得到的問題是在最後'如果'塊它不關心兄弟姐妹,但我真的不知道如何解決這個問題。任何想法?

編輯:此代碼來自這個答案How to create a tabbed html form with a common div

回答

0

誠然,這是遠離優雅,但一個解決方案,反正。在任何節點中,都會手動搜索輸入和標籤,在標籤的情況下會更改id,名稱和'for'屬性。

function renameNodes(node) { 
    var i; 
    if (node.length) { 
     for (i = 0; i < node.length; i += 1) { 
      renameNodes(node[i]); 
     } 
    } else { 
     // rename any form-related elements 
     if (typeof node.form !== 'undefined') { 
      node.id = currentPrefix + '_' + node.id; 
      node.name = currentPrefix + '_' + node.name; 

      var inputs = node.getElementsByTagName('input'); 
      for (i = 0; i < inputs.length; ++i) { 
       inputs[i].id = currentPrefix + '_' + inputs[i].id; 
       inputs[i].name = currentPrefix + '_' + inputs[i].name; 
      } 
      var labels = node.getElementsByTagName('label'); 
      for (i = 0; i < labels.length; ++i) { 
       labels[i].setAttribute('for', currentPrefix + '_' + labels[i].getAttribute("for")); 
      } 
     } else if (node.children) { 
      renameNodes(node.children); 
     } 
    } 
} 
1

當您使用jQuery手機時,jQuery將可用。 我希望這個代碼將指向你在正確的方向:

var i = 0; 
$("form").each(function() { 
    $(this).find("input, select").each(function() { 
    $(this).attr("id", "form" + i + "_" + $(this).attr("id")); 
    $(this).attr("name", "form" + i + "_" + $(this).attr("name")); 
    }); 
    $(this).find("label").each(function() { 
    $(this).attr("for", "form" + i + "_" + $(this).attr("for")); 
    }); 
    i++; 
}); 

編輯

我理解你現在的方法失敗的標籤。考慮將您的輸入元素包裝在label標記中。在這種情況下,您將不需要0​​-屬性。這是按照文檔:http://api.jquerymobile.com/checkboxradio/ 考慮一下:

HTML

<form> 
    <div data-role="fieldcontain"> 
    <fieldset data-role="controlgroup" data-type="horizontal"> 
     <legend>Address:</legend> 
     <label><input type="radio" name="radio-address" id="radio-address_female" value="1" checked="checked" />Address 1</label> 
     <label><input type="radio" name="radio-address" id="radio-address_male" value="2" />Address 2</label> 
    </fieldset> 
    </div> 
    <div data-role="fieldcontain" class="ui-field-contain ui-body ui-br"> 
    <label><input type="text" name="age" id="age" value="" class="ui-input-text ui-body-c ui-corner-all ui-shadow-inset">Age:</label> 
    </div> 
</form> 

jQuery的

var i = 0, currentPrefix = "form"; 
$("form").each(function() { 
    $(this).find("input, select").each(function() { 
    $(this).attr("id", currentPrefix + i + "_" + $(this).attr("id")); 
    $(this).attr("name", currentPrefix + i + "_" + $(this).attr("name")); 
    }); 
    i++; 
}); 

日夜不停小提琴:https://jsfiddle.net/EliteSystemer/8sx6rnwo/

+0

謝謝。這與我最終生成的代碼類似(請參閱我自己的答案)。我希望找到一種更優雅的方式來管理這件事情,使用克隆節點上的遞歸方法,而不是直接重命名頁面中的元素:) –

+1

好的,回答編輯。 –

+0

哇,這很有趣!謝謝! –