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"> </th> <th width="16"> </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'); } } } } } } |
Проблема оказывается была в том, что в методе 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, время: 08:18. |