Записки о Flash

E4X Trick

Вам никогда не требовалось, скажем, пронумеровать все узлы вашего XML определенным атрибутом? Использовать циклы и прочие громоздкие конструкции с рекурсией совершенно неинтересно.

Попробуем средствами E4X. Например, есть у нас вот такой XML и итератор:

This content requires Adobe Flash Player.

Пробуем присвоить все атрибуты:

This content requires Adobe Flash Player.

Получаем ошибку «TypeError: Error #1089: Assignment to lists with more than one item is not supported.». Значит мы не можем присвоить атрибут более чем одному элементу. Пойдем с другой стороны:

This content requires Adobe Flash Player.

Получаем ошибку «TypeError: Error #1010: A term is undefined and has no properties.». Получается, что пока атрибут не будет существовать, мы не сможем присвоить значение.

Хорошо, переделаем XML:

This content requires Adobe Flash Player.

Получаем то, что и требовалось:

This content requires Adobe Flash Player.

Определенно, нас такой подход не устраивает. Что ж, небольшой трюк:

This content requires Adobe Flash Player.

Проблема решена :)


11 comments

11 Comments so far

  1. ALFer January 23rd, 2008 13:07

    Хитёр ::)))

  2. Constantiner January 23rd, 2008 13:48

    Прошу прощения, но все же такая раскраска кода не рулит и вот почему: в RSS, через которые многие читают блоги, вместо кода я вижу лишь следующее:

    This content requires Adobe Flash Player

    То есть в принципе с тем же успехом можно убрать RSS из блога :)

  3. __etc January 23rd, 2008 13:57

    Пытался прикрутить highlight.js, но не получилось.
    Попробую сковырнуть RSS и переделать вывод.

    UPD: Переделал :)

  4. Constantiner January 23rd, 2008 14:43

    Да. Так лучше :)

  5. Рост January 23rd, 2008 15:19

    Улетненько!

  6. etc January 23rd, 2008 16:24

    E4X или feed? :D

  7. Андрей Горбатов January 25th, 2008 00:48

    И то и другое:)

  8. wvxvw September 15th, 2009 20:34

    Типа некропост, я раньше этой записи не видел… :)
    var xml:XML =

    ;

    xml.*.(valueOf().@whatever = Math.random());
    trace(xml.toXMLString());
    А я вообще искал твой пост про компиляцию флешевых векторных объектов силами AS3…

  9. etc September 15th, 2009 20:41

    Клева, я, оказывается, такой пост писал :)

  10. TanaTiX June 8th, 2010 01:02

    А как вместо ++index получить значение из функции, где параетром будет значение, полученное на основе родителя текущего узла?
    В данном примере что должно быть вместо VALUE?
    xml..*.((parent().children()[childIndex()].@index = getAttribute(VALUE)));
    Сам запутался

  11. etc June 8th, 2010 05:23

    (parent().children()[childIndex()] можно поменять на valueOf(), как писал выше Олег. А в аттрибут надо сувать parent().

Leave a reply