powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Объясните код
9 сообщений из 9, страница 1 из 1
Объясните код
    #34552996
mrJust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача:
прикрутить к элементу дополнительный обработчик события под ИЕ.
Обработчик представляет собой функцию с параметрами.

Под ИЕ для этих целей использую метод attachEvent.
Но, этот метод не позваляет запускать функцию с параметром, а это нужно.
т.е. я не могу сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<div id="testId">asdasasdasd</div>
<script ....>
function myFunc(elem)
{
  alert(elem.id);
}

var oElement = document.getElementById('testId');
oElement.attacheEvent('click', myFunc(oElement)); // error
//oElement.attacheEvent('click', myFunc(this)); // error 
</script>

После долгих плясок с бубном и гуглением, решение было получено:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
oElement.attachEvent 	('click',
	(	
		function(bb)
		{	
			return function(){myFunc.call(bb);}
		}
	)(oElement)
			);

function myFunc(elem)
{
	alert(elem.id)
}
не ужасаться, со скобками все в порядке!

Вот, но как это работает догнать не могу :(
Прокомментируйте пожалуйста вот эту часть (как можно подробнее):
Код: plaintext
1.
2.
3.
4.
5.
(	
	function(bb)
	{	
		return function(){myFunc.call(bb);}
	}
)(oElement)
Заранее благодарен.
...
Рейтинг: 0 / 0
Объясните код
    #34552997
mrJust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mrJustoElement.attacheEvent('click', myFunc(oElement)); // error
т.е. так конечно же:
Код: plaintext
oElement.attachEvent('click', myFunc(oElement)); // error
но это ничего не меняет...
...
Рейтинг: 0 / 0
Объясните код
    #34553015
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrJust
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
oElement.attachEvent 	('click',
	(	
		function(bb)
		{	
			return function(){myFunc.call(bb);}
		}
	)(oElement)
			);

function myFunc(elem)
{
	alert(elem.id)
}
не ужасаться, со скобками все в порядке!

Если писать oElement.attachEvent('click', myFunc(oElement))
функция выполнится и вернёт например null (oElement.attachEvent('click', null)))
А в данном случае выполниться
Код: plaintext
1.
2.
function(bb)	{	
	return function(){myFunc.call(bb);}
}
с параметром oElement и вернёт другую функцию, которая и будет выполняться onload

Как я помню, первый параметр call - контекст и теперь myFunc должна выглядеть так
Код: plaintext
1.
2.
3.
function myFunc()
{
	alert(this.id)
}
...
Рейтинг: 0 / 0
Объясните код
    #34553016
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опере кстати достаточно
oElement.attachEvent ('click',function(){myFunc.call(bb);});
...
Рейтинг: 0 / 0
Объясните код
    #34553156
mrJust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за оперативность!
LINUXERЕсли писать oElement.attachEvent('click', myFunc(oElement))
функция выполнится и вернёт например null (oElement.attachEvent('click', null)))
какая функция выполнится? myFunc()?

Что значит вот это:
Код: plaintext
1.
(...	)(oElement)
Значит ли это, что в левые скобки будет передан oElement, т.е. код в левых скобках будет выполняться с контекстом oElement?

насчет function(bb):
bb в данном случае - объект oElement?
почему нельзя написать так:
Код: plaintext
1.
2.
3.
4.
function(bb)
{	
	myFunc.call(bb);
}
, а надо обязательно так:
Код: plaintext
1.
2.
3.
4.
function(bb)
{	
	return function(){myFunc.call(bb);}
}
?
...
Рейтинг: 0 / 0
Объясните код
    #34553334
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrJustСпасибо за оперативность!
LINUXERЕсли писать oElement.attachEvent('click', myFunc(oElement))
функция выполнится и вернёт например null (oElement.attachEvent('click', null)))
какая функция выполнится? myFunc()?

ну да
myFunc - имя функции, со скобками: myFunc() она вызывается
mrJust
Что значит вот это:
Код: plaintext
1.
(...	)(oElement)
Значит ли это, что в левые скобки будет передан oElement, т.е. код в левых скобках будет выполняться с контекстом oElement?

"(... )" - функция, она вызывается с 1 параметром oElement

mrJust
Код: plaintext
1.
2.
3.
function(bb)
{	
	myFunc.call(bb);
}
, а надо обязательно так:
Код: plaintext
1.
2.
3.
function(bb)
{	
	return function(){myFunc.call(bb);}
}

в первом варианте функция выполнится а в attachEvent опять уйдёт null или undefined
А должна уйти функция.
Вообще это танцы с бубном. Выше показал вариант для Оперы - там более понятно
-----------------------------------------------------------------------------------------------------------------------------------------------------
Почитайте про замыкания(closures)
функции в JS - это объекты
Код: plaintext
1.
2.
3.
4.
var a="ad";// - объект - строка
a=function(param){alert(param);return "returned"};// - объект функция 
/*у функций есть методы, например call
А кроме того их можно вызывать и они возвращают значения*/
var b=a("param");//теперь вызвался alert, а в переменную b присвоилось "returned"
...
Рейтинг: 0 / 0
Объясните код
    #34553558
mrJust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, кажется понял. Еще пару раз прокручу - пойму окончательно.

LINUXERoElement.attachEvent ('click',function(){myFunc.call(bb);});
Я думал attachEvent только для ИЕ подходит...
Вообще для Opera и ff использую addEventListener.
Спасибо еще раз :)
...
Рейтинг: 0 / 0
Объясните код
    #34553646
Хрюхрюшкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrJust
Я думал attachEvent только для ИЕ подходит...
Вообще для Opera и ff использую addEventListener.
Спасибо еще раз :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
function addEvent (el, evname, func) {
  if (el.attachEvent) { // IE
    el.attachEvent("on" + evname, func);
  } else if (el.addEventListener) { // Gecko / W3C
    el.addEventListener(evname, func, true);
  } else {
    el["on" + evname] = func;
  }
};
...
Рейтинг: 0 / 0
Объясните код
    #34553682
mrJust
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, да у меня подобная функция!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
function addXEvent(oEmt, sEvent, act)
{
	if (oEmt.addEventListener)
		oEmt.addEventListener (sEvent, act, false);
	else 
		if (oEmt.attachEvent) 
			oEmt.attachEvent ('on'+sEvent, act)
		else 
			oEmt['on'+sEvent] = act;
}
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Объясните код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]