【问题标题】:Javascript Function to add/remove fields添加/删除字段的Javascript函数
【发布时间】:2012-03-22 14:02:41
【问题描述】:

我对 JavaScript 不是很有经验,但这段代码与我正在寻找的类似,尤其是它包含“删除字段”链接的地方。这是 JavaScript 函数:

//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 方法中?

【问题讨论】:

    标签: javascript forms function dynamic w3c


    【解决方案1】:

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

    要将 remove-method 添加到 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/

    【讨论】:

    • 我确实在尝试类似的东西,但被“a”所困扰。句法。我也会试试这个。谢谢你。我一定会跟进的,在我尝试之后。
    【解决方案2】:

    我将与 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/

    【讨论】:

    • 谢谢。我会试试这个。这看起来很简单。一旦我了解了我正在做的事情的核心,我希望让它变得更加复杂。具体来说,一组三个字段,可以根据需要作为一个组添加或删除(例如,汽车制造商、发动机类型和制造年份)
    • 出于学习目的,我同意手工制作的纯 js 解决方案,但对于生产,我不明白为什么不依赖干净、轻量级和经过良好测试的库。
    • 好的,我使用了您的代码,并让它与一个组中的三个相关字段一起工作。 jsfiddle.net/wtX7Y/15 再次感谢。
    【解决方案3】:

    我强烈建议你看看 jQuery(或类似的:prototype、motools 等)

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

    【讨论】:

    • 不需要jQuery来创建这么简单的功能。
    • 我使用了一些 jQuery 进行表单验证,主要是使用 PHP 来检查现有数据库条目的“远程”功能。我不知道它可以做这样的事情。我确实想了解它的 JavaScript,但任何解决方案都可以。我认为我的表单可能会变得更加复杂,其中包含我想要一起添加和删除的三个相关字段(例如,汽车制造商、发动机类型和制造年份的三个相关字段)。
    • Bergi 阅读了我对 Chris Sobolewski 解决方案的评论。然后想想,当你在软件中迈出第一步时,你无法想象这种情况将来会变成什么样子;所以我总是试图获得最好的解决方案,让我可以轻松地进行任何进一步的更改。
    • kappa - 你能否指出我在 jQuery 中执行此操作的正确方向。我想知道如何以两种方式做到这一点,并且您的观点在易于更新方面得到了很好的理解。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2017-10-09
    相关资源
    最近更新 更多