【问题标题】:JS: change "var y = UNDEFINED" for "var y= blank space" with ifJS:用 if 将“var y = UNDEFINED”更改为“var y = 空格”
【发布时间】:2020-04-25 07:50:52
【问题描述】:

我有一个由用户填充的文本区域生成的表格,但有时,一个单元格保持为空(没关系)。

问题是该单元格的.innerHTML 也是脚本中的var y,当该单元格为空(因此,未定义)时,我的var y 也变为未定义(值,而不是字符串) ,这使我的整个脚本失败。

这是一个显示问题的sn-p:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body><center>

</center></body>

<!--------- script that generates my table from text areas -->
<script>         
				function generateTable() {
                    $('#excel_table1').html("");
					 var n=1;
					 var rows=[];
					 var lng=0;
					 var maxligne=0;
                     
					$('textarea').each(function(){
					  var data = $(this).val();
                        if (data !=''){
					  var rowData = data.split("\n");
					  rows[n] = rowData;
					  lng = rowData.length;
                    if(lng > maxligne)
                    {
                     maxligne=lng   
                    }
                      n++;  
                
                    }
                    }
				
				)
					var table = $('<table />');
					k=0;
					while (k < maxligne) {
						var row = $('<tr />');
						for(var i = 1; i < rows.length; i++)
						{
							var singleRow = rows[i];
                            
                            if(singleRow[k]!= undefined){
							row.append('<td>'+singleRow[k]+'</td>')		
						} else {
                        row.append('<td></td>')	
                            }
                        }
						table.append(row);
						k++;
					}
					$('#excel_table1').append(table);
				}    
			</script>
      
      <textarea placeholder="data 2 Here" name="data1" style="width:100px;height:40px;"></textarea> 
					   
		<textarea placeholder="data 2 Here" name="data2" style="width:200px;height:40px;"></textarea>
				    
	 <textarea placeholder="fild not required" name="data3" style="width:200px;height:40px;"></textarea>
			
			<br>
            
			<input id=bouton1 type="button" onclick="javascript:generateTable()" value="GenerateTable"/>
      
      <div id="excel_table1"></div>
      
<!--------- script that get the data from cells to show it in <H2> -->

<script type="text/javascript">

     function buttonTEST()
               {
                $('#displayCell').html("");
                   
                var x = document.getElementById('excel_table1').getElementsByTagName('tr')[0].cells[1].innerHTML;
                var y = document.getElementById('excel_table1').getElementsByTagName('tr')[0].cells[2].innerHTML;
               if (y === undefined) {
    y = " ";
}
                   
             document.getElementById('displayCell').innerHTML = x +" "+ y;
             }
              
 </script>
 
 <br/><br/>
       <h2 id="displayCell"></h2>
 <br/><br/>
      <input id="Button2" type="button" onclick="buttonTEST()" value="TEST ME"/>

如您所见,如果您生成一个仅包含列的表(有时应该/需要发​​生),我们会从控制台收到此错误,因为我们试图从未定义的对象中获取“innerHTML”:

index.html:120 Uncaught TypeError: Cannot read property 'innerHTML' of undefined

一个小规范:当那个单元格是=undefined时,我需要它保持undefined,我只想改变我的var y也变得未定义的事实。 所以我认为将var y 的值(而不是该单元格的值,否则,应该为空的第三列将因为空格而创建)为空格将解决问题,但我似乎没有写对(以正确的方式写出来)。

有什么想法吗?

【问题讨论】:

  • 您能否在此处使用jsfiddlesnippet 为此创建一个small demo 以显示正在发生的问题。
  • 您的脚本没有失败,因为 y 未定义。它失败了,因为您试图获取未定义元素的 innerHTML。任一单元格或“响应”元素。
  • 您似乎拥有 jQuery,但仍求助于良好的旧原生 DOM 函数。除了明显的编码错误,如果你只是坚持使用库,你可能不会遇到未定义元素的问题。
  • @palaѕн 是的,好主意。现在更容易理解了,谢谢!
  • @JonasHøgh 是的,你完全正确!但实际上我已经知道了,但是我不能从getElementsByTagName('tr')[0].cells[2].innerHTML 中删除innerHTML,因为当单元格存在时,我需要它的innerHTLM;这就是为什么我试图在“未定义”时更改var 的值。

