You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails视图点击图片打开fancybox报错:Unrecognized expression: .fancybox_#

解决Fancybox弹窗报错:Unrecognized expression: .fancybox_#

这个错误的核心原因很明确:你的视图里生成的Fancybox类名出现了无效的#字符,这是因为hotel.id没有返回有效的数值(可能是nil或者未定义),导致渲染后的class变成了.fancybox_#——这种格式不符合CSS/jQuery选择器的规则,所以Fancybox无法识别它。

下面是一步步的解决方案:

1. 先确认hotel.id的有效性

首先要排查数据源问题,在视图里临时添加一行代码验证hotel.id的取值:

<%# 临时调试用,确认hotel.id的实际值 %>
<%= hotel.id.inspect %>

如果输出是nil或者不是数字,那你需要先确保hotel对象在这个上下文里有正确的id属性,比如检查控制器里是否正确传递了hotel实例,或者itineraries关联的hotel是否有完整的属性。

2. 修正Fancybox类名的生成逻辑

即使hotel.id偶尔为空,我们也要保证生成的类名是合法的。把原来的fancybox_<%= hotel.id %>改成更健壮的命名方式,比如:

<%# 主图的a标签 %>
<a class="fancybox-hotel-<%= hotel.id || 'unknown' %> thumb_a" href="<%= hotel.pictures.first['url'] %>">
  <div class="image">
    <%= image_tag 'shared/ajax-loader_white.gif', realsrc: hotel.pictures.first['url'], class: 'thumb', alt: hotel.pictures.first['description'] %>
  </div>
</a>

<%# 缩略图循环里的a标签 %>
<% hotel.pictures.each do |hr_pic| %>
  <div class="small_image">
    <a class="fancybox-hotel-<%= hotel.id || 'unknown' %>" href="<%= hr_pic['url'] %>">
      <%= image_tag 'shared/ajax-loader_white.gif', realsrc: hr_pic['url'], class: 'small_thumb', alt: hr_pic['description'], style: 'display: none;' %>
    </a>
  </div>
<% end %>

用hotel.id || 'unknown'做兜底,避免生成带#的无效类名。

3. 正确初始化Fancybox

根据你使用的Fancybox版本,调整初始化逻辑:

如果你用的是Fancybox 3+

推荐使用data-fancybox属性来分组图片,这样不需要手动按类名初始化,更简洁:

<%# 主图的a标签 %>
<a data-fancybox="hotel-<%= hotel.id || 'unknown' %>" class="thumb_a" href="<%= hotel.pictures.first['url'] %>">
  <!-- 图片内容 -->
</a>

<%# 缩略图循环里的a标签 %>
<% hotel.pictures.each do |hr_pic| %>
  <div class="small_image">
    <a data-fancybox="hotel-<%= hotel.id || 'unknown' %>" href="<%= hr_pic['url'] %>">
      <!-- 缩略图内容 -->
    </a>
  </div>
<% end %>

Fancybox会自动识别同一data-fancybox值的元素为一组,点击任意图片都会弹出包含所有组内图片的弹窗。

如果你用的是旧版Fancybox(2.x及以下)

需要在JavaScript里按类名初始化,注意要在DOM加载完成后(或者AJAX请求完成后,因为你的表单用了remote: true)执行初始化:

$(document).ready(function() {
  // 初始化所有酒店图片组
  $('[class^="fancybox-hotel-"]').fancybox({
    type: 'image',
    loop: true,
    // 其他自定义配置
  });
});

// 如果是AJAX动态加载的内容,要在请求成功后重新初始化
$(document).on('ajax:success', '.step_1_hotel_form', function() {
  $('[class^="fancybox-hotel-"]').fancybox({
    type: 'image',
    loop: true
  });
});

4. 额外优化:处理懒加载图片

你的代码里用了realsrc属性做懒加载,要确保Fancybox能正确获取到真实的图片URL。如果懒加载逻辑是自定义的,可以在Fancybox初始化时添加回调,把href替换成realsrc的值:

$('[class^="fancybox-hotel-"]').fancybox({
  type: 'image',
  beforeLoad: function() {
    var realSrc = $(this.element).find('img').attr('realsrc');
    if (realSrc) {
      this.href = realSrc;
    }
  }
});

内容的提问来源于stack exchange,提问作者Balance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:06:13