views:

55

answers:

2

Hi, the following code mostly works (thanks to a good answer a couple of days ago!) all except for the last little bit:

things.square[1].node.setAttribute("id","clicker");
$("#clicker").click(function(){
    $("#canvas_things1").fadeOut();
    $("#canvas_things2").fadeIn();
});

I think the problem is this line:

things.square[1].node.setAttribute("id","clicker");

I would have thought that square[1].node would work, but it seems not. Can someone spot what's wrong? Thank you very much!

<script type="text/javascript" charset="utf-8">
    $("document").ready(function() {
        var RM  = Raphael("canvas", 1000, 500);

        var attr = {     // for the visible shapes
            fill: "#bbb",      "fill-opacity": 1,
            stroke: "#222",    "stroke-width": 0.3,
        };
        var attr2 = {    // for the invisible hovering areas
            fill: "green",     "fill-opacity": 0.0,
            stroke: "red",     "stroke-width": 0,
        };
        var things = {};
        /* Square */    things.square     = [ RM.path("m 154.21525,71.431259 74.32805,0 0,70.496711 -74.32805,0 0,-70.496711 z").attr(attr),
                                              RM.path("m 271.25132,77.933263 58.07304,0 0,56.409037 -58.07304,0 0,-56.409037 z").attr(attr2)   ];
        /* Triangle */  things.triangle   = [ RM.path("m 154.02932,222.44063 36.78089,-58.23641 34.48208,58.2364 -71.26297,1e-5").attr(attr),
                                              RM.path("m 271.25132,165.71032 58.07304,0 0,56.40903 -58.07304,0 0,-56.40903 z").attr(attr2)   ];
        for (var shape in things) {
            shape[0].color = Raphael.getColor();
            (function (shape, sh) {
                shape[1][0].onmouseover = function () {
                    shape[0].animate({fill:shape[0].color, stroke:"#ccc"}, 500);
                    document.getElementById(sh)[0].style.display = "block";
                    shape[0].toFront();   R.safari();
                };
                shape[1][0].onmouseout = function () {
                    shape[0].animate({fill:"#bbb", stroke:"#222"}, 500);
                    document.getElementById(sh)[0].style.display = "none";
                    shape[0].toFront();   R.safari();
                };
            })(things[sh], sh);
        } // end for every member of things

        things.square[1].node.setAttribute("id","clicker");
        $("#clicker").click(function(){
            $("#canvas_things1").fadeOut();
            $("#canvas_things2").fadeIn();
        });

    }); // end the document ready function
</script>
A: 

I think it's because things.square doesn't map to a single element in your SVG when you have multiple paths. There's two approaches that should work:

  1. Loop through each of the path elements in things.square and apply the click function to each of them (won't be able to use the id attribute then).
  2. Use a group add-on to put all your paths inside a <g> element in the SVG, then apply your function to that instead.
robertc
`things.square[1].node` is a single DOM element. That part of the code actually works. The `for` loop doesn't work.
Peter Ajtai
+1  A: 

The id attribute is set properly.

Try it out with this jQuery (click on the 1st red square)

Notice, that I had to rip out your for loop. This is because the self executing anonymous function was causing a runtime error due to being called with undefined variables.

sh is never defined, but it is used here:

        })(things[sh], sh);                               // sh is never defined!
    } // end for every member of things

I would have replaced the for loop but I don't understand what you're trying to do.

At any rate, I would suggest using the Raphael custom event handler .hover().


PS: Watch your unnecessary comas (you have 4):

    stroke: "#222",    "stroke-width": 0.3,                 // <== Trailing comma
};
Peter Ajtai