Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] переменные для events

Ответить
Настройки темы
[решено] переменные для events

Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


как передать функции javascript, которая цепляется на событие, переменные???
да еще, чтоб работало и под IE и под FF???
например мне надо на некий созданный мною объект повесить onmouseover
я делаю так:
Код: Выделить весь код
document.getElementById('element_id').onmouseower = function(e) {
//здесь e для того, чтоб в FF работало

  ...
  statement
  ...

  return false;
};
а что делать, если мне event в принципе не нужен, но нужно нечто другое???
я попробовал так:
Код: Выделить весь код
document.getElementById('element_id').onmouseower = function(v) {
  alert(v); // здесь v = myvar и, по сути я создаю функцию alert(myvar);
  ...
  statement
  ...

  return false;
}(myvar);
однако эта функция выполняется почему-то при создании функции, т.е. я ее пишу, что надо делать на mouseover, а она выполняется сразу
и на onmouseover ничего не происходит

что делать???

Отправлено: 13:14, 15-09-2006

 

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


При обработке события в функцию-обработчик передается объект события, во втором примере Вашего кода он будет под переменной v. Т.е. Ваше предположение v=myvar неверно. А выполняется функция потому, что идет по сути ее вызов ввиду соблюдения синтаксиса "funcName(params)". То, что JS позволяет вам использовать определение тела функции и тут же ее вызов это его особенность, вот Вы ею и пользуйтесь. Правда это Вам вовсе не нужно, верно? Тогда помогут внешние переменные относительно контекста функции обработчика (частный случай - глобальные). Еще, на любителя, вариант - это обертка какой-то конечной функциональности в некий класс и назначение обработчиками методы этого класса, тогда приватные свойства класса могут решать поставленную Вами задачу - быть видимыми обработчику и невидимыми извне.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 10:11, 16-09-2006 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


немного не въехал в написанное... это что же мне надо вызывать функцию примерно так??? (с глобальными переменными):
Код: Выделить весь код
<tagname onmouseover="javascript:a='myval';domymouseover();">
а как присваивать такой обработчик посредством javascript`a???
Код: Выделить весь код
myobj.onmouseover = 'a=\'myval\';domymouseover();'
или туда eval надо делать??? а с eval`ом оно не выполнится???
использование классов мне также ничего не даст... ну создам я класс с нужными мне переменными... и что??? туда ведь тоже надо значения передавать где-то...

зы
использовать конструкцию в описанном примере я подсмотрел в набле куроводства
там она работает - сам проверял

Отправлено: 17:45, 18-09-2006 | #3


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


В какой именно набле? Можно ссылку?

1) Да, используйте глобальные переменные.
2) Код
Код: Выделить весь код
myobj.onmouseover = 'a=\'myval\';domymouseover();'
эквивалентен
Код: Выделить весь код
myobj.onmouseover = 'domymouseover();'
если в domymouseover будет выражение a='myval', за исключением области видимости переменной а. По сути этот код выполняет присваивание a='myval' каждый раз когда происходит событие и затем выполняет вызов функции domymouseover, т.о. если переменная нужна только для работы функции, то зачем засорять простраство глобальных переменных - выполняйте присваивание внутри domymouseover.
3) Присваивать обработчики событий можно (имхо, лучше) с помощью следующей функции (взятой там же, где и наблы):
Код: Выделить весь код
function addEvent(elt, name, handler, atEnd) {
  name = name.replace(/^(on)?/, 'on');
  var prev = elt[name];
  var tmp = '__tmp';
  elt[name] = function(e) {
    if (!e) e = window.event;
    var result;
    if (!atEnd) {
      elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null; // delete() does not work in IE 5.0 (???!!!)
      if (result === false) return result;
    }
    if (prev) {
      elt[tmp] = prev; result = elt[tmp](e); elt[tmp] = null;
    }
    if (atEnd && result !== false) {
      elt[tmp] = handler; result = elt[tmp](e); elt[tmp] = null;
    }
    return result;
  }
  return handler;
}
Использовать ее можно следующим образом:
Код: Выделить весь код
addEvent(fields.login, 'onkeydown', function(e) {
          var keyStatus = th.keyFilter(e, loginFilter);
          if (keyStatus == ST_NOT_KEY) return false;
          if (keyStatus == ST_SYSTEM_KEY) return true;
          document.getElementById(loginImgId).src = imgDir+loginImgFocusedSrc;
          th.prevT = new Date();
          th.onchangeControl(this, delay);
          return true;
        })
Т.е. код {...} будет выполняться каждый раз при событии keydown. Как видите в анонимной функции (замыкании по терминологии 39ой наблы) используются и внешние переменные (imgDir, loginImgFocusedSrc), в этом нет ничего страшного.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:08, 19-09-2006 | #4


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


