Вход на сайт
Обработчики событий (javascript)
111
NEW 13.07.06 12:26
Ну мне, как обычно, потребовалось сделать ЧТО-ТО...
.Net web-сомпонент.
Норамльно берет данные из базы и бросает что положено на выход.
Это самое "что положено" - набор чекбоксов, раскываемый при клике на комбобоксе место стандартного списка.
Для того, чтобы работало, после загрузки странцы скрипт перелопачивает код и заменяет OnClick обработчик у чекбоксов.
Моя проблема - потребовалось получить IndexChanged-событие на сервере. Разумеется, оно привязывается к OnClick чекбокса... и потом успешно заменяется скриптом.
Пытаюсь создать другой обработчик:
код отрабатывает, но onOldClick остается пустым.
Есть какой вариант, чтобы осхранить старый обработчик и затем его вызвать?
P.S. Скрипт файловый, подменять его в динамике не хочется, но тоже можно...
.Net web-сомпонент.
Норамльно берет данные из базы и бросает что положено на выход.
Это самое "что положено" - набор чекбоксов, раскываемый при клике на комбобоксе место стандартного списка.
Для того, чтобы работало, после загрузки странцы скрипт перелопачивает код и заменяет OnClick обработчик у чекбоксов.
Моя проблема - потребовалось получить IndexChanged-событие на сервере. Разумеется, оно привязывается к OnClick чекбокса... и потом успешно заменяется скриптом.

В ответ на:
VAR myOldClick = 'function aa() {....}';
if (e.addEventListener){
alert ('Event listener');
//e.addEventListener( 'oldClick', myOldClick, false);
} else if (e.attachEvent){
alert('Event handler');
var r = e.attachEvent('onOldClick', myOldClick); // назначилось
alert('After event attached: ' + e.onOldClick); // и пусто
} else {
alert('Event not attached');
}
VAR myOldClick = 'function aa() {....}';
if (e.addEventListener){
alert ('Event listener');
//e.addEventListener( 'oldClick', myOldClick, false);
} else if (e.attachEvent){
alert('Event handler');
var r = e.attachEvent('onOldClick', myOldClick); // назначилось
alert('After event attached: ' + e.onOldClick); // и пусто
} else {
alert('Event not attached');
}
код отрабатывает, но onOldClick остается пустым.
Есть какой вариант, чтобы осхранить старый обработчик и затем его вызвать?
P.S. Скрипт файловый, подменять его в динамике не хочется, но тоже можно...
NEW 14.07.06 13:09
в ответ Murr 13.07.06 12:26
1. Да, разумеется. Код не вываливается по ошибе из-за case - просто не устанавливается значение OnOldClick.
2. C OnClick - проблем нет. Проблема есть с созданием нового эвента OnOldClick - именно он остается пустым.
3. Это в заголовке - получаю документ с прописанным OnClick, после чего OnClick переназначается. Мне же нужно, чтобы после выполнения переназначенного обработчика был выполнен еще и старый.
Частное решение, не слишком удобное и мало вписывающееся в стандартную модель, уже нашел, но хочется иметь что-то более простое и стандартное...
2. C OnClick - проблем нет. Проблема есть с созданием нового эвента OnOldClick - именно он остается пустым.
3. Это в заголовке - получаю документ с прописанным OnClick, после чего OnClick переназначается. Мне же нужно, чтобы после выполнения переназначенного обработчика был выполнен еще и старый.
Частное решение, не слишком удобное и мало вписывающееся в стандартную модель, уже нашел, но хочется иметь что-то более простое и стандартное...
NEW 14.07.06 13:27
в ответ Murr 13.07.06 12:26
Ты бы хоть синтакс в FM'е посмотрел...
Во-первых - everything is case-sensitive.
В-вторых- нафига тебе эти addEventListener и attachEvent? Традиционная модель работает везде..
В-третьих:
http://scorpix.strana.germany.ru/test.html
Во-первых - everything is case-sensitive.
В-вторых- нафига тебе эти addEventListener и attachEvent? Традиционная модель работает везде..
В-третьих:
В ответ на:
var old_onclick_handler = null;
function set_old_handler()
{
document.getElementById( 't' ).onclick = old_onclick_handler;
}
function set_new_handler()
{
var e = document.getElementById( 't' );
old_onclick_handler = e.onclick;
e.onclick = new Function( 'aa', "alert( 'new handler' )" );
}
http://scorpix.strana.germany.ru/test.html
NEW 14.07.06 13:43
в ответ scorpi_ 14.07.06 13:27
Если бы это было так просто.
На форме несколько групп checbox'ов и каждому checkbox'у приписан свой onclick-обработчик. Извращаться с массивом переменных нет никакого желания - контрол, генерирующий checkbox'ы дорабатывается достаточно регулярно и может выбрасывать совершенно другой код. Так что вариант только один - получить текущий обработчик и сохранить его же как дополнительную инфу прямо в checkbox'сах. Именно это и не работает - назначаемая строка, а там именно строка - без new function, просто пропадает неизвестно куда...
Думаю, что со времен IE4.0 дядюшка билли так и не дошел до необходимости пользовательского расширения набора евентов...
На форме несколько групп checbox'ов и каждому checkbox'у приписан свой onclick-обработчик. Извращаться с массивом переменных нет никакого желания - контрол, генерирующий checkbox'ы дорабатывается достаточно регулярно и может выбрасывать совершенно другой код. Так что вариант только один - получить текущий обработчик и сохранить его же как дополнительную инфу прямо в checkbox'сах. Именно это и не работает - назначаемая строка, а там именно строка - без new function, просто пропадает неизвестно куда...

Думаю, что со времен IE4.0 дядюшка билли так и не дошел до необходимости пользовательского расширения набора евентов...

