Создание новых свойств для объектов
Вот есть код:
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,
отлично главное, что вы все-таки разобрались, и узнали для себя что-то новое замыкания - достаточно полезный инструмент |
Кстати можно было еще меньше массивов создавать, если передавать во внутренние функции больше объектов...
Спасибо еще раз... |
наверно. вам виднее.
я ваш код досконально не изучал на предмет улучшения |
я кстати тоже не изучал, но ваш код tolikman, похож на логическую шизофрению, это не сарказм или усмешка, скорее удивление увиденным :blink:
|
Моя шизофрения выглядет сечас вот так:
prevAdmin=null; 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){ jshref=links[k].getAttribute('href')+'&ajaxreq'; links[k].onclick=function(pobj,thref){ return function(){ var req=getXmlHttp(); if(prevAdmin){ with(prevAdmin){ innerHTML=''; style.display='none'; } } req.onreadystatechange=function(){ if(req.readyState==4){ pobj.innerHTML=req.responseText; var btns=pobj.getElementsByTagName('button'); for(j=0;j<btns.length;j++){ if(btns[j].getAttribute('name')=='btncancel'){ var pnobj=btns[j].parentNode; while(pnobj.tagName!='FORM'){pnobj=pnobj.parentNode;} pnobj.parentNode.removeChild(pnobj); continue; } if(btns[j].getAttribute('name')=='btncopy'){ btns[j].onclick=function(tbtn,count){ return function(){ var tbut=document.createElement(tbtn.previousSibling.tagName); with(tbtn.previousSibling){ tbut.setAttribute('name',getAttribute('name')); tbut.setAttribute('type',getAttribute('type')); setAttribute('name',getAttribute('name')+(count++)); } tbtn.parentNode.insertBefore(tbut,tbtn); } }(btns[j],0) continue; } if(btns[j].getAttribute('type')=='submit'){ var tbut=document.createElement('button'); tbut.setAttribute('type','button'); tbut.innerHTML='Отмена'; tbut.onclick=function(){ pobj.innerHTML=''; pobj.style.display='none'; } btns[j].parentNode.insertBefore(tbut,btns[j]); j++; continue; } } } } req.open('GET',thref,true); req.send(null); prevAdmin=pobj; with(pobj){ innerHTML='<p style="font-weight:bold;"><img src="img/anim/ajaxloader.gif" width="16" height="16" style="margin:0 5px 0 0;">Подождите, идет загрузка...</p>'; style.display='block'; } return false; } }(objs[i].nextSibling,jshref) } } } } } window.onload=function(){SetEvents(document.body);}; Работает хорошо, браузеры пока не жалуются, код опирается на то, что php правильно выдает изначальное содержание, а в итоге полученного мне хватает, и скриптов больше мне не надо пока... А кстати, почему Вы удивились, мне очень интересно... Вас удивило много уровней вложенности функций, или много структур, или то что я не разделил внешние функции для простоты - может все это не хороший тон программирования в JS? Зато, к примеру, переменную pobj видно во всех вложенных функциях, это мне понравилось, ведь меньше приходится явно передавать данных при каждом вызове любой вложенной функции. Может сказывается то, что я люблую программировать на VB или C++ (но VB я знаю намного лучше), да и JS я мало пользую. |
Цитата:
|
А мне нравится такая структура кода)
|
Стильненько, ага.
|
Kolyaj, во-во))
|
Понятно... Если его придется изменять, то боюсь это будет нечто совсем другое.
У меня вылезла новая проблема: function SetEvents(obj){ divs=document.body.getElementsByTagName('div'); for(var i=0; i<divs.length;i++){ if(divs[i].tagName=='DIV'){ if(divs[i].getAttribute('class')=='links'){ ahrefs=divs[i].getElementsByTagName('a'); ahrefs[ahrefs.length-1].onclick=showauth; } } } } function showauth(){ uauth=document.createElement('div'); uauth.setAttribute('class','ajaxauth'); document.body.insertBefore(uauth,document.body.firstChild); uauth.innerHTML='<div class="contnet"><p>Авторизация пользователя:</p><form action="http://ugrasochi.ru/index.php?ajaxreq" method="post"><input type="hidden" name="authorization" value="1"><table><tr><td align="right" width="35%">Имя пользователя:</td><td width="30%"><input name="accusername" style="width:100%;"></td></tr><tr><td align="right">Пароль:</td><td><input name="accuserpass" style="width:100%;" type="password"></td></tr><tr><td colspan="2"><input type="checkbox" name="accuserrem" id="rememberuser" style="margin:0 5px;"><label for="rememberuser">Запомнить на две недели</label></td></tr><tr><td><button type="button" style="width:100%;display:block;">Отмена</button></td><td><button type="button" style="width:100%;display:block;">Авторизироваться</button></td></tr></table></form></div>'; uauth.getElementsByTagName('button')[0].onclick=function(){uauth.parentNode.removeChild(uauth);} uauth.getElementsByTagName('button')[1].onclick=function(){ var req=getXmlHttp(); if(uauth.firstChild.lastChild.tagName=='P'){uauth.firstChild.removeChild(uauth.firstChild.lastChild);} req.onreadystatechange=function(){ if(req.readyState==4){ alert('<'+req.responseText+'>'); if(req.responseText!='ERROR'){ var msg=document.createElement('p'); msg.innerHTML='Авторизация прошла успешно, происходит обновление страницы.'; msg.style.color='#2DB253'; uauth.firstChild.appendChild(msg); setTimeout(function(){window.location.reload();},1000); }else{ var msg=document.createElement('p'); msg.innerHTML='Ошибка авторизации, возможно вы ввели неправильные лигин и/ил пароль.'; msg.style.color='#e44'; uauth.firstChild.appendChild(msg); var inputs=uauth.getElementsByTagName('input'); inputs[1].setAttribute('value',''); inputs[2].setAttribute('value',''); } } } var inputs=uauth.getElementsByTagName('input'); var params='authorization=1&accusername='+encodeURIComponent(inputs[1].getAttribute('value'))+'&accuserpass='+encodeURIComponent(inputs[2].getAttribute('value'))+'&accuserrem='+encodeURIComponent(inputs[3].getAttribute('value')); alert(inputs[1].getAttribute('value')); req.open('POST','http://*/index.php?ajaxreq',true); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); req.send(params); } return false; } в FF alert(inputs[1].getAttribute('value')); (стр.59) возвращает NULL(но tagName==input и проч.), даже если в input еать текст!!! как быть? |
inputs[1].getAttribute('value') вернёт тебе значение атрибута, или проще значение по умолчанию, а если атрибут отсутствует в <input name="accusername" style="width:100%;"> то null
если нужно узнать/установить текущее значение используй inputs[1].value |
Часовой пояс GMT +3, время: 12:32. |