Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Добавить функцию в обработчик onclick (https://javascript.ru/forum/events/2795-dobavit-funkciyu-v-obrabotchik-onclick.html)

slayer_tmb 12.02.2009 00:00

Добавить функцию в обработчик onclick
 
Подскажите кто сможет
Надо добавить к onclick функцию. Важно именно добавить к уже существующей.
Мои эксперименты остановились на следующем коде

originalhandler=menunodes[i].getAttribute('onclick');
if(typeof(originalhandler)=='function')
	{
		originalhandler.call();//срабатывает
		menunodes[i].onclick=function()	{	originalhandler.call(); MenuClick(this); };
		originalhandler.call();//срабатывает
	}
	else
	menunodes[i].onclick=function()	{	MenuClick(this); };


при клике говорит что не знает originalhandler ...

IIIEPJIOK 12.02.2009 12:15

Цитата:

Мои эксперименты остановились на следующем коде
Поэкспериментируйте с этим :)
<html>
	<script>
		function setOnClick(){
			document.getElementById('1').onclick = function(){onClickBtnOne.call()}			
		}
		function onClickBtnOne(){
			alert('handler one');
		}
		function reformer(){
			var f = document.getElementById('1').onclick;
			document.getElementById('1').onclick = function(){onClickBtnTwo.call(); f.call()}
		}
		function onClickBtnTwo(){
			alert('handler two');
		}		
	</script>
  <body id="body" onload="setOnClick(); reformer();">
	<input type="button" id="1">
  </body>
</html>



ЗЫ
getAttribute возвращает строку

Kolyaj 12.02.2009 14:05

А об addEventListener/attachEvent ничего не слышали?
Цитата:

Сообщение от IIIEPJIOK
onClickBtnOne.call()

call тут зачем?

Цитата:

Сообщение от IIIEPJIOK
getAttribute возвращает строку

А вы в ИЕ для аттрибутов событий попробуйте :)

slayer_tmb 12.02.2009 15:13

ЗЫ
getAttribute возвращает строку

IE возвращает функцию
а call я вызывал для проверки что возвращенная функция реально работает
и она работает
насчет атача не знал спасибо за совет почитаю

slayer_tmb 12.02.2009 15:21

Цитата:

Сообщение от IIIEPJIOK (Сообщение 12509)
Поэкспериментируйте с этим :)

Спасибо усё работает.
Только я не пойму почему у меня не работает
я делаю
originalhandler=menunodes[i].getAttribute('onclick');
(и он 100% возвращает функцию)
ты делаешь
var f = document.getElementById('1').onclick;

далее
я делаю
menunodes[i].onclick=function() { originalhandler.call(); MenuClick(this); };
ты:
document.getElementById('1').onclick = function(){onClickBtnTwo.call(); f.call()}

но у тебя на f.call не ругается а у меня на originalhandler.call(); ругается


гы
document.getElementById('1').addEventListener("cli ck", function() {onClickBtnTwo();}, false);
повесила IE

IIIEPJIOK 12.02.2009 15:51

Цитата:

call тут зачем?
привычка, не более :)
Данный пример, я рассматриваю, как частный от:
Element.onEvent = function(){refObject.method.call(refObject, param1, ..., paramN)}

Андрей Параничев 12.02.2009 16:04

slayer_tmb,
На все ваши вопросы ответят две статьи:
http://javascript.ru/tutorial/basic/...ispol-zovaniia
http://javascript.ru/start/events/intro

IIIEPJIOK 12.02.2009 16:08

Цитата:

А вы в ИЕ для аттрибутов событий попробуйте
попробовал.....
имею сказать две вещи
1. я х@ею дорога я редакция :)
2. ИЕ возвращает возвращает не саму функцию обработчик, а некую, созданную автоматически, в которой вызывается функция обработчик....и проблему "почему не работает" надо искать в этом направлении.

Kolyaj 12.02.2009 16:10

Цитата:

Сообщение от slayer_tmb
но у тебя на f.call не ругается а у меня на originalhandler.call(); ругается

Потому что getAttribute возвращает строку везде, кроме ИЕ для событий.

Андрей Параничев 12.02.2009 16:29

Просто не устанавливайте обработчики через setAttribute и не получайте их, через getAttribute. В случае этих функций работа не гарантируется, а по спецификации значением атрибута может быть только примитивное значение.

slayer_tmb 12.02.2009 17:07

Да наверное в этом и был прикол. Я тока начал с DOM-ом разбираться и за неделю читая о понятиях микрософта в этом направлении тоже ушел в ах...й. А getAttribute у меня на самом деле временный был. Сперва присваивал без него. потом решил попробывать. смотрю функцию возвращает. вот и решил что нет разницы. просто этот конкретный момент я таки тока в ие и потестил.

.... блиииин ниче не понимаю уже
сравните плиз два кода оба кода находятся внутри функции вызываемой онлоадом


//этот не работает при нажатии говорит не известный объект f[..] или Null
var f = new Array(menunum);
for(i=0;i<menunum;i++)
{
f[i]=menunodes[i].onclick;
if(typeof(f[i])=='function')
menunodes[i].onclick=function() { MenuClick(this);f[i].call() }
else
menunodes[i].onclick=function() { MenuClick(this); }
}


//а этот работает
var f = menunodes[1].onclick;
for(i=0;i<menunum;i++)
{
...
menunodes[i].onclick=function() { MenuClick(this); };
}
if(typeof(f)=='function')
menunodes[1].onclick=function() { MenuClick(this);f.call() }

slayer_tmb 15.02.2009 11:06

Цитата:

Сообщение от Андрей Параничев (Сообщение 12524)
slayer_tmb,
На все ваши вопросы ответят две статьи:
http://javascript.ru/tutorial/basic/...ispol-zovaniia
http://javascript.ru/start/events/intro

То что надо
добавив статью про замыкания
почитал, разобрался, сделал... спасибо большое
Супер сайт

рабочий вариант получился такой
for(i=0;i<menunum;i++)
{
.....
if(typeof(menunodes[i].onclick)=='function')
{
var f=menunodes[i].onclick;
menunodes[i].onclick=function(x) {
return function() { MenuClick(this); x.call(); } }(f);
}
else
menunodes[i].onclick=function() { MenuClick(this); };

}
Мне показалось это намного убобнее атачивента и аддивентлистнера. во первых кроссбраузерность во вторых порядок выполнения функцию легко задать.
Правда вот об убивании функций не думал но в моей задаче они не нужны

ilromka 02.10.2014 11:43

Добавить функцию в обработчик onclick
 
Допустим есть функция myFunction.
А теперь добавляем в нее новый функционал:

var myOldFunction = myFunction;
function myFunction()
{
...добавляем сюда новый функционал...
myOldFunction();
...или сюда...
}

danik.js 02.10.2014 19:23

Я чета не пойму - это топик мазохистов? Чем addEventListener/attachEvent им не угодил?


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