все решилось гораздо проще, правда, как-то некрасиво:
Код: Выделить весь код
eval('document.getElementById(\'element_id\').onmouseower = function(e) {'+
  'alert(\''+myvar+'\');'+ // здесь myvar из переменной становится константой для ЭТОЙ функции!!!
  
  ...
  statement
  ...

  'return false;'+
'};');
Цитата 39-я набла Куроводства:
Оказывается, можно обойтись и без создания функции createFunc(), однако это потребует от нас написания двух замыканий на каждом обороте цикла:

Код: Выделить весь код
function create(n) {
  var arr = [];
  for (var i=1; i<n; i++) {
    // Создаем функцию...
    arr[i] = function(x) { 
      // создание замыкания с лексической x
    return function() { alert(x*x) } 
  }(i); // и тут же ее вызываем с параметром i!
  }
  return arr;
}
Это работает по той же самой причине, что и код выше — за счет копирования i во вновь создаваемую при каждом вызове переменную x.

Отправлено: 11:40, 19-09-2006 | #5


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Цитата:
// здесь myvar из переменной становится константой для ЭТОЙ функции!!!
Верно, становится. Но именно поэтому теряется смысл нагромождения eval. Вы определяете обработчик, определить его можно однажды (потом - лишь переопределить) и целиком. Поэтому ваша переменная, ставшая константой ничем не отличается от внешней переменной, видимой из обработчика - глобальной. Если предполагать, что myvar внешняя относительно контекста обработчика, то отпадает надобность в eval, который, Вы верно выразились, добавляет "некрасивость" решению.
Так ведь проще:
Код: Выделить весь код
var myvar = 'myvar_value';
document.getElementById('element_id').onmouseover = function(e) {
  alert(myvar);
  return;
};

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 14:23, 19-09-2006 | #6


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


может быть это я некорректно поставил задачу...
но этих myvar - множество
что-то вроде:
Код: Выделить весь код
for (i = 0; i < myvar.length; i++) {
  if (document.getElementById('element_' + i))
    eval('document.getElementById(\'element_' + i + '\').onmouseower = function(e) {'+
      'alert(\''+myvar[i]+'\');'+ // здесь myvar из переменной становится константой для ЭТОЙ функции!!!
  
      ...
      statement
      ...

      'return false;'+
    '};');
}
и мне нужно именно переменную, которая есть сейчас, передать в функцию, которая будет вызываться потом.


тут другая проблема возникает:
когда я создаю объект и прописываю ему event (не важно какой), то всё ок
если же я создаю этот объект внутри другого объекта, то event не отвечает...

в какую сторону копать???

Отправлено: 17:02, 19-09-2006 | #7


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


1)
Код: Выделить весь код
function createHandler(myvar_i) {
  return function(e) { alert('myvar_i=\''+myvar_i+'\' and e.type='+e.type); };
}

var myvar = ['the 0', 'the 1', 'the 2', 'the 3'];

for (i = 0; i < myvar.length; i++)  
  addEvent(document.getElementById('link'+i), 'onmouseover', createHandler(myvar[i]));
Похоже на решение? Функция addEvent приведена выше.
2) Приведите проблемный код, я не догоняю, видимо конец рабочего дня сказывается.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 19:12, 19-09-2006 | #8


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


решение оказалось неожиданно простым!!!
использование функции addEvent поначалу оказалось безрезультатным.
надо было лишь отказаться от innerHTML!!! в пользу elt.appendChild(document.createTextNode(text))
всё замечательно, только вот как теперь сделать так, чтобы текст с имеющимися тэгами был именно в виде HTML, т.е. без преобразования html символов в их сущности???

Отправлено: 10:12, 20-09-2006 | #9


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


VeshchiyOleg, я буду пытаться помочь Вам, если Вы будете вводить меня в курс проблемы, мой навык телепатии на зачаточном уровне. А то Вы прыгаете на одних понятных Вам вещах, а вопросы задаете мне... в частности.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 12:30, 20-09-2006 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] переменные для events

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Переменные для Windows 7 x64 и x86 Bodia1 Автоматическая установка приложений 2 07-02-2018 20:18
[решено] Глобальные переменные (?) Frost_Imp AutoIt 8 29-07-2009 15:12
[решено] Пропадают переменные из форм Bask76 Вебмастеру 5 26-07-2008 22:02
[решено] глобальные переменные в php bruder Вебмастеру 17 19-04-2008 21:45
Delphi - Переменные в типах в DelphiX для Delphi 7 Poma Программирование и базы данных 5 23-06-2004 16:52




 
Переход