javascript - 如何链接这两个对象(图像映射形状和复选框)?

标签 javascript jquery ruby-on-rails

我有一个形状的图像映射集合和一堆复选框,如何才能在单击形状时选择相应的复选框,反之亦然?

图像映射:

<div class="map_container">

  <%= image_tag("maps/mainmap.png", :width => "450", :height => "450", :class => "map", :usemap => "#mainmap", :alt => "") %>

  <map name="mainmap">
    <area id="north" shape="poly" 
      coords="158,43,152,49,164,86,165,112,153,153,139,169,145,171,161,176,236,201,241,202,251,166,253,142,257,132,294,102,269,85,240,68,227,53,213,28,202,27" alt="North"
      data-maphilight='{"stroke":false,"fillColor":"5F9EA0","fillOpacity":0.6}'
      onmouseover="document.body.style.cursor='pointer'" 
      onmouseout="document.body.style.cursor='default'" >

    <area id="south" shape="poly" 
      coords="38,288,16,361,13,374,18,380,69,403,183,408,217,390,199,352,188,330,177,321,169,317,40,284" alt=""
      data-maphilight='{"stroke":false,"fillColor":"5F9EA0","fillOpacity":0.6}'
      onmouseover="document.body.style.cursor='pointer'" 
      onmouseout="document.body.style.cursor='default'" >
  </map>              
</div>

复选框:

<div class="filter_options_container">
  <%= form_tag '', :method => :get, :id => 'filter_form' do %>

    <fieldset class="filter_form_fieldset areas">
      <% Area.all.each do |a| %>
        <p class="area_check"><%= check_box_tag 'areas[]', a.id, false, :id => "area-#{a.id}" %>
        <label for="area-<%= a.id %>"><p1><%= a.name %></p1></label></p>
      <% end %>
    </fieldset>

    <div class="filter_form_button">
      <p2><input type="submit" value="Filter"/></p2>
    </div>
  <% end %>
</div>

这给出了这个输出:

<div class="filter_options_container">
  <form accept-charset="UTF-8" action="" id="filter_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>        

    <fieldset class="filter_form_fieldset areas">

        <p class="area_check"><input id="area-41" name="areas[]" type="checkbox" value="41" />
        <label for="area-41"><p1>North</p1></label></p>
        <p class="area_check"><input id="area-42" name="areas[]" type="checkbox" value="42" />
        <label for="area-42"><p1>South</p1></label></p>
    </fieldset>

    <div class="filter_form_button">
      <p2><input type="submit" value="Filter"/></p2>
    </div>
</form></div>

非常感谢任何帮助!

最佳答案

您可能希望在 <area> 之间提供某种“链接” s 和复选框。一些将配对匹配在一起的属性。现在你的<area> s 具有“north”和“south”的 alt 标签,但复选框具有看似不相关的 id 41 和 42。如何将它们匹配起来,这样您就不必进行大量遍历,例如:

$('area').click(function(){
    var name = $(this).attr('alt');
    var $checkbox = $('[name=' + name + ']');
    $checkbox.attr('checked', !$checkbox.attr('checked'));
});

很适合像这样的html:

North<input name="north" type="checkbox" />

South<input name="south" type="checkbox" />

...

  <area shape="rect" coords="137,17,285,120" href="#" alt="north">
  <area shape="rect" coords="152,165,292,327" href="#" alt="south">

jsFiddle

编辑: key 只是匹配 <area>发送至<input> s,理想情况下你可以制作你的 html,以便匹配对有一些共同点,但如果最坏的情况发生,你有 2 个后备方法。

1) 顺序:如果 <area>与复选框的顺序相同,并且它们每个都有一个您可以信赖的合作伙伴:

$('area').click(function(i){
    var name = $(this).attr('id');
    var $checkbox = $('.areas input[type="checkbox"]').eq(i);
    $checkbox.attr('checked', !$checkbox.attr('checked'));
});

这将使用您单击的索引“i”来选择同一索引的复选框。

2) 写入 JavaScript 的直接映射:

var CBids = {
    "north" : "area-41"
    "south" : "area-41"
};

$('area').click(function(){
    var name = $(this).attr('id');
    var $checkbox = $('#' + CBids[name] );
    $checkbox.attr('checked', !$checkbox.attr('checked'));
});

关于javascript - 如何链接这两个对象(图像映射形状和复选框)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8887136/

相关文章:

javascript - 保存变量值并在页面刷新后检索它

jquery 工具提示 IE 问题

javascript - 汉堡包按钮未使用 Material Design Lite 正确对齐

ruby-on-rails - 在我的订单子(monad)句中传递参数是否让我可以选择进行 sql 注入(inject)?

ruby-on-rails - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: 证书验证失败

asp.net - .Net 平台有 Django 或 Rails 吗?

c# - cshtml 标签中的使用条件

javascript - 页面周围的静态框架随着滚动改变颜色

javascript - CKEditor 显示来自数据库的格式化(使用 CKEditor CSS)HTML

javascript - 如何在收到响应后显示带有 if/else 语句的 div