繁体   English   中英

如何使用JavaScript验证克隆的输入?

[英]How to validate cloned inputs using Javascript?

我在使用标识元素时遇到问题。 基本上,我想创建一个简单的html表单,用户可以在其中输入需要验证并发送到特定文件夹的电话号码(与特定代码相关)。

但是,我想让用户可以输入所需数量的电话号码。 因此,使用克隆方法对我来说似乎合乎逻辑。 但是,使用此方法的不利方面是身份始终相同。 换句话说,如果电话号码输入错误,则无法使用户参考与验证规则不符的输入文本。

我已经尝试了几种方法,但是我根本不知道如何将标识元素“ Tel”增加1,或验证每个输入文本。

在下面可以找到我的代码。 我使用了getElementsByName方法,因为Firefox自动为每个输入名称分配一个递增的数字。 但是,如果我可以为使用的每个输入文本找到一种将标识增加1的方法,则我更喜欢这种工作方式。 我愿意接受所有建议,但我更喜欢使用普通的javascript,因为我对JQuery不熟悉。

提前谢谢。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SMS</title>
</head>
<body>

<script type="text/javascript">

var counter = 0;

function moreFields() {
    counter++;
    var newFields = document.getElementById('readroot').cloneNode(true);
    newFields.id = '';
    newFields.style.display = 'block';
    var newField = newFields.childNodes
    for (var i=0;i<newField.length;i++) {
        var theName = newField[i].name;
        if (theName)
            newField[i].name = theName + counter;
    }
    var insertHere = document.getElementById('writeroot');
    insertHere.parentNode.insertBefore(newFields,insertHere);
}

window.onload = moreFields;


function checkPhone() {

var x=document.getElementsByName("Tel").length;


var TotTel = new Array();

for(i = 0; i < x; i++)
{
TotTel[i] += document.getElementsByName('PhoneNumber')[i].value;


if(TotTel[i] == "" || TotTel[i] == null)
{
alert("Please enter a phone number");
return false;
}

else if(isNaN(TotTel[i]))
{
    alert("You can only enter numbers");
    return false;
}
}
alert("Validation ok");
return true;
}

</script>


<div id="readroot" style="display:none">

    <input type="button" value="Remove field" onclick="this.parentNode.parentNode.removeChild(this.parentNode);"  /><br /><br />

    Phone number:   <input name="PhoneNumber" class="Tel" id="Tel" />

    SMSCode: <select name="SMSCodes">
        <option>Codes</option>
        <option value="B2BNL"> B2BNL </option>
        <option value="B2BFR"> B2BFR </option>
        <option value="B2BEN"> B2BEN </option>
        <option value="B2CNL"> B2CNL </option>
        <option value="B2CFR"> B2CFR </option>
        <option value="B2CEN"> B2CEN </option>
        <option value="AMNL"> AMNL </option>
        <option value="AMFR"> AMFR </option>
        <option value="PMNL"> PMNL </option>
        <option value="PMFR"> PMFR </option>
        <option value="PMPNL"> PMPNL </option>
        <option value="PMPFR"> PMPFR </option>
        <option value="BWAYAM"> BWAYAM </option>
        <option value="BWAYPM"> BWAYPM </option>
        <option value="BWAYPMP"> BWAYPMP </option>
        <option value="BWAY18"> BWAY18 </option>
        <option value="SPEOSNL1114"> SPEOSNL1114 </option>
        <option value="SPEOSFR1114"> SPEOSFR1114 </option>
        <option value="SPEOSNL1417"> SPEOSNL1417 </option>
        <option value="SPEOSFR1417"> SPEOSFR1417 </option>
        <option value="SPEOSNL1721"> SPEOSNL1721 </option>
        <option value="SPEOSFR1721"> SPEOSFR1721 </option>  
    </select><br /><br />
</div>

<form name="SMSForm" action="" onsubmit="checkPhone()" method="post">

    <span id="writeroot"></span>

    <input type="button" onclick="moreFields()" value="More Phone numbers" />
    <input type="submit" value="Send" />

</form>

</body>
</html>

您的代码中存在多个错误,如果您对其进行修复,它应该可以工作。

var x=document.getElementsByName("Tel").length;

上面的表达式的值为0,因为“ Tel”是文本字段的ID。

for(i = 0; i < x; i++){

请注意,firefox将1分配给第一个文本字段,而不是0。

TotTel[i] += document.getElementsByName('PhoneNumber')[i].value;

上面的代码错误行,因为它仅返回确切名称为“ PhoneNumber”的节点,而不返回“ PhoneNumberSomething”的节点。 您可以尝试类似

TotTel[i] += document.getElementsByName('PhoneNumber'+i)[0].value;

例如,PhoneNumber1是唯一名称,因此该方法返回一个元素数组。 并且请注意,用户可以添加更多电话号码字段,然后删除第一个。 结果号码序列将为1、3、4 ...,但PhoneNumber2不存在。

我虽然有两种方法来解决这个问题。

第一个是构造一个数组或类似的东西,以便在克隆节点时存储该节点,并在用户删除它时从数组中删除它,以便您可以从该数组中找到任何克隆的节点。

arr[counter] = document.getElementById('readroot').cloneNode(true);

第二种方法使用jquery http://api.jquery.com/attribute-contains-selector/

$("form input[name*=PhoneNumber]")

上面的选择器将选择名称中包含PhoneNumber的所有文本字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM