Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2010, 01:48
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

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

Последний раз редактировалось tolikman, 31.07.2010 в 01:50.
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2010, 01:57
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

используй замыкания
Сообщение от tolikman
так понимаю, что IE отказывется создавать новые свойства для не DOM объектов...
IE вполне позволяет добавлять свойства для обычных объектов.
а в случае DOM-объектов, свойство тождественно атрибуту(только в IE), что создает немало проблем
в ланном же случае мы имеем дело с Active-X объектом, то есть из совсем другого мира.
поэтому ему наврено и нельзя добавлять свойства
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2010, 12:51
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

получается, что в данном случае поможет только создание глобального многомерного массива, с перебором и поиском нужных элементов? Это не очень удобно... Надеюсь ActiveX объекты JS нормально сравнивает...
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2010, 13:03
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от tolikman
получается, что в данном случае поможет только создание глобального многомерного массива
читайте пожалуйста внимательнее мои сообщения:
Сообщение от Gvozd
используй замыкания
тогда вам не понадобится ни глобальные переменные, ни массивы
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2010, 13:21
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

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

Последний раз редактировалось tolikman, 31.07.2010 в 13:23. Причина: поздно увидел предидущий пост
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2010, 13:28
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

Все, понял, большое спасибо.
Ответить с цитированием
  #7 (permalink)  
Старый 31.07.2010, 16:02
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

Вот так все заработало. Тпереь не присваиваю тегам новые свойства, все через замыкание.
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);};
Ответить с цитированием
  #8 (permalink)  
Старый 31.07.2010, 16:34
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

tolikman,
отлично
главное, что вы все-таки разобрались, и узнали для себя что-то новое
замыкания - достаточно полезный инструмент
Ответить с цитированием
  #9 (permalink)  
Старый 01.08.2010, 16:17
Интересующийся
Отправить личное сообщение для tolikman Посмотреть профиль Найти все сообщения от tolikman
 
Регистрация: 31.07.2010
Сообщений: 10

Кстати можно было еще меньше массивов создавать, если передавать во внутренние функции больше объектов...
Спасибо еще раз...
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2010, 18:14
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание скрипта! Создание диктанта для учеников! Елизавета Работа 10 30.06.2010 21:00
Создание собственных свойств элемента cooli0 Events/DOM/Window 1 03.03.2010 15:35
Вопрос по получению свойств из динамических объектов mexoboy Общие вопросы Javascript 2 26.01.2010 21:45
Создание свойств окна Dicot Opera, Safari и др. 8 28.04.2009 15:18