简体   繁体   English

JavaScript-在“ for”循环中设置表单输入属性

[英]JavaScript - set form input attribute in 'for' loop

This is my first real-world JavaScript project. 这是我的第一个真实世界JavaScript项目。 Please be kind... 请客气...

I'm creating a form with required fields. 我正在创建带有必填字段的表单。 With JavaScript, I am collecting the required fields as objects in an Array, each object having the properties "object" (the HTML objects themselves, from which I can get object.id and object.value) "description" (to display to users) and "error" (the HTML objects beneath each input field where corresponding validation errors appear). 使用JavaScript,我将所需字段收集为数组中的对象,每个对象都具有“对象”属性(HTML对象本身,从中可以获取object.id和object.value)“描述”(向用户显示) )和“错误”(出现相应验证错误的每个输入字段下方的HTML对象)。

Then I have a function (to be used onBlur, for instant feedback) that checks to see if the value of the field is null, and if so, it displays the validation error beneath the corresponding field. 然后,我有一个函数(用于onBlur,用于即时反馈),该函数检查该字段的值是否为null,如果是,则在相应字段下方显示验证错误。

I'm trying to set the onblur attribute for each input field using a FOR loop that runs through the array of required fields. 我正在尝试使用贯穿必需字段数组的FOR循环为每个输入字段设置onblur属性。 I have a setAttribute statement that works perfectly if I create an individual statement for each object in the Array, individually. 我有一个setAttribute语句,如果我为Array中的每个对象分别创建一个单独的语句,则该语句可以完美地工作。 But as soon as I change it to a FOR loop, the onblur event for ANY field pops up the validation error for the FIRST input field, only. 但是,一旦将其更改为FOR循环,ANY字段的onblur事件就仅弹出FIRST输入字段的验证错误。 This has got to be a freshman mistake, but I've searched high and low and rewritten this thing ten different ways and can't make it work with a loop... 这肯定是一个新生的错误,但是我搜索了很多东西,并用十种不同的方式重写了这个东西,并且无法使其循环运行。

I put my code in a Fiddle so you can see it -- but it doesn't actually work in the fiddle, only in my local dev environment (maybe that indicates another problem?). 我将代码放在小提琴中,这样您就可以看到它-但它实际上在小提琴中不起作用,仅在我的本地开发环境中有效(也许这表明了另一个问题?)。 Here's the code: 这是代码:

  //create array with constructor to identify all required fields var allRequired = []; function RequiredField(theID, theDescription) { this.object = document.getElementById(theID); this.description = theDescription; this.error = document.getElementById("error-" + theID); allRequired.push(this); } var fieldFname = new RequiredField("fname", "First Name"); var fieldLname = new RequiredField("lname", "Last Name"); var fieldEmail = new RequiredField("email", "Email"); var fieldPhone = new RequiredField("phone", "Phone"); var fieldRole = new RequiredField("role", "Desired Role"); var fieldPortfolio = new RequiredField("portfolio", "Portfolio/Website URL"); function requireField(theDescription, theValue, theError) { if (theValue === "") { theError.innerHTML = "<p>" + theDescription + " is required.</p>"; } else { theError.innerHTML = ""; } } //end function for (i = 0; i < allRequired.length; i++) { allRequired[i].object.setAttribute("onBlur", "requireField(allRequired[i].description, allRequired[i].object.value, allRequired[i].error);"); } /* THIS WORKS IN MY LOCAL DEV ENVIRONMENT... allRequired[0].object.setAttribute("onBlur", "requireField(allRequired[0].description, allRequired[0].object.value, allRequired[0].error);"); allRequired[1].object.setAttribute("onBlur", "requireField(allRequired[1].description, allRequired[1].object.value, allRequired[1].error);"); allRequired[2].object.setAttribute("onBlur", "requireField(allRequired[2].description, allRequired[2].object.value, allRequired[2].error);"); allRequired[3].object.setAttribute("onBlur", "requireField(allRequired[3].description, allRequired[3].object.value, allRequired[3].error);"); allRequired[4].object.setAttribute("onBlur", "requireField(allRequired[4].description, allRequired[4].object.value, allRequired[4].error);"); allRequired[5].object.setAttribute("onBlur", "requireField(allRequired[5].description, allRequired[5].object.value, allRequired[5].error);"); */ 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form name="form-careers" id="form-careers" action="form-process.php" enctype="multipart/form-data" onsubmit="return validateForm()" method="post"> <div class="form_labels"> <p> <label for="fname">First Name:</label> </p> </div> <div class="form_inputs"> <p> <input type="text" name="fname" id="fname" required /> </p> <div class="error" id="error-fname"></div> </div> <div class="form_labels"> <p> <label for="lname">Last Name:</label> </p> </div> <div class="form_inputs"> <p> <input type="text" name="lname" id="lname" required /> </p> <div class="error" id="error-lname"></div> </div> <div class="form_labels"> <p> <label for="email">Email:</label> </p> </div> <div class="form_inputs"> <p> <input type="email" name="email" id="email" required /> </p> <div class="error" id="error-email"></div> </div> <div class="form_labels"> <p> <label for="phone">Phone:</label> </p> </div> <div class="form_inputs"> <p> <input type="tel" name="phone" id="phone" placeholder="###-###-####" pattern="\\d{3}[\\-]\\d{3}[\\-]\\d{4}" required /> </p> <div class="error" id="error-phone"></div> </div> <div class="form_labels"> <p> <label for="role">Desired Role:</label> </p> </div> <div class="form_inputs"> <p> <input type="text" name="role" id="role" required /> </p> <div class="error" id="error-role"></div> </div> <div class="form_labels"> <p> <label for="portfolio">Portfolio/Website:</label> </p> </div> <div class="form_inputs"> <p> <input type="url" name="portfolio" id="portfolio" placeholder="http://" pattern="[a-z0-9.-]+\\.[az]{2,63}$" required /> </p> <div class="error" id="error-portfolio"></div> </div> <div class="clearboth"></div> <input type="hidden" name="formtype" id="formtype" value="careers"> <div class="form_labels"> <p>&nbsp;</p> </div> <div class="form_inputs"> <a href="#"> <input type="submit" value="Submit" class="btn-red"> </a> </div> </form> 

If someone would help point me in the right direction I would really appreciate it. 如果有人能帮助我指出正确的方向,我将非常感激。

Code

for (i = 0; i < allRequired.length; i++) {
    allRequired[i].object.setAttribute("onBlur", "requireField(allRequired[i].description, allRequired[i].object.value, allRequired[i].error);");
}

sets onblur event with value like requireField(allRequired[i].description . 设置onblur事件,其值类似于requireField(allRequired[i].description

So - what is it - i ? 所以-这是什么- i No one knows. 没人知道。

Proper code is: 正确的代码是:

for (i = 0; i < allRequired.length; i++) {
    allRequired[i].object.setAttribute("onBlur", "requireField(allRequired[" +i + "].description, allRequired[" + i + "].object.value, allRequired[" + i + "].error);");
}

See? 看到? I get real i value for each iteration. 我得到真正的i每次迭代的价值。

As u_mulder said concat problem. 正如u_mulder所说的concat问题。 As for code I suggest to look up factory functions. 至于代码,我建议查找工厂功能。 It's more natural javascript then constructor. 那么比构造函数更自然的javascript。

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

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