在Masonry的container.append上获取错误Uncaught TypeError:Object没有方法过滤器

PUG*_*PUG 1 html javascript jquery jquery-masonry infinite-scroll

我正在我的网页上实现无限滚动,显示图像.使用砖石对齐图像.最初当页面加载时我只在#containerdiv中放入10个图像.并且使用下面的代码正确对齐所有图像,并且在chrome脚本控制台中没有错误.

var $container = $('#container');
        $container.imagesLoaded(function(){
        $('#container').masonry({
          itemSelector: '.box',
          columnWidth: 200,
          isAnimated: true
        });
    });
Run Code Online (Sandbox Code Playgroud)

但是当用户向下滚动时我会这样做

$.ajax({
         url: "load.php?offset="+1+"&quantity="+1,
         success: function(html){
         if(html){
                  var $container = $('#container');
                  var $test = "<div>even doing this causes error </div>";
              $container.append($test).masonry('appended',$test);
        }
  });
Run Code Online (Sandbox Code Playgroud)

现在,当我向下滚动时,我在chrome控制台中得到以下错误,并且附加的图像会堆叠起来.

 Uncaught TypeError: Object <div class....... </div>  has no method filter
Run Code Online (Sandbox Code Playgroud)

j0k*_*ker 13

正如我在评论中所说,在使用jQuery时,您获得的错误消息是典型的.filter()是一个jQuery对象的方法.砌体似乎试图在你的$test变量中的任何对象上调用它,在你的例子中,它是一个String对象.基本上,它打电话

"<div>even doing this causes error </div>".filter(...)
Run Code Online (Sandbox Code Playgroud)

这会产生你的错误.

为了使事情有效,您必须将masonry()方法传递给jQuery对象而不是String(或任何其他JavaScript对象).如果您有一个String,例如,作为AJAX调用的结果,您可以通过使用jQuery函数将其转换为jQuery对象.对于你的例子:

$test = $("<div>even doing this causes error </div>");
Run Code Online (Sandbox Code Playgroud)

这将创建一个jQuery div对象,该对象应该可以与砌体一起使用.

另一个提示:您似乎在前面添加了一个$符号.虽然这取决于你,但我建议只使用包含jQuery对象的变量作为前缀$,不要为任何其他变量添加前缀.所以,对于Strings你只需要使用var test = "String";.这是我发现非常有用的惯例.此外,它将使其他人更容易理解您的代码.