循环遍历输入数组以设置值,“无法设置未定义的属性值”
looping through array of inputs to set value, "cannot set property value of undefined"?
我正在寻找一种简单的Javascript方法来修复我的以下代码:
function autoFill(response) {
var arr = [];
arr.fn = document.getElementsByName("firstName")[1];
arr.ln = document.getElementsByName("lastName")[1];
arr.em = document.getElementsByName("Email")[1];
arr.pn = document.getElementsByName("phoneNumber")[1];
if(response === false) {
alert('false');
arr.forEach(function(entry){
entry.value = "";
});
}else{
alert('true');
arr.fn.value = response.firstName;
arr.ln.value = response.lastName;
arr.en.value = response.email;
arr.pn.value = response.phone;
}
}
我想做什么:
如果response data === false
,则遍历arr[]
中的每个元素,并将其文本值设置为空""
。
发生了什么事情:
直接设置值有效(如else{}
块所示),但是循环或迭代数组会引发错误:Uncaught TypeError: Cannot set property 'value' of undefined
问题:
如何遍历存储在数组中的输入集合并设置它们的值?为什么会抛出undefined
错误?
谢谢!
编辑:更改为以下内容没有任何作用; else{]
块仍然可以正常工作,循环是我认为的问题。
function autoFill(response) {
var arr = [];
arr["fn"] = document.getElementsByName("firstName")[1];
arr["ln"] = document.getElementsByName("lastName")[1];
arr["em"] = document.getElementsByName("Email")[1];
arr["pn"] = document.getElementsByName("phoneNumber")[1];
if(response === false) {
alert('false');
arr.forEach(function(entry){
entry.value = "";
});
}else{
alert('true');
arr["fn"].value = response.firstName;
arr["ln"].value = response.lastName;
arr["en"].value = response.email;
arr["pn"].value = response.phone;
}
}
您需要使用对象而不是数组,并且应该使用"点表示法"以获得更好的清晰度。
编辑
我更改了代码,因为我不喜欢说"不,你不能",所以这是带有循环的新函数。
function autoFill(response) {
var fill = {};
for (var i=0; i < document.myForm.elements.length; i++) {
var elm = document.myForm.elements[i]; // Get current element.
fill[elm.name] = elm; // Associate fill[input name] with current input.
if (elm.getAttribute("data-autofill") === "undefined" ||
elm.getAttribute("data-autofill") === null) continue; // Continue if property data-autofill is not set.
// If response have the input name as key, we set the value otherwise, it would be an empty string or unchecked.
switch(elm.type) {
case 'checkbox':
case 'radio':
response.hasOwnProperty(elm.name) ? fill[elm.name].checked = response[elm.name] : fill[elm.name].checked = false; // Checked if response if true.
break;
default:
response.hasOwnProperty(elm.name) ? fill[elm.name].value = response[elm.name] : fill[elm.name].value = ""; // Set response text or a empty string.
}
}
return fill; // Return object for later uses.
}
var myForm = autoFill({
firstName: "John",
check: true,
ni: "Not supposed to be set" // Won't set because he doesn't have the property data-autofill.
});
myForm.lastName.value = "Awesome"; // Now we can set values like this because we returned all form elements.
还有小提琴。
要重用函数每个区域中的名称,请将它们添加到数组中并迭代它们,但您需要确保 response
中的属性和 DOM 元素名称匹配。
function autoFill(response) {
var arr = ['firstName', 'lastName', 'Email', 'phoneNumber'];
var obj = {};
arr.forEach(function (el) {
obj[el] = document.getElementsByName(el)[1];
});
if (response === false) {
alert('false');
for (var k in obj) {
obj[k]['value'] = "";
}
} else {
alert('true');
arr.forEach(function (el) {
obj[el]['value'] = response[el];
});
}
}
您应该将输入字段存储到数组中,如下所示arr[0], arr[1] 并使用索引访问它们。
你已经声明了:var arr = []; 然后分配 arr.fn, arr.ln n so..
要么声明 var arr = {}; 要么将 arr.fn, arr.ln 指定为 arr[0], arr[1]。
当您分配时,
var arr = [];
arr["fn"] = document.getElementsByName("firstName")[1];
并观察 arr 的值,它将为空。 所以将其声明为 var arr= {}。
相关文章:
- 打字稿显示不能设置未定义的属性,如何解决
- 未捕获类型错误:无法设置未定义的属性“操作”
- 快速会话 无法设置未定义的属性“id”
- 节点.js未捕获的异常类型错误:无法设置未定义的预处理 ''
- 如何处理 getJSON 调用上的“未捕获类型错误:无法设置未定义的属性'prop'”
- 在 JavaScript 对象中添加子对象时获取“无法设置未定义的属性'项目'”
- 在读取之前设置未定义的 javascript 属性
- '无法设置未定义'的属性;应用绑定时出错
- 不能设置未定义的属性
- 无法设置未定义或空引用的属性“ajax已启用”
- 二维数组未捕获类型错误:无法设置未定义的属性“0”
- 无法设置未定义的属性
- 循环遍历输入数组以设置值,“无法设置未定义的属性值”
- 无法设置未定义的属性“helloMessage”
- 类型错误: 无法设置未定义的属性<函数>
- 未捕获的类型错误: 无法设置未定义的属性“0”
- 无法设置未定义的属性“remote_auth_s3”,当尝试使用 PHP/Laravel 实现 Disqus SSO 时
- 无法设置未定义的 - 以编程方式创建的元素的属性 X
- Ember Data 1.0 加载路由时出错:类型错误:无法设置未定义的属性“类型键”
- AngularJS 表单验证 - 类型错误:无法设置未定义的属性“整数”