在Raphael / JavaScript中选择一个节点

时间:2010-09-27 21:31:03

标签: javascript dom raphael

下面的代码大部分都有用(感谢几天前的一个很好的答案!)除了最后一点之外:

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

我认为问题在于这一行:

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

我原以为square [1] .node会起作用,但似乎没有。有人能发现什么是错的吗?

<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>

2 个答案:

答案 0 :(得分:1)

id属性设置正确。

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

注意,我必须撕掉你的for循环。这是因为自执行匿名函数由于使用未定义的变量调用而导致运行时错误。

sh永远不会定义,但在此使用:

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

我会替换for循环,但我不明白你想要做什么。

无论如何,我建议使用Raphael自定义事件处理程序.hover()


PS:注意你不必要的昏迷(你有4个):

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

答案 1 :(得分:0)

我认为这是因为当您有多条路径时,things.square不会映射到SVG中的单个元素。有两种方法可行:

  1. 遍历things.square中的每个路径元素并将click函数应用于每个路径元素(然后将无法使用id属性)。
  2. 使用group add-on将所有路径放入SVG中的<g>元素内,然后将您的功能应用于此。