标签: javascript undefined innerhtml var


【解决方案1】:

试试

var x = document.getElementById('excel_table1').rows[0].cells[0].innerHTML;
var y = document.getElementById('excel_table1').rows[0].cells[1].innerHTML;

使用行而不是getElementsByTagName 更简洁。 另请注意,单元格的索引从零开始而不是 1,您的第一行中可能只有 2 个单元格,但 .cells[2].innerHTML 尝试获取不存在的第 3 个单元格的 innerHTML。

【讨论】:

  • 感谢您的帮助。我知道细胞计数从零开始,这不是问题。问题是表格的列数(因此单元格的 n°)发生了变化。我在我的问题中做了一个 sn-p。希望现在更清楚了!
【解决方案2】:

正如其他人指出的那样,您已经在使用 jQuery,因此获取单元格内容的最简单方法是使用 css 选择器使用 $ 函数查找单元格,然后调用 .html() 获取内容。将您当前的代码直接转换为这种方法可能是:

var x = $('#excel_table1 tr:nth-child(1) td:nth-child(2)').html();
var y = $('#excel_table1 tr:nth-child(1) td:nth-child(3)').html();

这在某种程度上使$ 函数返回一个jQuery 对象,该对象本质上是一组元素,可能为空。然后,大多数 jQuery 函数被设计为在空集上调用时优雅地失败。例如,html 在空集上调用时会返回 undefined,但不会失败。

请注意,使用上面的选择器不是很健壮,因为它显然对单元格的位置很敏感。将类属性分配给描述其内容的单元格,然后选择它会更易于维护,例如像

var name = $("#excel_table1 tr:nth-child(1) td.name").html()

【讨论】:

  • 感谢您的帮助,$ 函数确实是答案。从此,我只需要添加一个 if (y ===undefined) 然后只显示 var x else 显示 var xvar y
【解决方案3】:

所以这是对我有用的答案:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body><center>

</center></body>

<!--------- script that generates my table from text areas -->
<script>         
				function generateTable() {
                    $('#excel_table1').html("");
					 var n=1;
					 var rows=[];
					 var lng=0;
					 var maxligne=0;
                     
					$('textarea').each(function(){
					  var data = $(this).val();
                        if (data !=''){
					  var rowData = data.split("\n");
					  rows[n] = rowData;
					  lng = rowData.length;
                    if(lng > maxligne)
                    {
                     maxligne=lng   
                    }
                      n++;  
                
                    }
                    }
				
				)
					var table = $('<table />');
					k=0;
					while (k < maxligne) {
						var row = $('<tr />');
						for(var i = 1; i < rows.length; i++)
						{
							var singleRow = rows[i];
                            
                            if(singleRow[k]!= undefined){
							row.append('<td>'+singleRow[k]+'</td>')		
						} else {
                        row.append('<td></td>')	
                            }
                        }
						table.append(row);
						k++;
					}
					$('#excel_table1').append(table);
				}    
			</script>
      
      <textarea placeholder="data 2 Here" name="data1" style="width:100px;height:40px;"></textarea> 
					   
		<textarea placeholder="data 2 Here" name="data2" style="width:200px;height:40px;"></textarea>
				    
	 <textarea placeholder="fild not required" name="data3" style="width:200px;height:40px;"></textarea>
			
			<br>
            
			<input id=bouton1 type="button" onclick="javascript:generateTable()" value="GenerateTable"/>
      
      <div id="excel_table1"></div>
      
<!--------- script that get the data from cells to show it in <H2> -->

<script type="text/javascript">

     function buttonTEST()
               {
                $('#displayCell').html("");
                   
var x = $('#excel_table1 tr:nth-child(1) td:nth-child(2)').html();
var y = $('#excel_table1 tr:nth-child(1) td:nth-child(3)').html();
               
 if (y ===undefined)

    {document.getElementById('displayCell').innerHTML = x ;}
               
 else
     {document.getElementById('displayCell').innerHTML = x +" "+ y;}

    }
              
 </script>
 
 <br/><br/>
       <h2 id="displayCell"></h2>
 <br/><br/>
      <input id="Button2" type="button" onclick="buttonTEST()" value="TEST ME"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-10-31
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多