2012-03-22 5 views
3

자바 스크립트에 익숙하지 않지만이 코드는 특히 '필드 제거'링크가있는 곳과 유사합니다. 여기자바 스크립트 기능 필드 추가/제거 기능

//Add more fields dynamically. 
function addField(field,area,limit) { 
    if(!document.getElementById) return; //Prevent older browsers from getting any further. 
    var field_area = document.getElementById(area); 
    var all_inputs = field_area.getElementsByTagName("input"); //Get all the input fields in the given area. 
    //Find the count of the last element of the list. It will be in the format '<field><number>'. If the 
    //  field given in the argument is 'friend_' the last id will be 'friend_4'. 
    var last_item = all_inputs.length - 1; 
    var last = all_inputs[last_item].id; 
    var count = Number(last.split("_")[1]) + 1; 

    //If the maximum number of elements have been reached, exit the function. 
    //  If the given limit is lower than 0, infinite number of fields can be created. 
    if(count > limit && limit > 0) return; 

    if(document.createElement) { //W3C Dom method. 
     var li = document.createElement("li"); 
     var input = document.createElement("input"); 
     input.id = field+count; 
     input.name = field+count; 
     input.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc. 
     li.appendChild(input); 
     field_area.appendChild(li); 
    } else { //Older Method 
     field_area.innerHTML += "<li><input name='"+(field+count)+"' id='"+(field+count)+"' type='text' /></li>"; 
    } 
} 

형태의 HTML한다 : 그러나

<form name="frm" method="POST"> 
<strong>Neutral List</strong><br /> 
<ol id="neutrals_area"> 
<li><input type="text" name="neutral_1" id="neutral_1" /> <a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li> 
<li><input type="text" name="neutral_2" id="neutral_2" /> <a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li> 
<li><input type="text" name="neutral_3" id="neutral_3" /> <a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li> 
<li><input type="text" name="neutral_4" id="neutral_4" /> <a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li> 
<li><input type="text" name="neutral_5" id="neutral_5" /> <a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li> 
</ol> 
<input type="button" value="Add Neutral Field" onclick="addField('neutrals_area','neutral_',0);" /> 
</form> 

내가의 '링크 제거'코드뿐만 아니라 사람을 생성하기 위해 추가 필드를 싶습니다, 여기에 javscript 기능입니다 스크립트에 코드가 있습니다. 사용자 정의 함수는 해당 동작을 포함하도록 조정해야하지만 모든 기능을 작동 시키려면 문제가있는 것으로 알고 있습니다. 그것은 읽을 수있는 코드를 편집하여 addField 함수의 맨 아래에 "다른 {}"다음과 같은 기존의 방법으로 그것을 할 간단 보인다

} else { //Older Method 
    field_area.innerHTML += "<li><input name='"+(field+count)+"' id='"+(field+count)+"' type='text' /><a style="cursor:pointer;color:blue;" onclick="this.parentNode.parentNode.removeChild(this.parentNode);">Remove Field</a></li>"; 
} 

을하지만, 나는 그것을 포함하는 방법으로 난처한 상황에 빠진거야 W3C DOM 메서드에서?

답변

1

될 것이다. JQuery는 그것이 무엇인지에 대해 훌륭하지만, 너무 자주 버팀목이되며, 자바 스크립트로 작업 할 때 수행중인 작업과 수행중인 작업을 아는 것이 중요합니다. 특히 섹터에서 일하는 법을 배우면 스트레이트 자바 스크립트가 필요합니다.

좋은 소식은, 당신이하려는 것은 실제로 매우 간단합니다!

var li = document.createElement("li"); 
    var input = document.createElement("input"); 
    input.id = field+count; 
    input.name = field+count; 
    input.type = "text"; //Type of field - can be any valid input type like text,file,checkbox etc. 
    li.appendChild(input); 
    field_area.appendChild(li); 
    //create the removal link 
    removalLink = document.createElement('a'); 
    removalLink.onclick = function(){ 
     this.parentNode.parentNode.removeChild(this.parentNode) 
    } 
    removalText = document.createTextNode('Remove Field'); 
    removalLink.appendChild(removalText); 
    li.appendChild(removalLink); 

