用于添加/删除字段的Javascript函数

用于添加/删除字段的Javascript函数,javascript,forms,function,dynamic,w3c,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

我对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>";
    }
}
//动态添加更多字段。
函数addField(字段、区域、限制){
如果(!document.getElementById)返回;//防止旧浏览器进一步访问。
变量字段\区域=document.getElementById(区域);
var all_inputs=field_area.getElementsByTagName(“输入”);//获取给定区域中的所有输入字段。
//查找列表中最后一个元素的计数。其格式为“”。如果
//参数中给出的字段为“friend_”,最后一个id为“friend_4”。
var last_item=所有_输入。长度-1;
var last=所有输入[最后一项].id;
var计数=数量(最后一次分割(“”)[1])+1;
//如果已达到最大元素数,则退出该函数。
//如果给定的限制小于0,则可以创建无限数量的字段。
如果(计数>限制和限制>0)返回;
if(document.createElement){//W3CDOM方法。
var li=document.createElement(“li”);
var输入=document.createElement(“输入”);
input.id=字段+计数;
input.name=字段+计数;
input.type=“text”;//字段类型-可以是任何有效的输入类型,如文本、文件、复选框等。
li.追加子项(输入);
场区面积(li);
}else{//Older方法
field_area.innerHTML+=“
  • ”; } }
    以下是表单的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>";
    }
    
    }else{//Older方法
    field_area.innerHTML+=“
  • 删除字段”
  • ”; }

    然而,如何将其包括在W3C DOM方法中,我感到很困惑。

    我强烈建议您看看jQuery(类似于:prototype、motools等)

    它们具有功能齐全的DOM操作功能,这使得您的请求与编写一行js一样复杂。

    如果(!document.getElementById)和
    如果(document.createElement)
    条件,请删除这些
    。每个浏览器都支持它们,而那些不值得支持的浏览器(让它们抛出错误)

    要将remove方法添加到DOM创建的元素中,只需使用
    onclick
    属性。您也可以使用,但这需要IE的一些变通方法。请参阅第节和

    所以代码应该是

    ...
    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);
    

    我不同意卡帕的观点,强烈鼓励你继续做你正在做的事情。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);
    

    以下是JSFIDLE上的代码:

    不需要jQuery来创建这样一个简单的功能。我使用了一些jQuery进行表单验证,主要是“远程”函数,用PHP检查现有的数据库条目。我不知道它能做这样的事情。我确实想了解它的JavaScript,但任何解决方案都可以。我认为我的表单可能会变得更加复杂,因为我希望将三个相关字段添加到一起,然后一起删除(例如,汽车制造、发动机类型和制造年份的三个相关字段)。Bergi阅读了我对Chris Sobolewski解决方案的评论。然后想一想,当你在软件中迈出第一步时,你无法想象这种情况在未来会变成什么样子;因此,我总是试图得到最好的解决方案,这将使我能够轻松地进行任何进一步的更改。kappa-关于在jQuery中执行此操作,您能为我指出正确的方向吗。我想知道如何做到这两个方面,你的观点是很好地采取关于易于更新。ThanksI肯定是在尝试类似的东西,但是被“a”语法所困扰。我也要试试这个。非常感谢。我一定会跟进,在我尝试之后。谢谢。我要试试这个。这看起来很简单。我希望一旦我理解了我所做的核心,事情会变得更复杂。具体来说,一组三个字段可以作为一个组进行添加或删除(例如,汽车品牌、发动机类型和制造年份),用于学习目的我同意手工制作的简单js解决方案,但对于生产,我不明白为什么不依赖干净、轻量和经过良好测试的库。好的,我使用了您的代码,并将其与团队中的三个相关字段一起使用。再次感谢。