JS: измените "var y = UNDEFINED" на "var y = пробел" с помощью if - PullRequest
1 голос
/ 25 апреля 2020

У меня есть таблица, сгенерированная из текстовой области, заполненной пользователями, но иногда ячейка остается пустой (и все в порядке).

Дело в том, что .innerHTML этой ячейки также мой var y в сценарии, и когда эта ячейка пуста (поэтому не определена), моя var y тоже становится НЕ УКАЗАНА (значение, а не строка), что приводит к сбою всего сценария.

Вот фрагмент, чтобы показать проблему:

<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"/>

Как вы можете видеть, если вы генерируете таблицу только с столбцами (что предполагается / иногда должно происходить), мы получаем эту ошибку из консоли, потому что мы ' мы пытаемся получить "внутреннее HTML" из неопределенного:

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

Небольшое уточнение: когда эта ячейка = undefined, мне нужно, чтобы она оставалась undefined Я только хочу изменить тот факт, что мой var y также становится неопределенным. Поэтому я подумал, что изменение значения var y (а не значения этой ячейки, в противном случае 3-й столбец, который должен быть пустым, будет создан только из-за пробела) на пустое пространство, решит проблему, но я не понимаю, как это правильно (напишите это правильно).

Есть идеи?

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Как уже отмечали другие, вы уже используете jQuery, поэтому самый простой способ получить содержимое ячейки - использовать селектор css, чтобы найти ячейки с помощью функции $, а затем вызвать * 1002. * чтобы получить содержимое. Прямое преобразование вашего текущего кода в этот подход может быть следующим:

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()
1 голос
/ 25 апреля 2020

Попробуйте

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 пытается получить внутреннюю HTML третьей ячейки, которая не существует.

0 голосов
/ 25 апреля 2020

Итак, вот ответ, который работал для меня:

<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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...