我正在使用AJAX来获取一些HTML标记。我想使用find()
将获取的标记中的一些样式标记(带有类)附加到我自己的文档中。但是,jQuery似乎不喜欢以下方法。
(由于缺乏声誉而删除了链接)
有人可以解释为什么这不起作用,并指出我正确的方向?
提前谢谢。
innerHTML
代替.html()
更简单,因为设置innerHTML不会评估脚本并允许.find()
运行。 http://jsfiddle.net/T6QCR/8/ 感谢您的帮助!
答案 0 :(得分:0)
body
未定义,控制台也通过错误指示了这一点。如果你想使用jQuery来选择标记体并附加样式,那么你需要使用一个合适的选择器:
$("body").append($style);
答案 1 :(得分:0)
来自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');
答案 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>