NEW 14.07.06 13:49
Не понимаю я твоих проблем... Ну так тогда
http://scorpix.strana.germany.ru/test.html
В ответ на:
function set_new_handler()
{
var e = document.getElementById( 't' );
e.old_onclick_handler = e.onclick;
e.onclick = new Function( 'bb', "alert( 'new handler' );this.old_onclick_handler()" );
}
http://scorpix.strana.germany.ru/test.html
NEW 14.07.06 15:20
-----
Можно, конечно, попробовать и так. Тем более, что близко к этому и сделано - добавлен нестандартный атрибут в который прописывается ключ для композиции и выполнения метода. Но хотелось бы иметь возможность создать в динамике OnOldClick, назначить ему код и... выполнять его - посылкой евента - как в стандартной модели.
P.S. Цитированный код я пробовал, правда через setAttribute, не работало.
в ответ scorpi_ 14.07.06 13:49
В ответ на:
e.old_onclick_handler = e.onclick;
e.old_onclick_handler = e.onclick;
-----
Можно, конечно, попробовать и так. Тем более, что близко к этому и сделано - добавлен нестандартный атрибут в который прописывается ключ для композиции и выполнения метода. Но хотелось бы иметь возможность создать в динамике OnOldClick, назначить ему код и... выполнять его - посылкой евента - как в стандартной модели.

P.S. Цитированный код я пробовал, правда через setAttribute, не работало.

14.07.06 15:25
в ответ Murr 14.07.06 15:20
добавлен нестандартный атрибут в который прописывается ключ для композиции и выполнения метода
Код приведи, а то не вполне понятно в чём отличие
Но хотелось бы иметь возможность создать в динамике OnOldClick
А у меня что?
выполнять его - посылкой евента - как в стандартной модели
не понял...
Код приведи, а то не вполне понятно в чём отличие
Но хотелось бы иметь возможность создать в динамике OnOldClick
А у меня что?
выполнять его - посылкой евента - как в стандартной модели
не понял...
NEW 14.07.06 15:44
в ответ scorpi_ 14.07.06 15:25
В том, что создается не на клиенте, а на сервере.
код: { input myfield="" }
У меня просто не получилось добавить атрибут в динамике. Почему - не знаю, некогда смотреть детали.
У тебя, насколько я понимаю, создается именно дополнительный аттрибут. Без диспатчирования ему евентов.
код: { input myfield="" }
У меня просто не получилось добавить атрибут в динамике. Почему - не знаю, некогда смотреть детали.
У тебя, насколько я понимаю, создается именно дополнительный аттрибут. Без диспатчирования ему евентов.
NEW 14.07.06 15:52
в ответ Murr 14.07.06 15:44
В том, что создается не на клиенте, а на сервере.
Код должен исполняться на сервере, или что? Или код создаётся на сервере? Тогда в чём проблема?
У меня просто не получилось добавить атрибут в динамике. Почему - не знаю, некогда смотреть детали.
Написал что-нибудь неправильно. Почему я и говорю, приведи нормальный код, а не одну строчку.
У тебя, насколько я понимаю, создается именно дополнительный аттрибут. Без диспатчирования ему евентов.
Ничто не понял... Я вызываю старый обработчик в новом, если ты не заметил. Или тебя отсуствие аргумента смущает? Ну так добавь.
Код должен исполняться на сервере, или что? Или код создаётся на сервере? Тогда в чём проблема?
У меня просто не получилось добавить атрибут в динамике. Почему - не знаю, некогда смотреть детали.
Написал что-нибудь неправильно. Почему я и говорю, приведи нормальный код, а не одну строчку.
У тебя, насколько я понимаю, создается именно дополнительный аттрибут. Без диспатчирования ему евентов.
Ничто не понял... Я вызываю старый обработчик в новом, если ты не заметил. Или тебя отсуствие аргумента смущает? Ну так добавь.
NEW 14.07.06 16:47
в ответ scorpi_ 14.07.06 15:52
Код должен исполняться на клиенте. Сервер формирует уникальные onclick обработчики.
Может написал не правильно, но скорее всего что-то намудрено в полиси. Там много чего менялось по сравнению со стандартной установкой.
Ты складываешь старый и новый. При этом новый предполагаешь известным. У меня оба неизвестны, вполне может быть быть, что новый оканчивается return'ом. А парсить это дело, тем более - на клиенте, мне не хочется...
Может написал не правильно, но скорее всего что-то намудрено в полиси. Там много чего менялось по сравнению со стандартной установкой.
Ты складываешь старый и новый. При этом новый предполагаешь известным. У меня оба неизвестны, вполне может быть быть, что новый оканчивается return'ом. А парсить это дело, тем более - на клиенте, мне не хочется...

NEW 14.07.06 17:15
в ответ Murr 14.07.06 16:47
Ну хорошо, в какой момент времени создаётся твой уникальнейший onclick?
Какая нафиг разница, return там или нет?
Ну получил ты в ответ на какое-либо событие кусок кода в виде строки, ну и пишешь:
http://scorpix.strana.germany.ru/test.html
Какая нафиг разница, return там или нет?
Ну получил ты в ответ на какое-либо событие кусок кода в виде строки, ну и пишешь:
В ответ на:
// get somehow from server
var code = "new Function( 'event', \"alert( 'new handler for: ' + event.type )\" )";
function set_new_handler()
{
var e = document.getElementById( 't' );
e.old_onclick_handler = e.onclick;
e.new_onclick_handler = eval( code );
e.onclick = function (event) {
if ( ! event )
event = window.event();
var result = this.new_onclick_handler( event );
this.old_onclick_handler( event );
return result;
}
}
http://scorpix.strana.germany.ru/test.html