【问题标题】:How can I link these two object with javascript?如何将这两个对象与 javascript 链接?
【发布时间】:2012-01-18 23:20:00
【问题描述】:

我有一些图像映射区域和一些复选框。每个区域都有一个对应的复选框,我怎样才能使当一个区域被点击时对应的复选框被打勾?

图像地图:

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

  <map name="mainmap">
    <area id="area-42" 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="area-43" shape="poly" 
      coords="296,103,258,133,254,143,252,166,242,203,263,209,272,204,322,226,340,250,360,241,356,230,357,222,378,214,395,195,394,188" alt=""
      data-maphilight='{"stroke":false,"fillColor":"5F9EA0","fillOpacity":0.6}'
      onmouseover="document.body.style.cursor='pointer'" 
      onmouseout="document.body.style.cursor='default'" >    
  </map>    

复选框:

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

这会产生:

  <img alt="" class="map" height="450" src="/assets/maps/mainmap.png" usemap="#mainmap" width="450" />

  <map name="mainmap">
    <area id="area-41" 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="area-42" shape="poly" 
      coords="296,103,258,133,254,143,252,166,242,203,263,209,272,204,322,226,340,250,360,241,356,230,357,222,378,214,395,195,394,188" alt=""
      data-maphilight='{"stroke":false,"fillColor":"5F9EA0","fillOpacity":0.6}'
      onmouseover="document.body.style.cursor='pointer'" 
      onmouseout="document.body.style.cursor='default'" >    
  </map>

  <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>Chinatown</p1></label></p>
      <p class="area_check"><input id="area-42" name="areas[]" type="checkbox" value="42" />
      <label for="area-48"><p1>Village</p1></label></p>
  </fieldset>

我认为这段 javascript 可能会将两者联系起来,但它不起作用,关于我哪里出错了有什么想法吗?

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

非常感谢您的帮助!

【问题讨论】:

  • 你能否通过在javascript函数中放置一条警告语句来检查是否发生了点击
  • 尝试调试 javascript 以查看 click 函数内部发生了什么(或者它是否被调用)。如果您使用的是 Firefox,请尝试使用 firebug。 Chrome 和 Safari 都内置了调试器。

标签: javascript ruby-on-rails imagemap


【解决方案1】:

您在 &lt;area&gt; 标记和复选框中使用了相同的 id 值。那永远行不通。您在获取 $checkbox 变量的过程中也遇到了一些错误。

我更改了&lt;area&gt; 标记以使用数据值,并更改了代码以检索该数据值,它现在可以工作了。你可以在这里看到它的实际效果:http://jsfiddle.net/jfriend00/ndwjC/

由于我们没有实际的图像,因此必须猜测在哪里单击才能找到热点,但是当您找到一个时,它会切换一个复选框。

HTML:

  <img alt="" class="map" height="450" src="/assets/maps/mainmap.png" usemap="#mainmap" width="450" />

  <map name="mainmap">
    <area data-areanum="area-41" 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 data-areanum="area-42" shape="poly" 
      coords="296,103,258,133,254,143,252,166,242,203,263,209,272,204,322,226,340,250,360,241,356,230,357,222,378,214,395,195,394,188" alt=""
      data-maphilight='{"stroke":false,"fillColor":"5F9EA0","fillOpacity":0.6}'
      onmouseover="document.body.style.cursor='pointer'" 
      onmouseout="document.body.style.cursor='default'" >    
  </map>

  <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>Chinatown</p1></label></p>
      <p class="area_check"><input id="area-42" name="areas[]" type="checkbox" value="42" />
      <label for="area-48"><p1>Village</p1></label></p>
  </fieldset>

Javascript:

 $(function() {
    $('area').click(function(){
      var name = $(this).data("areanum");
      var $checkbox = $('#' + name);
      $checkbox.attr('checked', !$checkbox.attr('checked'));
    });       
  });

附:如果您使用的是最新版本的 jQuery,您可能应该使用 .prop() 而不是 .attr() 来更改复选框。

【讨论】:

  • 非常感谢!卡在这个问题上太久了,这是一种享受,再次感谢!
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 2017-07-27
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2017-01-17
相关资源
最近更新 更多