Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возможно ли создать событие? 
:(
    Опции темы
Ghirik
Дата 8.9.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Просвятите, пожалуйста.

Есть ли в JavaScript или DOM возможность назначить своё событие. Ну, типа, как создаются динамические объекты, так же назначить событие для объекта. Например, чтобы по совпадению условий происходило событие.

Это сообщение отредактировал(а) Ghirik - 8.9.2007, 13:09


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dXdYdZ
Дата 8.9.2007, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 16.4.2007

Репутация: 3
Всего: 4



Код

var evt = new Array();

JSL.addEvent=function(tag,name,obj,f,params)
{
po = {t: tag, n: name, o: obj, f: f, params: params};
evt.push(po);
var s="evt["+(evt.length-1)+"].f1=function(e){ evt["+(evt.length-1)+"].f.call(evt["+(evt.length-1)+"].o,e,evt["+(evt.length-1)+"].params) }";
if(obj != null) eval(s); else evt[evt.length-1].f1=f;
//alert(name+": "+(evt.length-1));
if(tag.addEventListener) { tag.addEventListener(name, evt[evt.length-1].f1, false); }
else { tag.attachEvent('on'+name, evt[evt.length-1].f1); }
}

JSL.removeEvent=function(tag,name,obj)
{
var n;
for(n=0;n<evt.length;n++)
  if((evt[n].t==tag)&&(evt[n].n==name))
    {
    //alert(name);
    if(obj) if(obj!=evt[n].o) continue;
    //alert(name);
    if(tag.removeEventListener) { tag.removeEventListener(name, evt[n].f1, false); }
      else { tag.detachEvent('on'+name, evt[n].f1); }
    evt.splice(n,1);
    }
delete n;
}

PM MAIL   Вверх
Ghirik
Дата 8.9.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



dXdYdZ, я видел этот код в вашей библиотеке, но честно скажу, я не могу в нем разобраться. Очень вас прошу, покажите на простом примере. К примеру, чтобы событие рождалось при изменении любого из свойств объекта.

Это сообщение отредактировал(а) Ghirik - 8.9.2007, 19:40


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dXdYdZ
Дата 8.9.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 16.4.2007

Репутация: 3
Всего: 4



В JavaScript присутствуют стандартные виды событий. Прочитать о них можно,
например, здесь. Для динамического (с помощью JavaScript) подключениия обработчиков событий с помощью представленных выше функций
  • tag-Узел DOM, к которому подключаем событие.
  • name-Имя события. Например для события onmouseover name=mouseover.
  • f-функция, которая будет вызвана при возникновении события. Должна иметь 2 параметра. Первый - объект "event" (Прочитаете о нём в приведённой выше ссылке). 
    Второй - объект, в который передаются параметры из объекта params функции JSL.addEvent. Это нужно для того, чтобы при возникновении события передать функции какие-либо константы.
  • obj-объект, в контексте которого будет вызвана функция f (то есть если object!==null, то this в функции f будет равен obj).
  • params-константы, которые будут переданы в функцию f во втором параметре.

Пример использования:
Есть узел, к нему надо прицепись событие обработки наведения мыши

Код

<div id="1"></div>


Код

fe=function(evt,params)
{
alert(params.a);
}

JSL.addEvent(document.getElementById("1"),"mouseover",null,fe,{a: 10});

Отключить событие можно так:
Код

JSL.removeEvent(document.getElementById("1"),"mouseover",null);



PM MAIL   Вверх
Ghirik
Дата 8.9.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Большое спасибо, пример стал понятен, но...
Мне нужно создать своё событие например у фона страницы изменился цвет, это есть событие. И мне нужно при изменении цвета фона на красный(к примеру), выполнить функцию. Вы предлогаете подключить имеющиеся в HTML, DOM, или ещё где, события. В IE есть для таких случаев событие propertychange, но Mozilla его не поддерживает. Я и подумал, а нельзя ли самому описать условия возникновения своего события.
Mozilla поддерживает какие нибудь события, возникающие при изменении атрибутов, свойств или стилей?

Это сообщение отредактировал(а) Ghirik - 8.9.2007, 22:16


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dsCode
Дата 9.9.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Ghirik, Вам нужно среагировать на изменение фона. Реакция в данном случае - есть обработчик Вашего события onBackgroundChange (имя придумайте сами). Реакция так же - всего лишь функция, вызванная в нужное время - в Вашем случае - когда меняется фон (в том месте, где Вы меняете фон, - вызывайте обработчик данного события).


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Ghirik
Дата 9.9.2007, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Ммм, да...
Действительно, плохо формулирую вопросы.... 
Но, похоже, ответ на вопрос "можно ли создать своё событие" получил - нельзя. У Вас наверное даже в голове не укладывается, как такое можно спрашивать. smile  smile 
Это я от плохого представления всей иерерхии Объекты-Методы-События. Уж извините, что мозги запудрил.




--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dsCode
Дата 9.9.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Ghirik, это смотря с какой стороны смотреть. Я Вам сказал, что можно создать абсолютно любое СВОЕ событие, но все зависит от контекста. Если говорить о стандартных объектах (таких как в Вашем примере - бэкграунд и т.п.) - то точно не скажу, скорей всего, придется ограничиться стандартными событиями, доступными в конкретной версии JS и браузера (событиями, об атаче и ремуве которых говорит
dXdYdZ). Но! Если Вы пишите свой фреймворк со своими тегами, то СВОЕ событие (а точнее сказать - возникновение своего события) - это ничто иное, как вызов определенного "метода"/функции в нужное время. Однако, Ваши события будут в любом случае порождены от стандартных событий. В сущности, СВОИ события - это даже не совсем события, лучше сказать псевдособытия - просто так удобней.

Где-то вы описываете "метод"/функцию onSelectRow(...) (тут придумайте все, что угодно - onChangeProperty, onLoadData и т.д.). Далее, пример с таблицей ("класс таблицы"): в СТАНДАРТНОМ событии onClick для ряда таблицы, Вы вызываете свой метод onSelectRow с нужными параметрами. Нужные параметры - это в данном случае "параметры из объекта таблицы". Таким образом - единожды описав в "классе" для работы с таблицей событие onClick (и то, что оно вызовет "событие", onSelectRow), далее в каждом из объектов этого "класса" Вы можете использовать событие onSelectRow(нужный_параметр_касающийся_конкретного_объекта_"класса").


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Ghirik
Дата 9.9.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



dsCode, спасибо, а если зациклить(запустить сразу сотню таймаутов) setTimeout, как я делал в этой функции:
Код

function on(i){
    if    (i.style.opacity){
    var    c=i.style.opacity*100}
    else{
    var    c=i.filters.alpha.opacity}
    for    (c;c<=100;c++){
        setTimeout('op('+c+','+i.id+')',2*c)}}

Идентификаторы я могу сложить в массив, но как потом отследить, что закончился определенный таймаут? Вот здесь бы очень пригодилось поддерживаемое браузером событие "onOpacity".
В IE наверное можно применить имеющийся обработчик события propertychange, а в других....
Конечно, можно не запускать не контролируемые задания, но мне очень нравится такой подход, задал задание и забыл.... Произошло событие, обработал.


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
dsCode
Дата 9.9.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26



Ghirik, не совсем понял, зачем идентификаторы в массив (ну надо, так надо). А по поводу "закончился определенный тайм-аут": вообще, JavaScript не мультипоточный (в полном понимании этого слово) язык. Он имеет всего 2 (два) потока - основной и поток setTimeout'a (и setInterval'a). На основе этого можно создать псевдо-мультипоточность. То, что Вы запускаете 100 сетТаймаутов вероятно должно означать, что функции во втором потоке выстроятся в зависимости от назначенного времени. В Вашем случае можно поступить как я и говорил выше - поймать Ваше onOpacity в нужном месте (Вы же сами правильно сказали в первом посте "чтобы по совпадению условий происходило событие" - это, опять же, ничто иное, как вызов в нужное время нужной функции):

