【问题标题】:Else statement not executed javascript其他语句未执行 javascript
【发布时间】:2012-03-18 00:19:32
【问题描述】:

嘿,伙计们,每次执行 if 语句时,无论条件是什么。

function addRow(tableID) {

            var table = document.getElementById(tableID);
            if((document.getElementById('select_degree').style.visibility = 'hidden')&&(document.getElementById('select_degree')!=null)){
              document.getElementById('select_degree').style.visibility = 'visible';
              document.getElementById('select_ratings').style.visibility  = 'visible';
             }

            else{ 
            var rowCount = table.rows.length;
            var new_row = table.rows[rowCount-1];  


            var row = table.insertRow(rowCount);


            var colCount = table.rows[0].cells.length;




            for(var i=0; i<colCount; i++) {

                var newcell = row.insertCell(i);


                newcell.innerHTML = new_row.cells[i].innerHTML;
            }
           }             
        }

当 document.getelementById('add_degree') 为 null 时,我收到错误消息:

document.getElementById("select_degree") is null
addRow(tableID="add_degree")

但如果元素为空,我已经有一个 else 语句

【问题讨论】:

  • 如果document.getElementById('select_degree')null,那么document.getElementById('select_degree').style.visibility 会抛出一个错误。如果抛出错误,整个脚本将终止,else 分支将永远不会被执行。颠倒条件。 首先检查元素是否存在,然后赋值(或比较)另一个值。反过来做没有多大意义。
  • 这正是为什么在与文字进行比较时,我将文字作为 LHS 的规则。

标签: javascript if-statement


【解决方案1】:

这就是我喜欢尤达条件句的原因。您正在分配一个值 (=),而不是评估它 ==


编辑 正如所建议的,我可能会指出,这个特定语句中的检查顺序是错误的。检查元素 #select_degree 是否存在应该在尝试修改其属性之前自然发生。

然而,鉴于元素存在,条件仍将始终为真,因为赋值的返回值 (=) 被用作参数。作为 yoda 条件句的倡导者,我能否指出它们的优势:对于以下语句,会引发语法错误:

if ('hidden' = element.style.visibility)
{
// ...
}

【讨论】:

  • 啊,这就是他们切换操作数的原因...很好:)
  • 请看一下我对问题和其他答案所做的 cmets。纠正这个(如果它是无意的)并不能解决整体问题。
【解决方案2】:

您的 if 语句未使用正确的运算符。将您的=(用于赋值)替换为比较运算符:==。此外,在尝试检查其属性之前,您必须检查该元素是否存在。如果你不这样做,当元素不存在时你会得到一个异常。

这是您的代码,已更正和清理:

function addRow(tableID) {
    var objSelectDegree = document.getElementById('select_degree');
    if (objSelectDegree != null && objSelectDegree.style.visibility == 'hidden') {
        objSelectDegree.style.visibility = 'visible';
        document.getElementById('select_ratings').style.visibility = 'visible';
    }
    else {
        // Moved table var to else block - it was not used unless else was hit
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        var new_row = table.rows[rowCount - 1];
        var row = table.insertRow(rowCount);
        var colCount = table.rows[0].cells.length;

        for (var i = 0; i < colCount; i++) {
            var newcell = row.insertCell(i);
            newcell.innerHTML = new_row.cells[i].innerHTML;
        }
    }
}​

【讨论】:

  • 但这并不能解决整体问题(即以错误的顺序检查条件)。在条件中赋值本身并没有错,尽管可能是无意的。
  • @FelixKling,你是对的。一旦我看到不正确的操作员,我就停止寻找。已更正。
【解决方案3】:

在你的 if 语句中:

'=' should be '==' for starters

然后:

(document.getElementById('select_degree').style.visibility == 'hidden')
&&
(document.getElementById('select_degree')!=null)

你先检查一个属性,然后再检查它是否为空,如果你在程序中切换它们,程序将首先检查空,如果是,则转到 else,检查第二个条件。

在这种情况下,即使为null,它也会访问.style.visibility

【讨论】:

    【解决方案4】:

    首先检查 null 条件,这是基本法则,如果存在则继续进行,如在您的情况下,如果元素不存在,它将抛出 undefined 并且什么都不会起作用。甚至在隐藏部分用 == 替换 =

    【讨论】:

      【解决方案5】:

      style.visibility = 'hidden' -> style.visibility == 'hidden'

      <CODE>
      function addRow(tableID) {
      
         var table = document.getElementById(tableID);
         if((document.getElementById('select_degree').style.visibility == 'hidden') && (document.getElementById('select_degree')!=null)){
           document.getElementById('select_degree').style.visibility = 'visible';
           document.getElementById('select_ratings').style.visibility  = 'visible';
         }
      
         else{ 
           var rowCount = table.rows.length;
           var new_row = table.rows[rowCount-1];
           var row = table.insertRow(rowCount);                
           var colCount = table.rows[0].cells.length;
      
           for(var i=0; i<colCount; i++) {     
             var newcell = row.insertCell(i);                    
             newcell.innerHTML = new_row.cells[i].innerHTML;
           }
        }             
      }
      

      【讨论】:

      • 但这并不能解决整体问题(即以错误的顺序检查条件)。在条件中赋值本身并没有错,尽管可能是无意的。
      猜你喜欢
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2018-01-05
      相关资源
      最近更新 更多