按类<not style>查找<style>标记

时间:2013-06-10 23:39:21

标签: javascript jquery html styles find

我正在使用AJAX来获取一些HTML标记。我想使用find()将获取的标记中的一些样式标记(带有类)附加到我自己的文档中。但是,jQuery似乎不喜欢以下方法。

(由于缺乏声誉而删除了链接)

有人可以解释为什么这不起作用,并指出我正确的方向?

提前谢谢。

解决方案

  • 首先使其成为本机元素(并删除脚本标记作为额外的预防措施)。 http://jsfiddle.net/T6QCR/5/
  • 此外,使用innerHTML代替.html()更简单,因为设置innerHTML不会评估脚本并允许.find()运行。 http://jsfiddle.net/T6QCR/8/
  • 另外,laconbass'回答如下。

感谢您的帮助!

4 个答案:

答案 0 :(得分:0)

body未定义,控制台也通过错误指示了这一点。如果你想使用jQuery来选择标记体并附加样式,那么你需要使用一个合适的选择器:

$("body").append($style);

答案 1 :(得分:0)

解析HTML块而不是仅仅将其传递给jQuery

来自jQuery function documentation for the case you are using

  

(...)如果字符串看起来是一个HTML片段,jQuery会尝试   按照HTML描述创建新的DOM元素。然后是一个jQuery对象   创建并返回引用这些元素。你可以表演   这个对象上任何常用的jQuery方法。

     

(...)

     

如果HTML比没有属性的单个标签更复杂,那么   在上面的例子中,元素的实际创建是   由浏览器的innerHTML机制处理。在大多数情况下,jQuery   创建一个新元素并设置的innerHTML属性   传入的HTML代码段的元素。

     

(...)

     

传递复杂的HTML时,某些浏览器可能无法生成DOM   它完全复制了提供的HTML源代码。如上所述,jQuery   使用浏览器的.innerHTML属性来解析传递的HTML和   将其插入当前文档。在这个过程中,一些   浏览器过滤掉某些元素,例如,或    元素。结果,插入的元素可能不是   传递原始字符串的代表。

The documentation推荐使用$.parseHtml()

  

要将字符串显式解析为HTML,请使用$ .parseHTML()   方法

$.filter而不是$.find

如您所述,$.find不适用于此示例。我成功用$.filter电话取代了它。

// this works
$html.filter('.test');
// this doesn't works
$html.find('.test');

// better if you filter also by tag
// surely you will have more tags other than <style> on the retrieved html
$html.filter('style.test');

请参阅this fiddle上的示例。

答案 2 :(得分:0)

<style>元素不能包含class属性,因为Uncaught SyntaxError: Unexpected identifier

此代码应该有效:

var html = '<html><head><style>aaa</style></head></html>';
var $html = $.parseHTML(html);

$.each($html, function(i, el) {
    if(el.nodeName == "STYLE") {
        $("head").append(el.outerHTML);
        return false;
    }
});

答案 3 :(得分:-1)

我不确定为什么会这样,但它与文档模型及其工作原理有关。你不能只持有一个包含html文本的临时var,你需要将它全部放在一个以某种方式附加到文档的元素(如div)中。可以从用户的视图中隐藏此div。

<html>
  <head>
    <div></div>
  </head>
  <body>
    <script>
      jQuery(document).ready(function($) {
        $('div').hide().html('<html><head><style class="test"></style></head></html>'); // From AJAX request

        var $style = $('div').find('.test');
        document.body.appendChild($style[0]);
      });
    </script>
  </body>
</html>