2013-05-16 4 views
2

잘못된 키워드를 사용하여 Google을 검색하고있을 수도 있지만 확장 가능한 양식 필드를 만드는 데 필요한 정보는 거의 없습니다. 사용자가 서버 노드에 할당 된 모든 인벤토리를 나열 할 수 있지만 필요한 경우 추가 항목을 추가 할 수있는 입력 양식이 있습니다. 예를 들어 양식은 추가 할 (1) 디스크 옵션을 보여 주지만 + 심볼을 클릭하고 더 추가 할 수 있습니다.JS로 확장 가능한 양식 필드

상당한 양의 데이터를 저장할 수 있도록 disk1, disk2 등과 같은 각 유형에 대해 8 개의 MYSQL 행을 이미 만들었습니다. 그러나, 내 관심은 이것이 많은 옵션이 될 수 밖에 없다는 것입니다.

1) 어떻게 자바 스크립트를 사용하여 확장형을 만들 수 있습니까? 나는 작동하지 않는 코드 예제 하나를 발견했다. 2) 모든 옵션을 하드 코딩해야합니까? 예를 들어, 지금 당장 내 코드에는 "ram", "motherboard"등의 선택 상자가 있습니다. 이들을 생성 할 수 있습니까? 아니면 "ram1", "ram2"등과 같은 각 필드에 대해 써야합니까? 자바 스크립트의 필드를 복제

enter image description here

답변

2

쉽다. 당신이 말 :

<select name="hdd"><!-- ...options here...--></select> 

을 당신이 DOM (아래 참조)에서 기존 요소에 대한 참조를 일단, 당신은이 작업을 수행 할 수 있습니다

var newSelect = existingSelect.cloneNode(true); 
newSelect.selectedIndex = -1; // To clear any existing selection 
existingSelect.parentNode.insertBefore(newSelect, existingSelect.nextSibling); 

이 될 수있는 기존 select에 대한 참조를 얻기 예를 들어, (모든 일치의 목록을 얻을 수 있습니다) (첫 번째 일치를 얻을 수)는 CSS 셀렉터와 document.querySelector를 사용하거나 document.querySelectorAllany modern browser에서 수행 :

var list = document.querySelectorAll('select[name="hdd"]'); 
var existingSelect = list[list.length - 1]; // Get the last one 

... 당신에게 마지막 것입니다. 또는 어떤 종류의 행 (tr 또는 div) 에 복사 할 문자가 인 행이 있습니다. 사물의 MySQL의 측면에서

var list = document.querySelectorAll('.hdd'); 
var existingRow = list[list.length - 1]; // Get the last one 
var newRow = existingRow.cloneNode(true); // Clone it 
newRow.querySelector('select[name="hdd"]').selectedIndex = -1; // Clear selected value 
existingRow.parentNode.insertBefore(newRow, existingRow.nextSibling); 

: 아니 문제, 전체 일을 (여기에 내가 마지막 행을 복제하고 마지막에 추가 해요) (예를 들어, "hdd")을 해당 행을하는 클래스를 제공하고, 복제 이 아닌hdd1, hdd2 등과 같은 열을 포함하는 것이 가장 좋습니다. 왜냐하면 이러한 필드에 대한 쿼리가 복잡해지며 물론 최대 수를 제한하기 때문입니다 (어쨌든 제한하고 싶을 수도 있음) . (한 열에있는 열을 갖는 것은 DB를 "비정규 화"라고합니다.)

DB 설계에서이를 수행하는 일반적인 방법은 HDD를 나열하는 두 번째 테이블을 갖는 것입니다. 두 번째 테이블의 키 키 "라고도 함)가 메인 테이블로 다시 연결됩니다. (자세한 내용은 "데이터베이스 정규화"를 참조하십시오.)

그래서 주 테이블에 SystemID과 같은 레코드 ID가있을 수 있습니다. 그러면 HDD 테이블은 SystemID 열과 HDD 열을 가지며 여기에는 동일한 SystemID에 대해 많은 행이있을 수 있습니다.

