Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onclick в IE не срабатывает по второму разу (https://javascript.ru/forum/events/20719-onclick-v-ie-ne-srabatyvaet-po-vtoromu-razu.html)

abstract 15.08.2011 11:02

onclick в IE не срабатывает по второму разу
 
Здравствуйте, уважаемые коллеги. Суть проблемы такова, в сафари, мозиле, хроме все работает как задумано, однако в IE9 функция onclick срабатывает только один раз. При повторном нажатии на ячейке таблицы ничего не происходит.
Исходники:
<table bordercolorlight="#FFFFFF"  width="1000" rules=all border="1" cellspacing="0" cellpadding="0">
        <caption>Сведения #1</caption>
        <tbody>
        <tr bgcolor="#b6dde8">
          <th style="width:0px" style="visibility:collapse"><input type="hidden" name="hidden header" value="id"/></th>
          <th style="width:350">Наименование</th>
          <th style="width:350">Фактический адрес</th>
          <th>ИНН/КПП</th>
          <th>Среднегодовая численность работников</th>
          <th>В т.ч. промышленно-производственный персонал</th>
          <th width="16">&nbsp;</th>
          <th width="16">&nbsp;</th>
        </tr>
        <tr>
          <td width="0" style="visibility:collapse"><input name="id" value="_inserted" type="hidden"></td>
          <td onclick="redact(this)"></td>
          <td onclick="redact(this)"></td>
          <td onclick="redact(this)"></td>
          <td onclick="redact(this)"></td>
          <td onclick="redact(this)"></td>
          <td width="16"><input style="width:auto" title="добавить" type="image" src="images/icons/16x16/add.png" onclick="return addline_table_2(this);" /></td>
          <td width="16"><input style="width:auto" title="удалить" type="image" src="images/icons/16x16/remove.png" onclick="return rmline_table_2(this);" /></td>
        </tr>
        </tbody>
	</table>

function redact(element)
{	
	while (element.tagName!='TD'){
		element=element.parentNode;
	}
	if((element.nodeType==1)&(element.tagName=='TD')){
		var cell=element;
		innertext=element.innerHTML;// ???????? ????????? ??????
	}
	var onclickattr =cell.attributes.getNamedItem('onclick');
	onclickattr.value='';
	
	cell.innerHTML='<textarea style="overflow: auto; width: 98%; " onblur=closeredact(this)>'+cell.innerHTML+'</textarea>';
	var textarea=cell.firstChild;
	textarea.focus();

}
function closeredact(element)
{
	while (element.tagName!='TD'){
		element=element.parentNode;
	}
	if((element.nodeType==1)&(element.tagName=='TD')){
		var cell=element;	
	}
	
	var onclickattr =cell.attributes.getNamedItem('onclick');
	onclickattr.value='redact(this)';
	cell.innerHTML=cell.children.item(0).value;
	
	//???? ???????? ????????? ?????? ? ??????
	var re=/_changed/;
	if(cell.innerHTML!=innertext){
		
		//alert('???????!'+' ????:'+innertext+' ?????:'+cell.innerHTML); ????????
		while (element.tagName!='TR'){
			element=element.parentNode;
		}
		if((element.nodeType==1)&(element.tagName=='TR')){
			var inputs=element.getElementsByTagName('input');
			for (var i=0;i<inputs.length;i++){	
				if((inputs.item(i).tagName=='INPUT')&(inputs.item(i).getAttribute('name')=='id')&
					(inputs.item(0).getAttribute('value')!='_inserted')&(!re.test(inputs.item(0).getAttribute('value')))){
					if(inputs.item(0).getAttribute('value')==""){
						inputs.item(0).setAttribute('value','_inserted');
					}else{
						var value=inputs.item(0).getAttribute('value');
						inputs.item(0).setAttribute('value',value+'_changed');
					}
				}
			}
		}
	}
}

abstract 23.08.2011 11:02

Проблема оказывается была в том, что в методе closeredact при присвоении cell.innerHTML=cell.children.item(0).value; firefox удаляет все вложенные в ячейку элементы, а explorer нет. Вот и события генерируются не в ячейке,а в дочерних элементах, а в них я естественно никаких перехватов не писал.
В общем чтобы заработало нужно переписать closeredact вот так:
function closeredact(element)
{
	var cell;
	while (element.tagName!='TD'){
		element=element.parentNode;
	}
	if((element.nodeType==1)&(element.tagName=='TD')){
		 cell=element;	
	}
	
	
	var textarea=cell.getElementsByTagName('TEXTAREA')[0];
	var val=textarea.value;
	cell.removeChild(textarea);//ВОТ ЗДЕСЬ ВСЯ СОЛЬ.
	var onclickattr =cell.attributes.getNamedItem('onclick');
	onclickattr.value='redact(this)';
	cell.innerHTML=val;
	
	var re=/_changed/;
	if(cell.innerHTML!=innertext){
		
		while (element.tagName!='TR'){
			element=element.parentNode;
		}
		if((element.nodeType==1)&(element.tagName=='TR')){
			var inputs=element.getElementsByTagName('input');
			for (var i=0;i<inputs.length;i++){	
				if((inputs.item(i).tagName=='INPUT')&(inputs.item(i).getAttribute('name')=='id')&
					(inputs.item(0).getAttribute('value')!='_inserted')&(!re.test(inputs.item(0).getAttribute('value')))){
					if(inputs.item(0).getAttribute('value')==""){
						inputs.item(0).setAttribute('value','_inserted');
					}else{
						var value=inputs.item(0).getAttribute('value');
						inputs.item(0).setAttribute('value',value+'_changed');
					}
				}
			}
		}
	}
}


Часовой пояс GMT +3, время: 02:46.