Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can someone clarify Raphael's documentation? (or know a place in which someone already has done it)

I´m working with Raphael, and I think that I´m using it in a way that does not take advantage of some features that seems to be useful.

For example, I´m trying to add a listener on a Set (a group of elements), in a way that on mouse over on any of those elements, the script triggers an animation on the whole set.

When you add a listener to a set, Raphael adds the listener to each of the elements and animates them separately.

Like you see in this example http://jsfiddle.net/4VYHe/3/ in wich I want that all the rectangles in the same set (set = horizontal groups of 10 rectangles), change the color attribute on mouse over on any of them.

I have found a few methods in the raphael documentation that i think must help to achive this. But I´m having a hard time understanding how these methods work.

For example:

  • the eve object(http://raphaeljs.com/reference.html#eve)
  • the Element.animateWith() method (http://raphaeljs.com/reference.html#Element.animateWith)
  • the Raphael.animation() method (http://raphaeljs.com/reference.html#Raphael.animation)

The Raphael Library seems to be really powerful and I really want to get it work properly, I don´t want to write all kinds of diferent javascript hacks, because I think that these tools have to get the work done in a more elegant way.

If you think that I´m using the wrong library I´m still open to all kinds of advices. Thank you in advance.

---EDIT---

This is a working example (http://jsfiddle.net/4VYHe/6/). But this is a hack with lack of efficiency and elegancy. I want something that uses the correct tools on the correct way.

There is some information on this page. http://www.irunmywebsite.com/raphael/additionalhelp.php?v=2#PAGETOP . A couple of examples, but nothing that explain how things work in Raphael.

like image 527
limoragni Avatar asked Nov 16 '11 17:11

limoragni


People also ask

How did Raphael impact the world today?

Why is Raphael so important? Raphael was one of the most talented painters of the Italian Renaissance. His work is admired for its clarity of form and ease of composition and for its visual achievement of the Neoplatonic ideal of human grandeur. He was also a popular architect during his lifetime.

Where did Raphael learn paint?

Raphael, born Raffaello Sanzio, was crowned the "Prince of Painters" by Giorgio Vasari, a sixteenth-century biographer of artists. From his father, Raphael learned painting; in his native Urbino, he experienced intellectual court life.

What did Raphael accomplish?

In 1508, while Michelangelo was painting the ceiling of the Sistine Chapel, Raphael started work on redecorating Pope Julius II's apartments at the Vatican. This was his most important commission to date and established him as the pre-eminent painter in the Court of the Medici.


2 Answers

Take a look at this fiddle, I think it is doing what you are looking for. The fundamental difference is that you want to call animate on the set, rather than this. It appears that when you add a handler to a set, this refers to the individual elements in the set (which are iterated over to assign the handler), and not the set itself.

Note that I pulled the handler functions out into the getHoverHandler function:

function getHoverHandler(fillColor) {
     var cSet = set;

     return function(){
          cSet.animate({fill: fillColor}, 300);
      };
}

set.hover(getHoverHandler('#000'),
          getHoverHandler('#FFF'));

in order to break the closure. If you try to do it like this:

set.hover(function(){
            set.animate({fill: '#000'}, 300)
        }, function(){
            set.animate({fill: '#FFF'}, 300)
        });

as you loop through, set will keep changing, and the closures will maintain awareness of this. As a result, all handlers will be acting on the last row of boxes.

If you don't understand javascript closures, you might want to look at this article. It is old, but in pretty simple language, and it helped me as I have tried to get my head around them.

like image 114
Mike C Avatar answered Sep 29 '22 08:09

Mike C


Kreek is absolutely correct in this comment above. Sets are a workaround for the inconsistencies between SVG and VML.

In your example above, you're running into the same issue that you were facing in your previous question. Using this in an anonymous function will almost always not work in the way you expect, as this won't be referring to what you think it is. Have a look at this discussion, particularly the first two comments in the comments section. (As an aside, the commenter uses "self" as the reference to "this", which is much better than my "that", which goes to show there's always someone doing it better than yourself)

Anyway, with that in mind, I've cloned your fiddle, wrapped your set in an object, and put the events into the object constructor. By doing this, the event can then refer to that.set and animate all objects in the set at the same time.

It's a small but fundamental concept that will aid you throughout any Raphael (or javascript) development you do.

This doesn't answer your question directly, but hopefully clarifies some of the issues you seem to be discovering. I can't really comment on the animation calls you've mentioned, but I do think that Raphael as a library is definitely worth persevering with.

N.

like image 27
amadan Avatar answered Sep 29 '22 08:09

amadan