javascript - 将jquery修改应用于meteor站点

标签 javascript jquery meteor

我正在使用来自 HTML5up 的免费模板其中有 main.jsutil.js 文件。它们包含控制视觉外观和感觉的代码。我已按照建议将这些文件移至 client/lib 文件夹。

该模板使用 jquerypoptrox 插件来 jqueryskel 进行布局。它调整图像大小并裁剪它们以适合方形 div 框。

问题是,如果我在 HTML 中手动插入图像,一切都会正常。

<div id="main">
    <article class="thumb">
        <a href="images/0.JPG" class="image">
            <img src="images/0.JPG" alt="" />
        </a>
    </article>              
</div>

但是如果我使用模板并让 Meteor 加载图像数据:

<template name="ImageT">
   {{#each imageUrl}}
      <article class="thumb">
         <a href="images/{{image}}" class="image">
         <img src="images/{{image}}" alt="" /></a>
      </article>
    {{/each}} 
</template>

图像已加载,但缩放和调整大小并未发生。据我所知,poptrox 扩展未加载。

这是模板中的 jquery 代码,我认为它负责此操作:

// Main.
var $main = $('#main');

// Thumbs.
$main.children('.thumb').each(function() {

    var $this = $(this),
    $image = $this.find('.image'), $image_img = $image.children('img'),
                        x;

    // No image? Bail.
    if ($image.length == 0)
        return;

    // Image.
    // This sets the background of the "image" <span> to the image pointed to by its child
    // <img> (which is then hidden). Gives us way more flexibility.

    // Set background.
    $image.css('background-image', 'url(' + $image_img.attr('src') + ')');

    // Set background position.
    if (x = $image_img.data('position'))
        $image.css('background-position', x);

    // Hide original img.
    $image_img.hide();

});

编辑

根据 Answer#1 的建议,我将相关代码移至 Template.ImageT.onRendered()

i=0
Template.ImageT.onRendered(
  function(){

     $main = $('#main');
     $main.children('.thumb').each(function(){

       var  $this = $(this),
         $image = $this.find('.image'), $image_img = $image.children('img'),
         x;

       // No image? Bail.
         if ($image.length == 0)
           return;

       // Image.
       // Set background.
           $image.css('background-image', 'url(' + $image_img.attr('src') + ')');

         // Set background position.
           if (x = $image_img.data('position'))
             $image.css('background-position', x);

         // Hide original img.
           $image_img.hide();

       console.log("This function ran: "+i)
       i=i+1;
     });



    console.log("This ran");
  });

这只运行一次(对应于初始元素),并且不在 meteor 渲染模板上运行。

如果我使用 HTML 中的 2 个元素运行此命令:

 Ran on 0 index.js:38 
 Ran on 1 index.js:44 

但是 meteor 模板插入的元素都没有渲染。

编辑2

当我转到另一个页面并“返回”主页时,代码按预期工作。

最佳答案

您现在只有一个模板,该模板会渲染一次(在页面加载时)。

您希望在 Meteor 渲染每个图像的 HTML 后运行 jQuery 函数的初始化。为此,您可以在 imageT 模板 {{each}} 中调用子模板。

<template name="ImageT">
   {{#each imageUrl}}
      {{> image}}
    {{/each}} 
</template>

<template name="image">
    <article class="thumb">
      <a href="images/{{image}}" class="image">
      <img src="images/{{image}}" alt="" /></a>
    </article>
</template>

然后是JS

Template.Image.onRendered = function() {
    //Put code to run every time an image is rendered below
});

另请参阅 Meteor 文档 Template.myTemplate.onRendered

关于javascript - 将jquery修改应用于meteor站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35410170/

相关文章:

javascript - 下拉菜单不断上下移动

javascript - Jquery Focus 不适用于输入

javascript - Node.js 使用 mssql 访问数据库

javascript - “meteor run android-device”需要永远安装 Cordova 插件

javascript - Mongodb - 为什么我的 Users.findOne 未定义?

javascript - 通用按钮自添加类

javascript - 设置 Blueimp 照片库的困难

javascript - 从文本输入中突出显示 div 中的所有匹配词

javascript - 组合多个 API 调用和处理后从工厂方法返回 promise

javascript - TypeScript 中类型参数的可选计数