Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Создание новых свойств для объектов (https://javascript.ru/forum/css-html-internet-explorer/10963-sozdanie-novykh-svojjstv-dlya-obektov.html)

tolikman 31.07.2010 01:48

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

Gvozd 31.07.2010 01:57

используй замыкания
Цитата:

Сообщение от tolikman
так понимаю, что IE отказывется создавать новые свойства для не DOM объектов...

IE вполне позволяет добавлять свойства для обычных объектов.
а в случае DOM-объектов, свойство тождественно атрибуту(только в IE), что создает немало проблем
в ланном же случае мы имеем дело с Active-X объектом, то есть из совсем другого мира.
поэтому ему наврено и нельзя добавлять свойства

tolikman 31.07.2010 12:51

получается, что в данном случае поможет только создание глобального многомерного массива, с перебором и поиском нужных элементов?:-/ Это не очень удобно... Надеюсь ActiveX объекты JS нормально сравнивает...

Gvozd 31.07.2010 13:03

Цитата:

Сообщение от tolikman
получается, что в данном случае поможет только создание глобального многомерного массива

читайте пожалуйста внимательнее мои сообщения:
Цитата:

Сообщение от Gvozd
используй замыкания

тогда вам не понадобится ни глобальные переменные, ни массивы

tolikman 31.07.2010 13:21

Как можно использовать замыкания? js не так углубленно знаю.

tolikman 31.07.2010 13:28

Все, понял, большое спасибо.

tolikman 31.07.2010 16:02

Вот так все заработало. Тпереь не присваиваю тегам новые свойства, все через замыкание.
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);};

Gvozd 31.07.2010 16:34

tolikman,
отлично
главное, что вы все-таки разобрались, и узнали для себя что-то новое
замыкания - достаточно полезный инструмент

tolikman 01.08.2010 16:17

Кстати можно было еще меньше массивов создавать, если передавать во внутренние функции больше объектов...
Спасибо еще раз...

Gvozd 01.08.2010 18:14

наверно. вам виднее.
я ваш код досконально не изучал на предмет улучшения

Gozar 01.08.2010 23:16

я кстати тоже не изучал, но ваш код tolikman, похож на логическую шизофрению, это не сарказм или усмешка, скорее удивление увиденным :blink:

tolikman 02.08.2010 12:56

Моя шизофрения выглядет сечас вот так:
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 02.08.2010 13:15

Цитата:

Сообщение от tolikman
может все это не хороший тон программирования в JS?

Не принимая во внимание тон программирования: вы сами, если на месяц этот код оставите и подзабудете про него, уже в нём разобраться не сможете.

JsLoveR 02.08.2010 13:31

А мне нравится такая структура кода)

Kolyaj 02.08.2010 13:32

Стильненько, ага.

JsLoveR 02.08.2010 13:33

Kolyaj, во-во))

tolikman 02.08.2010 13:54

Понятно... Если его придется изменять, то боюсь это будет нечто совсем другое.
У меня вылезла новая проблема:
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 еать текст!!! как быть?

рони 03.08.2010 17:20

inputs[1].getAttribute('value') вернёт тебе значение атрибута, или проще значение по умолчанию, а если атрибут отсутствует в <input name="accusername" style="width:100%;"> то null
если нужно узнать/установить текущее значение используй
inputs[1].value


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