body标签是否可以存在于jQuery对象中?

jku*_*zak 2 jquery

我正在尝试创建脚本,将用户提交的HTML复制到jQuery对象中,对其进行操作,然后将其作为纯文本返回给用户.我有一个<textarea>用户将其HTML粘贴到然后提交.在这一点上,我抓住了它的值<textarea>并创建了jQuery对象,以便我可以使用jQuery来修改它.

不过,我最近才刚刚发现的事情,如<!doctype html>,<html>标签和<body>标签似乎并没有成为的对象.这些东西可以在jQuery对象中不存在吗?我通过将<body>标记放入jQuery对象然后使用.find()来测试它.我没有得到任何结果.

另外,当我使用这个代码时如何将jQuery对象转换为字符串?

$('<div>').append($('#item-of-interest').clone()).html();

<body>标签丢失.虽然,我不确定这是否只是因为我正在使用输出来自jQuery对象的字符串.

jfr*_*d00 7

如果你在jQuery对象构造函数内部遵循jQuery代码,一旦确定你传入了一个HTML字符串,那么它就会调用jQuery.parseHTML()该字符串.如果您遵循该parseHTML()方法,如果HTML不仅仅是单个标记,那么它会调用buildFragment()相同的HTML字符串,如果您遵循它,您会发现它丢弃了<body>标记.我不知道它为什么这样做,但这就是编码行为的方式.

所以,有这种类型的代码流:

jQuery object constructor
    determine if argument is an HTML string
    call jQuery.parseHTML() on the HTML string
       if string is not a single tag by itself, 
           then call jQuery.buildFragment() on the string
           jQuery.buildFragment() seems to ignore the outer tag container
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么buildFragment()忽略外部<body>other content here</body>,但确实如此.

在进一步研究中buildFragment(),它正确解析外部标记<body>,但只要该标记不是需要一些特殊处理的标记类型(例如只能存在于表内的事物类型),它就完全忽略了键入外部标记并强制它成为<div>.当从jQuery对象检索内容时,稍后将忽略该外部容器.同样,我不确定为什么会这样做,但这就是它的作用.


至于你的特殊问题,我认为结论是你不能使用jQuery的构造函数来处理整个HTML文档.它不是为了做到这一点而建立的.

您可以搜索提供给您的HTML文档并仅提取它之间的部分,<body>并将其</body>提供给jQuery对象构造函数,对其进行操作,然后将处理后的HTML放回到原始<body></body>标记之间的原始整个HTML文档中因此,在<body>标签内部使用jQuery时,保留了您不想操作的所有内容.

你可能也应该警惕标签中的<script>元素,<body>因为它们可能也没有完美地保存.