Javascript添加/删除字段的功能

时间:2012-03-22 14:02:41

标签: javascript forms function dynamic w3c

我对JavaScript不是很熟悉,但是这段代码与我想要的类似,特别是在它包含“删除字段”链接的情况下。这是Javscript函数:

//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>

但是,我希望使用“删除链接”代码生成其他字段,而不仅仅是脚本中包含代码的代码。我知道必须调整自定义函数以包含该行为,但是在尝试使该函数工作时遇到各种麻烦。通过编辑代码来读取在addField函数底部的“} else {”之后的旧方法中执行此操作似乎很简单:

} 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方法中感到难过?

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

我将与Kappa不同,并鼓励你继续做你正在做的事情。 JQUery非常适合它,但它经常是一个拐杖,而且知道你正在做什么以及为什么你在使用javascript时这样做是非常重要的。特别是如果你正在学习这个领域的工作,你将需要直接的JavaScript。

好消息,你要做的事实上很简单!

    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/

答案 2 :(得分:-1)

我强烈建议你看看jQuery(ora类似:原型,motools等......)

他们拥有全功能的DOM操作功能,这使得你所要求的内容与编写1行js一样复杂。