Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在一组路径上应用Raphael中的悬停事件_Javascript_Svg_Raphael - Fatal编程技术网

Javascript 在一组路径上应用Raphael中的悬停事件

Javascript 在一组路径上应用Raphael中的悬停事件,javascript,svg,raphael,Javascript,Svg,Raphael,当我在拉斐尔集合上放置悬停事件时,效果会应用于每个不同的路径。因此,当我通过路径时,它会改变单个路径的填充,而不是同时改变整个集合的填充 例如,在这张地图上,当你用鼠标穿过加拿大时,大陆的颜色会改变,但所有的冰岛都保持相同的颜色 这是我的密码 drawSets: function(){ for (country in this.setsArr){ var setset= R.set(); var zone = this.setsArr[country];

当我在拉斐尔集合上放置悬停事件时,效果会应用于每个不同的路径。因此,当我通过路径时,它会改变单个路径的填充,而不是同时改变整个集合的填充

例如,在这张地图上,当你用鼠标穿过加拿大时,大陆的颜色会改变,但所有的冰岛都保持相同的颜色

这是我的密码

drawSets: function(){
    for (country in this.setsArr){
        var setset= R.set();
        var zone = this.setsArr[country];
        for (group in zone){
            var path = R.path(this.setsArr[country][group].path);

            setset.push(
                path
            );
        }

        var attri = this.options.attributes;
        setset.attr(attri);
        var x = this.setsArr[country].translate.x;
        var y = this.setsArr[country].translate.y;
        setset.translate(x,y);

        setset.hover(function(){
            this.animate({
                fill: '#000'
            }, 300);
        }, function(){
        this.animate({
            fill: attributes.fill
        }, 300);
    });

    }   
},
我用的是拉斐尔的动画制作方法

有没有办法解决这个问题

这是另一个包含这个问题的问题


这是一个由来已久的问题,您用来突出显示的事件并不是指您认为它是的对象。具体地说,这是一个参考

现在是午夜,我累了,把你的密码弄乱了。这就是我所做的

创建一个对象以包装路径集,并设置mouseover事件以引用对象集。这里的神奇之处在于,通过使用对对象变量的引用,事件将被锁定到对象变量上,并且一切正常

所以。目标在这里。我把它放在mapclasses.js的顶部

function setObj(country,myset)
{
    var that = this;
    that.country = country;
    that.myset = R.set();

    that.setupMouseover = function()
    {
        that.myset.mouseover(function(event){
            myvar = that;   
            // in the mouseover, we're referring to a object member that.myset
            // the value is locked into the anonymous object
            that.myset.attr({"fill":"#ffaa00"});
        });
    }

    that.addPath = function(newpath)
    {
       that.myset.push(newpath); 
    }

    return that;
}
然后在函数drawset中(第80行)

注意:我只为加拿大做过这件事。而且,我只使用了鼠标盖。应用关联的mouseout对您来说应该很简单。此外,每个国家/地区都需要一个对象,您可能需要存储该对象

对不起,这不清楚。正如我所说,已经很晚了。如果您愿意,我可以将修改后的js文件发送给您,或者将其粘贴到dropbox上,但这可能与StackOverflow的精神背道而驰

如果你在这方面有任何问题,尽管问,我会尽力帮助你


祝你好运。

你能把你的代码放到一把小提琴里(jsfiddle.net)让我们直接看到问题吗?好的,jsfiddle.net看起来不错,但我这里有整个应用程序(当然,正在开发中)。这是我在stackoverflow中的第三个问题,我仍然对答案的质量感到惊讶,以及人们如何花时间去帮助和教导。。。非常感谢,明天我将分析代码并开始使用它,如果我需要帮助,我会告诉你。没问题。你的地图很好。你在哪里找到的路径?我在这里找到了地图(),我想用它做一个教育游戏。我正在从事一个在教育中引入互动的项目,我计划将其提交给我国(阿根廷)的教育部。还有很多工作要做。我不能让你的剧本完全发挥作用。然而,我写了一些有用的东西。你的代码帮助我意识到问题出在哪里。不过,我还是在寻找更优雅的东西。使用拉斐尔所有功能的东西。我在这里发布了另一个问题
drawSets: function(){
    for (country in this.setsArr){
        var setset= R.set();
                    var holderObj = null;
                    //
                    // Create an object to hold all my paths
                    //
                    if (country == 'canada')
                    {
                       holderObj = setObj (country, setset);
                    }
        var zone = this.setsArr[country];
        for (group in zone){
            var path = R.path(this.setsArr[country][group].path);

            setset.push(path);
                            if (country == 'canada')
                            {
                               // add the path to the holder obj
                               holderObj.addPath(path);
                            }
        }

                    if (country == 'canada')
                    {
                       // once all paths for the object are loaded, create a mouseover
                       // event
                       holderObj.setupMouseover();
                    }

        var attri = this.options.attributes;
        setset.attr(attri);
        var x = this.setsArr[country].translate.x;
        var y = this.setsArr[country].translate.y;
        setset.translate(x,y);



    }   
}