Javascript范围(或其他)问题

时间:2011-02-10 21:11:03

标签: javascript variables scope

我有这个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");
    }
}

为什么会这样?

4 个答案:

答案 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是否符合预期。