2012-03-27 24 views
1

更新:RaphaelJS显示只有一个活动的状态

我已经解决了我的参考下面,我的问题是,现在更加具体。

背景:我有一组路径组成地图。目前,当点击每个区域时,我都有一个视觉开/关状态,但是我只想在任何给定时间只有一个区域处于“活动”状态。我正在调用一个函数来循环所有区域,并将任何非活动区域的填充颜色更改为灰色。目前,在运行以下行时似乎会创建一组新路径:var obj = rsr.path(pathObj.path);。下面是之前和之后的屏幕。

The default state of the map

What happens when the map is clicked

我知道这是不是一个渲染问题,因为新的路径被注入到DOM。

这是我最后一个关于这个项目的障碍,我觉得我太亲近了!

你可以在这里查看网页:再次

function onlyOneRegion() { 
    for (var state in paths) { 
      var pathObj = paths[state]; 
      var obj = rsr.path(pathObj.path); 
      if (pathObj.active) { 
       // do something 
      } else { 
       pathObj.active = false; 
       obj.toFront(); 
       obj.animate({ 
        fill: attributes.fill, 
        scale: 1, 
        'stroke' : '#fff', 
        'stroke-width' : 1, 
        transform: 's1' 
       }, 150); 
      } 
    }; 
} 

感谢:http://ochrerecruitment.com.s145292.gridserver.com/job-search/

这是我在点击活动结束运行功能(Eliran马尔卡的礼貌,谢谢)!

原题:

我目前得到的地图点击时,设置一个<select>值。地图上的每个区域也具有悬停状态和开/关状态。

<select>功能只允许一个区域在任何给定时间处于活动状态。

我的问题是,我不知道如何直观显示只有一个活动项目。所以在点击时,一个区域开启,但我也希望它关闭所有其他区域。

我的全部功能都可以在这里看到:http://pastie.org/3675997

每个区域的结构如下:

var paths = { 
    southisland: { 
     name: 'southisland', 
     path: 'coords', 
     active: 'false' 
    } 
在我的单击事件

我有以下的if else:

if (this.active) { 
    this.active = false; 
    this.animate({ 
     fill: attributes.fill, 
     scale: '1', 
     'stroke-width' : '1', 
     transform: 's1' 
    }, 150);      
} else { 
    this.active = true; 
    this.animate({ 
     fill: '#e36f1e', 
     scale: '1', 
     'stroke-width' : '1', 
     transform: 's1' 
    }, 150); 
} 

之后,我试图调用以下功能:

function onlyOneRegion() { 
    for (var state in paths) { 
     var obj = rsr.path(paths[state].path); 
     if (state[active]) { 
     } else { 
      state[active] = false; 

      obj.animate({ 
       fill: attributes.fill, 
       scale: '1', 
       'stroke-width' : '1', 
       transform: 's1' 
      }, 150); 
     } 
    }; 
} 

此函数不会抛出任何错误,但不会停止工作。

任何帮助,非常感谢!

回答

0

我结束了重写我的地图创建成一个函数解决更新问题。每次点击某个区域时,它都会记住该区域,删除并重新创建该地图,将该区域与相关状态ID进行匹配并使其处于活动状态。不是最优雅的解决方案,但仍是一个解决方案。

+0

你可能会分享我试图达到同样的目的,并找不到任何东西的代码。 – 2012-07-23 23:42:07

0

请更换此state[active]state['active']

paths[state]['active']state是字符串替换state[active] - 国家

+0

谢谢。不幸的是它出现在我的console.log中未定义,尽管console.log(state)解析得很好。 – tiltos 2012-03-27 07:05:10

0

的名字在你充分贴看你不是实际调用onlyOneRegion()任何地方。您需要在click()之内的某处添加呼叫。

还要注意的是“this”内onlyOneRegion()不会是正确的(我猜你会看到发生了什么事情在那里,当你得到的功能工作,它需要是rsr.path(paths[state].path))。

+0

干杯。我现在直接调用它后,如果上面提到的其他东西(抱歉,馅饼比堆栈问题大约30分钟)) – tiltos 2012-03-27 06:17:42

+0

啊对!这应该工作。你是否用rsr.path(paths [state] .path)或类似的东西替换了'this'?它至少应该抛出一个错误,如果没有。 – huwshimi 2012-03-27 06:23:13

+0

它是一个奇怪的。 state ['name'],state ['active']等在我的onlyOneRegion函数中返回undefined。一个唯一的OneRegion函数运行它会冻结任何进一步的交互,但不会引发错误 – tiltos 2012-03-27 07:02:27

1

您正在尝试拨打paths索引的属性。请注意0​​是paths列表迭代器的索引,而不是对象(例如,在Java中,例如每次迭代)。

另一件事,当传递数值时,将它们作为数值(而不是字符串)传递。

试图纠正你的函数,像这样:

function onlyOneRegion() { 
    for (var state in paths) { 
     var pathObj = paths[state]; 
     var obj = rsr.path(pathObj.path); 

     if (pathObj.active]) { 
      // do something 
     } else { 
      pathObj.active = false; 

      obj.animate({ 
       fill: attributes.fill, 
       scale: 1, 
       'stroke-width' : 1, 
       transform: 's1' 
      }, 150); 
     } 
    }; 
} 
+0

感谢您的建议。似乎只要我调用rsr.path,它就会创建一个新的路径实例。你可以在这里查看它的行动:ochrerecruitment.com.s145292.gridserver.com/job-search – tiltos 2012-03-27 22:08:28

相关问题