다음은 양식 비트의 전체 예입니다. Live Copy | Live Source

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Add Form Field Example</title> 
</head> 
<body> 
    <div class="hdd"> 
    <label>HDD: <select name="hdd"> 
     <option>--choose--</option> 
     <option>80GB</option> 
     <option>500GB</option> 
     <option>1TB</option> 
     <option>2TB</option> 
     </select></label></div> 
    <input type="button" id="theButton" value="Add Row"> 
    <script> 
    (function() { 
     document.getElementById("theButton").addEventListener("click", addRow, false); 

     function addRow() { 
     var list = document.querySelectorAll('.hdd'); 
     var existingRow = list[list.length - 1]; // Get the last one 
     var newRow = existingRow.cloneNode(true); // Clone it 
     newRow.querySelector('select[name="hdd"]').selectedIndex = -1; // Clear selected value 
     existingRow.parentNode.insertBefore(newRow, existingRow.nextSibling); 
     } 
    })(); 
    </script> 
</body> 
</html> 

몇 가지 유용한 참조 :

0

T TYPE 및 DETAILS에 대한 열이있는 일반 DEVICE_DETAIL 테이블을 만듭니다. 그런 다음 향후 임의의 숫자 &을 추가하여 새로운 유형을 추가 할 수 있습니다.

create table DEVICE (
    ID integer not null, 
    .. 
    primary key (ID) 
); 
create table DEVICE_DETAIL (
    ID integer not null, 
    FK_DEVICE integer not null, 
    "TYPE" varchar(24),     -- type code; defined internally. 
    CONFIG varchar(200), 
    NOTES clob,       -- if necessary? 
    .. more columns if useful 
    primary key (ID) 
); 

이의 장점, 별도의 HDD를위한 테이블, IP 주소, RAM, 또는 미래의 가능성의 넓은 범위를 필요가 없다는 것입니다. 세부 정보를 저장할 수있는 두 개의 열이 필요합니다. 대부분의 경우 한 행으로 충분합니다.

추가 & 사용자가 이전 필드를 채우므로 UI에 새 필드를 추가하십시오.

0

가장 간단한 방법은 "Add Field"클릭 핸들러를 등록하고이를 사용하여 Javascript에서 새 필드를 만드는 것입니다. 입력 필드를 사용하여이를 수행하는 방법을 보여주는 간단한 예제를 작성했습니다.

다음
<form id='form'> 
    <div> 
    <label for='input0'>Field 0</label> 
    <input name='input0' type='text'></input> 
    </div> 
</form> 

<a id='moreLink' href='#'>Add Field</a> 

는 자바 스크립트입니다 :

var inputIndex = 0; 

document.getElementById('moreLink').addEventListener('click', function() { 
    var form = document.getElementById('form'), 
    newLabel = document.createElement('label'), 
    newInput = document.createElement('input'), 
    newDiv = document.createElement('div'), 
    inputId 
    ; 

    inputIndex++; 
    inputId = 'input' + inputIndex; 

    newLabel.htmlFor = inputId; 
    newLabel.innerHTML = 'Field ' + inputIndex; 
    newInput.name = inputId; 
    newInput.type = 'text'; 

    newDiv.appendChild(newLabel); 
    newDiv.appendChild(newInput); 

    form.appendChild(newDiv); 
}); 

그리고 여기 당신이 행동에서 볼 수 있도록 JSFiddle에 대한 링크입니다 : http://jsfiddle.net/tpmet/

이가 꽤 여기

는 HTML의 순진한 해결책이지만 잘 수행 될 것이고 적어도 IE6만큼 멀리 돌아가는 어떤 브라우저에서도 작동 할 것이다.

마크 업이 복잡해지면 시작시 한 번 템플릿을 만들고 클릭 핸들러에서 해당 템플릿을 복제하는 것이 좋습니다. 전체 양식이나 다른 대량의 DOM을 추가 할 계획이라면 Document Fragments를 읽는 것이 좋습니다. 좀 더 복잡하지만 그 수준에서 더 잘 수행 할 수 있습니다.

희망이 있으면 도움이 되었습니까, 제 대답이 명확하지 않은 경우 의견을주십시오.