我有这个Javascript片段。我稍后需要函数中的变量highest_number,我可以生成它。问题是,一旦for循环结束(例如在关闭之后),highest_number似乎是不可访问的。
function new_route(parts) {
var highest_number = -1;
alert(parts);
if (parts[0] == "field") {}
else if (parts[0] == "option") {
//find last option input id
var select_container = "container_" + parts[2];
var thisContainer = document.getElementById(select_container);
var optionsList = thisContainer.getElementsByTagName("input");
for (var i = 0; i < optionsList.length; i++) {
var option_parts = optionsList[i].getAttribute("id").split("_");
if (option_parts[0] == "option") {
alert(option_parts);
if (option_parts[2] > highest_number) {
highest_number = option_parts[2];
}
}
}
alert(highest_number);
var labelNode = document.createElement("label");
var inputNode = document.createElement("input");
}
}
为什么会这样?
答案 0 :(得分:4)
您未在问题中提供所有相关信息,因此我前几天正在处理您的问题。
问题的至少一部分是getElementsByTagName('input')
,因为它包含没有ID的submit
按钮。
所以,当你到达:
var option_parts = optionsList[i].getAttribute("id").split("_");
您正试图在.split()
上进行null
。
如果在循环中排除没有ID的元素,它将起作用:
for (var i = 0; i < optionsList.length; i++) {
// if no ID, continue to the next item
if( !optionsList[i].id ) continue;
var option_parts = optionsList[i].getAttribute("id").split("_");
旁注。请在问题中包含相关信息。它节省了每个人的时间
Here's a jsFiddle您的代码在行动中。它是我之前发布的小提琴更新的。如果您将来有关此代码的问题,可能需要使用它。
答案 1 :(得分:1)
当您获得“option_parts”时,您将获得一系列字符串。你应该确保在那里明确地转换为整数(好吧,到数字)。比较将在第一次迭代时作为数字比较完成,但只要您将“highest_number”设置为“option_parts [2]”,那么它也将是一个字符串。
你能做的是:
// ...
var option_parts = optionsList[i].getAttribute("id").split("_");
if (option_parts[0] === "option") {
var index = parseInt(option_parts[2], 10); // <----- the important thing
if (index > highest_number)
highest_number = index;
}
答案 2 :(得分:1)
警告框位于else语句的框架中。尝试将其移至功能的真正结尾
function new_route (parts) {
var highest_number = -1;
alert (parts);
if (parts[0] == "field") {
} else if (parts[0] == "option") {
//find last option input id
var select_container = "container_"+parts[2];
var thisContainer = document.getElementById (select_container);
var optionsList = thisContainer.getElementsByTagName ("input");
for (var i = 0; i< optionsList.length; i++) {
var option_parts = optionsList[i].getAttribute("id").split("_");
if (option_parts[0] == "option") {
alert (option_parts);
if (option_parts[2] > highest_number) {
highest_number = option_parts[2];
}
}
}
alert (highest_number);
var labelNode = document.createElement ("label");
var inputNode = document.createElement ("input");
}
alert (highest_number); // Add Alert here!
}
答案 3 :(得分:0)
如果搜索到命名元素但找不到,则执行将停止。使用document.getElementById
仔细检查(使用警报)正在搜索正确的元素ID var thisContainer = document.getElementById (select_container);
检查select_container是否符合预期。