почему этот массив javascript для цикла не работает как буквальная версия? - PullRequest
0 голосов
/ 21 октября 2009

Я новичок в javascript и пытался провести рефакторинг некоторого кода, очевидно, что в javascript мне чего-то не хватает, и я хотел бы изучить его. Этот код выдает значение, если во всех 5 списках есть что-то выбранное:

function GetTotal() {
        //_listSeverity = document.getElementById("_listSeverity");
        function ParseListBoxvalue(listBox) {
        return parseInt(GetListBoxValue(listBox),10);
        }
        _listSeverity = document.getElementById("<%= _listSeverity.ID %>");
        _listAssociate = document.getElementById("<%= _listAssociateImpact.ID %>");
        _listCustomerImpact = document.getElementById("<%= _listCustomerImpact.ID %>");
        _listRegulatoryImpact = document.getElementById("<%= _listRegulatoryImpact.ID %>");
        _listShareholderImpact = document.getElementById("<%= _listShareholderImpact.ID %>");
        _calculatedTotal = (ParseListBoxvalue(_listAssociate) +
            ParseListBoxvalue(_listSeverity) + ParseListBoxvalue(_listCustomerImpact) 
           +ParseListBoxvalue(_listRegulatoryImpact) + ParseListBoxvalue(_listShareholderImpact)
          )/ 5;
        if (isNaN(_calculatedTotal))
            document.getElementById("_total").innerHTML = "Not enough information";
        else
            document.getElementById("_total").innerHTML = _calculatedTotal;
    }

Затем я попытался выполнить рефакторинг в цикл for, чтобы исключить дублирование кода. Я перепробовал много методов if(typeof _calculatedValue !='undefined'), которые я обнаружил в Google, чтобы понять, может ли это решить эту проблему. Насколько я понимаю, я не сталкиваюсь с проблемой области действия, поскольку единственные реальные области действия ограничены объявлениями function(){}. Это никогда не производит ценность. Я понимаю, что / 5 еще не в нем, но это не кажется мне причиной для того, чтобы всегда производить NaN.

 function GetTotal() {
        //_listSeverity = document.getElementById("_listSeverity");
        function ParseListBoxvalue(listBox) {
        return parseInt(GetListBoxValue(listBox),10);
    }
        var _ListIds=new Array("<%= _listSeverity.ID %>","<%= _listAssociateImpact.ID %>",
            "<%= _listCustomerImpact.ID %>", "<%= _listRegulatoryImpact.ID %>",
            "<%= _listShareholderImpact.ID %>");
//            _calculatedTotal = (ParseListBoxvalue(_listAssociate) +
//                ParseListBoxvalue(_listSeverity) + ParseListBoxvalue(_listCustomerImpact) 
//               +ParseListBoxvalue(_listRegulatoryImpact) + ParseListBoxvalue(_listShareholderImpact)
        //              )/ 5;
        for (i = 0; i < _ListIds.length; i++) {
            if (i==0)
                _calculatedTotal = ParseListBoxvalue(_ListIds[i]);
            else
                _calculatedTotal += ParseListBoxvalue(_ListIds[i]);
        }

        if (isNaN(_calculatedTotal))
            document.getElementById("_total").innerHTML = "Not enough information";
        else
            document.getElementById("_total").innerHTML = _calculatedTotal;
    }

Другая функция не должна иметь никакого отношения, но вот она:

function GetListBoxValue(listBox) {
        index = listBox.selectedIndex
        try {
            opt = listBox.options[index]
            return opt.value;
        } catch (e) { return null; }

    }

Что не так с этим для цикла? или это что-то кроме цикла for, которое приводит к тому, что рефакторинг не дает значения?

Ответы [ 3 ]

8 голосов
/ 21 октября 2009

Вы не звонили document.getElementById():

_calculatedTotal = ParseListBoxvalue(_ListIds[i]);

должно быть

_calculatedTotal = ParseListBoxvalue(document.getElementById(_ListIds[i]));

и аналогично для другой ветки.

2 голосов
/ 21 октября 2009

Некоторые проблемы:

  • Как сказал Грег, вы не звонили document.getElementById.
  • Вы не делите сумму на 5, как это было в оригинальном коде.
  • Обязательно объявите свои переменные (например, i); в противном случае это глобалы (см. Ужас неявных глобалов ). (В старом коде это тоже не учитывалось.)
  • Настоятельно рекомендуем использовать фигурные скобки, даже если в ветви есть только один оператор.
1 голос
/ 21 октября 2009

Некоторые улучшения:

var _calculatedTotal  = ParseListBoxvalue(document.getElementById(_ListIds[0]));
for (var i = 1; i < _ListIds.length; i++) {
 _calculatedTotal += ParseListBoxvalue(document.getElementById(_ListIds[i]));
}

document.getElementById("_total").innerHTML = isNaN(_calculatedTotal) ? "Not enough information" : _calculatedTotal


function GetListBoxValue(listBox) {
 if(listBox.selectedIndex){
 var opt = listBox.options[listBox.selectedIndex]
 }
 return opt ? opt.value : null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...