Создание новых свойств для объектов
Вот есть код:
function getXmlHttp(){ var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; } function SetEvents(obj){ var objs=obj.getElementsByTagName('p'); for(var i=0;i<objs.length;i++){ if(objs[i].getAttribute('class')=='admin'){ var links=objs[i].getElementsByTagName('a'); for(var k=0;k<links.length;k++){ if(!links[k].nojs){ links[k].jshref=links[k].getAttribute('href')+'&ajaxreq'; links[k].setAttribute('href','javascript:void(0);'); links[k].onclick=function(){ var req=getXmlHttp(); req.aobj=this; req.onreadystatechange=function(){ if(this.readyState==4){ this.aobj.parentNode.nextSibling.innerHTML=this.responseText; var btns=this.aobj.parentNode.nextSibling.getElementsByTagName('button'); for(var j=0;j<btns.length;j++){ if(btns[j].getAttribute('name')=='btncancel'){ var pobj=btns[j].parentNode; while(pobj.getAttribute('class')!='admin'){pobj=pobj.parentNode;} btns[j].genParentNode=pobj; btns[j].onclick=function(){ this.genParentNode.innerHTML=''; this.genParentNode.style.display='none'; } } } } } req.open('GET',this.jshref,true); req.send(null); with(this.parentNode.nextSibling){ innerHTML='<p style="font-weight:bold;">Подождите, идет загрузка...</p>'; style.display='block'; } } } } } } } window.onload=function(){SetEvents(document.body);}; Работает в FF и в OPERA, но в IE ругается на req.aobj=this; (стр. 28), так понимаю, что IE отказывется создавать новые свойства для не DOM объектов... Как мне быть, я пока вижу только создание двух глобальных массивов: в один сохранять req'и а во второй их елементы, которые им необходимы. Но может есть более разумный способ? |
используй замыкания
Цитата:
а в случае DOM-объектов, свойство тождественно атрибуту(только в IE), что создает немало проблем в ланном же случае мы имеем дело с Active-X объектом, то есть из совсем другого мира. поэтому ему наврено и нельзя добавлять свойства |
получается, что в данном случае поможет только создание глобального многомерного массива, с перебором и поиском нужных элементов?:-/ Это не очень удобно... Надеюсь ActiveX объекты JS нормально сравнивает...
|
Цитата:
Цитата:
|
Как можно использовать замыкания? js не так углубленно знаю.
|
Все, понял, большое спасибо.
|
Вот так все заработало. Тпереь не присваиваю тегам новые свойства, все через замыкание.
Gvozd, извини за невнимательность, действительно проглядел. function getXmlHttp(){ var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; } function SetEvents(obj){ var objs=obj.getElementsByTagName('p'); for(var i=0;i<objs.length;i++){ if(objs[i].getAttribute('class')=='admin'){ var links=objs[i].getElementsByTagName('a'); var jshref=new Array(); for(var k=0;k<links.length;k++){ if(!links[k].nojs){ jshref[k]=links[k].getAttribute('href')+'&ajaxreq'; links[k].setAttribute('href','javascript:void(0);'); links[k].onclick=function(tk){ return function(){ var req=getXmlHttp(); var aobj=links[tk]; req.onreadystatechange=function(){ if(req.readyState==4){ aobj.parentNode.nextSibling.innerHTML=req.responseText; var btns=aobj.parentNode.nextSibling.getElementsByTagName('button'); var genParentNode=new Array(); for(j=0;j<btns.length;j++){ if(btns[j].getAttribute('name')=='btncancel'){ var pobj=btns[j].parentNode; while(pobj.getAttribute('class')!='admin'){pobj=pobj.parentNode;} genParentNode[j]=pobj; btns[j].onclick=function(tj){ return function(){ genParentNode[tj].innerHTML=''; genParentNode[tj].style.display='none'; } }(j) } } } } req.open('GET',jshref[tk],true); req.send(null); with(links[tk].parentNode.nextSibling){ innerHTML='<p style="font-weight:bold;">Подождите, идет загрузка...</p>'; style.display='block'; } } }(k) } } } } } window.onload=function(){SetEvents(document.body);}; |
tolikman,
отлично главное, что вы все-таки разобрались, и узнали для себя что-то новое замыкания - достаточно полезный инструмент |
Кстати можно было еще меньше массивов создавать, если передавать во внутренние функции больше объектов...
Спасибо еще раз... |
наверно. вам виднее.
я ваш код досконально не изучал на предмет улучшения |
Часовой пояс GMT +3, время: 08:04. |