Динамические функции/методы

Кто-нибудь знает, почему "onmouseover" устанавливается только на последнем проходе этого цикла?

например, если я захожу в цикл "for (payment_id....." 3
раза - получаю 3 HtmlDom объекта типа "Link", каждый с прицепленным
к нему методом "onmouseover", так? Нет! :-) Только последняя (третья) ссылка
будет иметь работающий обработчик "onmouseover".

Такое впечатление что я создаю одну функцию вместо трёх. К сожалению, на этом
умные мысли заканчиваются :-). Что я уже только не пробовал! Уже 2 месяца с этим вожусь
без результата.
Например, пробовал не создавать 3 раза переменную типа Link с одним и тем же названием,
а делать массив Link'ов - результат от этого не меняется. В maillist писал 2 раза разными словами,
ответа не было вобще - то ли никто его не знает, то ли я так объяснил что меня никто не понял.

 for (payment_id in Reflect.fields(response.payments))
      {
        var shop_payments_area =
          js.Lib.document.getElementById("shop_"+shop_id+"_payments");
        shop_payments_area.innerHTML += '
          <tr>
            <td><a href="#open-an-account" class="link" id =
              "payment_'
+payment_id+'_data">просмотр</a></td>  
          </tr>
        '
;
        var payment_tech_data_link : js.Link =
          cast js.Lib.document.getElementById("payment_"+
            payment_id+"_data");
        payment_tech_data_link.onmouseover = function(e)
        {
          trace("asdf");
        }
      }

Решено

Пошёл по деревянному пути и когда даже самый деревянный не сработал - я случайно нашёл способ решить эту проблему.

hxml:

-main HaxeJs
-js haxejs.js
</div>
html:
<html>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Payment</title>
</head>
<body>
  <p><div id="haxe:trace"></div></p>
  <div id = "paysystems_list"></div>
  <script type="text/javascript" src="haxejs.js"></script>
</body>
</html>
</div>
Нерабочий hx:
import js.Dom;

class HaxeJs
{
  public static function main()
  {
    var paysystems_list = js.Lib.document.getElementById("paysystems_list");
    var paysystems : Array<String> = ["first", "second", "third"];
    var functs : Array<Dynamic> = new Array();
    var links : Array<js.Link> = new Array();
    for (paysystem in paysystems.iterator())
    {
      paysystems_list.innerHTML += "<p><a href='#"+paysystem+"' id='thelink_"+paysystem+"'>"+paysystem+"</a></p>";
      functs.push(
        function (e) { make_some_magic(paysystem); }
      );
      links.push(cast js.Lib.document.getElementById("thelink_"+paysystem));
    }
    for (i in 0...links.length)
    {
      //links[i].onclick = functs[i];
      untyped { links[i].addEventListener("click", functs[i], false); }
    }
  }
  public static function make_some_magic(paysystem : String) : Void
  {
    trace(paysystem);
  }
}
</div>
Рабочий hx:
import js.Dom;

class HaxeJs
{
  public static function main()
  {
    var paysystems_list = js.Lib.document.getElementById("paysystems_list");
    var paysystems : Array<String> = ["first", "second", "third"];
    var functs : Array<Dynamic> = new Array();
    var links : Array<js.Link> = new Array();
    for (paysystem in paysystems.iterator())
    {
      paysystems_list.innerHTML += "<p><a href='#"+paysystem+"' id='thelink_"+paysystem+"'>"+paysystem+"</a></p>";
      functs.push(
        function (e) { make_some_magic(paysystem); }
      );
    }
    for (paysystem in paysystems.iterator())
    {
      links.push(cast js.Lib.document.getElementById("thelink_"+paysystem));
    }
    for (i in 0...links.length)
    {
      //links[i].onclick = functs[i];
      untyped { links[i].addEventListener("click", functs[i], false); }
    }
  }
  public static function make_some_magic(paysystem : String) : Void
  {
    trace(paysystem);
  }
}
</div>
Обратите внимание где находится links.push: в первом случае он в том же цикле где сам объект добавляется при помощи innerHTML += в документ, во втором же он в отдельном цикле.
ВЫВОД: Их нельзя держать в одном цикле. Угадайте, как я люблю JS (материться нельзя, да?)
ВНИМАНИЕ: Абсолютно наплевать как добавить объект - или как я через innerHTML или как белый человек через addChild или что-то в этом роде. Также наплевать, использовать метод onclick или addEventListener. В любом случае второй hx работает, первый нет.

addEventListener?

не совсем уверен в своих знаниях в JS, но там не лучше применять addEventListener(...) вместо onmouseover? может в этом дело? просто предположение.

p.s. на будущее - для того чтобы подобный трабл можно было быстро попробовать решить - неплохо бы ссылку на небольшой тестовый проект с таким куском, чтобы быстро можно было открыть и потестировать, а не настраивать свой (это ж себя заставить еще надо, особенно если это js и ты им почти не занимаешься))

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].
  • Use [gist:####] where #### is your gist number to embed the gist.

Подробнее о форматировании

CAPTCHA
Для отсева спамеров)
a
N
c
S
D
g
Enter the code without spaces and pay attention to upper/lower case.