Код

<span id="test"></span>

    <script type="text/javascript">

      function on() {
        var i = 1;
        var c = 2;
        setTimeout('op('+c+','+i+')', 10000);
        c++; i++;
        setTimeout('op('+c+','+i+')', 1000);
        c++; i++;
        setTimeout('op('+c+','+i+')', 5000);
        c++; i++;
        setTimeout('op('+c+','+i+')', 1000);
      }

      function op(c, id) {
        onOpacity(c, id);
      }

      function onOpacity(c, id) {
        document.getElementById("test").innerHTML += c + " ::: " + id + "<br />";
      }
      on();
    </script>  


Каждый тайм-аут сработает в нужное время и вызовет Ваше "событие" onOpacity, в котором уже Вы вольны делать все, что захотите.
Я специально сделал 4 тайм-аута, начиная с большего времени и, сделав два тайм-аута с одинаковым временем. Посмотрите - тайм-ауты с 1000 миллисекунд сработают раньше всех но последовательно (выстроенные в очередь во втором потоке). Тайм-ауты с бОльшим временем сработают в свое время - и с нужными значениями. 

Это сообщение отредактировал(а) dsCode - 9.9.2007, 15:57


--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Ghirik
Дата 9.9.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 919
Регистрация: 26.3.2007

Репутация: 13
Всего: 20



Всё понял!!! Большое спасибо за потраченное на разъяснение время. Недавно занимаюсь JavaScript-ом, в голове всё перепутано....  smile  smile 


--------------------
Отдадим всё клиенту, пускай его машина мучается...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0849 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.