escape_javascript 之后的砌体

Posted

技术标签:

【中文标题】escape_javascript 之后的砌体【英文标题】:Masonry after escape_javascript 【发布时间】:2013-09-11 16:33:35 【问题描述】:

我正在使用 Masonry 和 Rails 应用程序来渲染一个充满图像的屏幕。我的问题是在某些时候我使用远程 AJAX 表单进行调用,该表单稍后会刷新 div。在那之后,调用 Masonry 就停止工作了,调用它就像没有定义 Masonry 一样。

渲染代码相当简单,div Masonry 应该可以工作:

<div id="pins">
  <%= render @pins %>
</div>

我正在渲染的部分只是显示 Rails 模型,它看起来像:

<div id="pin-<%= pin.id %>" class="box">...</div>

在第一页加载时加载 Masonry 的代码:

jQuery ->
    $('#pins').imagesLoaded ->
        $('#pins').masonry itemSelector: ".box", isAnimated: true

然后,在视图 javascript 中,我重新渲染 div,如下所示:

$("#pins").html("<%= escape_javascript render @pins %>");

$('#pins').imagesLoaded(function() 
    alert("Hey");
    return $('#pins').masonry(
          itemSelector: ".box",
          isAnimated: true
    );
);

刷新后,会显示“嘿”警报,这意味着事件被触发并被很好地捕获。但是,调用了 Masonry 并且似乎正在重新附加内容但没有对其进行排序。为了测试这一点,我还尝试使用链接手动触发 Masonry,并且在调用 escape_javascript 后它也停止工作。当然,如果我尝试在没有 escape_javascript 的情况下渲染部分内容,则不会刷新任何内容。

我需要一些方法来渲染部分而不转义 javascript,或者在 javascript 被转义后如何使 Masonry 可操作的说明。请注意,与上述重新声明时其他 JQuery 组件工作正常的环境相同。

提前致谢。

【问题讨论】:

【参考方案1】:

添加元素后尝试使用“附加”方法

http://masonry.desandro.com/methods.html#appended

【讨论】:

【参考方案2】:

只需触发重新加载元素,例如:

$(document).ajaxComplete -> $(element).masonry()

如果尝试在 $(element) 上捕获 ajaxComplete 将不起作用

【讨论】:

以上是关于escape_javascript 之后的砌体的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Rails escape_javascript 行中的 JavaScript 变量?

砌体结构上的裂缝是啥裂缝

砌体图像相互重叠

没有预定义宽度的响应式砌体布局

Bootstrap 4 - 结合网格系统的砌体布局(二、三、四和六列布局)[重复]

纯 CSS 砌体布局