여기 JSFiddle에 코드입니다 : http://jsfiddle.net/r9bRT/

+0

감사합니다. 나는 이것을 시도 할 것이다. 이것은 간단 해 보인다. 내가하고있는 일의 핵심을 이해하면 더 복잡해지기를 바라고 있습니다. 특히, 그룹으로 필요에 따라 추가하거나 제거 할 수있는 세 개의 필드 그룹 (예 : 자동차 제조업체, 엔진 유형 및 연도) –

+1

스타일 속성을 잊어 버린 경우 :-) http://jsfiddle.net에서 수정되었습니다./wtX7Y/ – Bergi

+0

학습 목적으로 나는 손으로 만든 일반 솔루션에 동의하지만 프로덕션 환경에서는 깨끗하고 가볍고 잘 테스트 된 라이브러리에 의존하지 않는 이유를 알 수 없습니다. – kappa

-1

내가 강력하게 당신이 (ORA 유사한, motools 등 프로토 타입) jQuery를에 살펴보고 제안 그들은 완전한 기능을 갖춘 DOM 조작 기능을

을, 그 JS의 1 개 라인을 작성하는 당신이 복잡한 무엇을 물어하게 .

+1

JQuery와 같은 간단한 기능을 생성 할 필요가 없습니다. – Bergi

+0

폼 유효성 검사를 위해 jQuery를 사용했습니다. 대부분 PHP를 사용하여 기존 데이터베이스 항목을 검사하는 "원격"함수입니다. 나는 이런 일을 할 수 있는지 몰랐다. 나는 그것의 JavaScript를 이해하고 싶다, 그러나 어떤 해결책든지 할 것이다. 나는 함께 추가하고 제거하고자하는 세 가지 관련 분야 (예를 들어 자동차 제조, 엔진 유형 및 제조년을위한 세 가지 관련 분야)를 통해 양식이 더 복잡해 질 것으로 생각합니다. –

+1

Bergi는 Chris Sobolewski 솔루션에 대한 내 의견을 읽었습니다. 그렇다면 소프트웨어의 첫 걸음을 내딛을 때 앞으로 그 상황이 어떻게 될지 상상할 수 없다고 생각하십시오. 그래서 나는 항상 내가 더 이상 변화를 쉽게 할 수있는 최상의 솔루션을 얻으려고 노력한다. – kappa

1

if(!document.getElementById)if(document.createElement) 조건을 제거하십시오. 모든 브라우저는 지원하며, 지원할 가치가없는 것은 지원하지 않습니다 (오류를 버리도록하십시오).

DOM 작성 요소에 제거 방법을 추가하려면 onclick 속성 만 사용하십시오. standard-compliant addEventListner()을 사용할 수도 있지만 IE에는 몇 가지 해결 방법이 필요합니다. 섹션 Legacy Internet Explorer and attachEventOlder way to register event listeners을 참조하십시오.

그래서 코드는 내가 카파와 다를 당신이하고있는 일을 계속 강력히을 장려하는거야

... 
li.appendChild(document.createTextNode(" "); 
var a = document.createElement("a"); 
a.appendChild(document.createTextNode("Remove Field")); 
a.style = "cursor:pointer;color:blue;"; 
a.onclick = function() { 
    // this.parentNode.parentNode.removeChild(this.parentNode); 
    // nay. we have better references to those objects: 
    field_area.removeChild(li); 
}; 
li.appendChild(a); 

http://jsfiddle.net/wtX7Y/2/

+0

나는 확실히 비슷한 것을 시도했지만 "a." 통사론. 나는 이것을 시도 할 것이다. 고맙습니다. 나는 그것을 시도한 후에 분명히 후속 조치를 취할 것이다. –