首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jQuery迁移插件不允许我使用jQuery(htmlString)

jQuery迁移插件不允许我使用jQuery(htmlString)
EN

Stack Overflow用户
提问于 2017-10-11 16:10:31
回答 1查看 290关注 0票数 1

我正在升级一些使用jQuery版本1.7.2的旧软件。由于添加了一些新插件并需要更新版本的jQuery,我已经将其升级到1.12.1版。

但是,有大量的jQuery使用jQuery(htmlString)格式,例如:

代码语言:javascript
运行
复制
  var html = $("<div>");

  // Prepare the <div> of comments
  $.each(data.comments, function() {
      console.log(this);
    html.append(
      $("<div>").attr("class", "comment").html(
        $("<div>").attr("class", "comment-profile-pic").html("").after(
          $("<div>").attr("class", "comment-text").html(
            $("<h1>").html(
              this.full_name + " at " + this.started_datetime
            ).after(
              $("<p>" + this.text + "</p>")
            )
          )
        )
      )
    );
  });

看起来$(htmlString)在1.9版中贬值了,阅读了https://jquery.com/upgrade-guide/1.9/#jquery-htmlstring-versus-jquery-selectorstring的升级指南,它说明了如果html被传递到选择器中,识别格式已经改变,但是它也说:

当使用jQuery迁移插件时,它将使用旧的规则来确定传递给$()的字符串是否“看起来像HTML”。

我已经附加了jQuery迁移插件版本1.4.1,但它似乎并没有起到任何作用,而且在选择器中仍然不会识别HTML。

编辑:我尝试过将jQuery还原到1.8.0版本,它可以正常工作,但是1.9.0版本破坏了它。这意味着升级到v1.9肯定是个问题。

另外,在做了进一步的测试之后,我已经意识到,将html传递到选择器中确实会在执行类似于$("<div>").attr("class", "comment")的操作时工作,但在嵌套时不起作用,如上面的示例所示。

有没有人知道如何绕过这个问题而不重写所有将HTML传递给选择器的代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-11 16:21:12

如果您阅读升级指南,您将看到只有当html字符串不以<字符开头时才会出现问题:

从1.9开始,字符串只有在以小于("<")字符开头时才被认为是HTML。迁移插件可以用来恢复之前的1.9行为。如果字符串已知为HTML,但可能以不属于HTML标记的任意文本开头,则将其传递给jQuery.parseHTML(),后者将返回表示标记的DOM节点数组。

也就是说,您应该使用addClass(),而不是attr('class', 'foo'),而不应该将jQuery对象传递给html()方法。如果您检查文档,您将看到它接受一个HTML或一个函数。

您应该使用元素插入方法之一,例如append()insert()insertBefore()等,如下所示:

代码语言:javascript
运行
复制
var data = {
  comments: [{
    text: 'foo1',
    full_name: 'name1',
    started_datetime: 'started1'
  },{
    text: 'foo2',
    full_name: 'name2',
    started_datetime: 'started2'
  }]
}

var $parent = $("<div>").appendTo('body');

$.each(data.comments, function() {
  var $comment = $("<div>").addClass('comment').appendTo($parent);
  var $profilePic = $("<div>").addClass('comment-profile-pic').appendTo($comment);
  $("<div>").addClass('comment-text').html(`<h1>${this.full_name} at ${this.started_datetime}</h1><p>${this.text}</p>`).insertAfter($profilePic);
});
代码语言:javascript
运行
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46692942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档