Создание новых свойств для объектов
Вот есть код:
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, время: 04:00. |