概述 jQuery( html [, ownerDocument ] )
返回值:jQuery
描述:根据提供的原始 HTML 标记字符串,动态创建由 jQuery 对象包装的 DOM 元素。
根据提供的原始 HTML 标记字符串,动态创建由 jQuery 对象包装的 DOM 元素。同时设置一系列的属性、事件等。
你可以传递一个手写的 HTML 字符串,或者由某些模板引擎或插件创建的字符串,也可以是通过 AJAX
加载过来的字符串。但是在你创建 input 元素的时会有限制,可以参考第二个示例。当然这个字符串可以包含斜杠
(比如一个图像地址),还有反斜杠。当你创建单个元素时,请使用闭合标签或 XHTML 格式。例如,创建一个 span
,可以用$("<span/>")
或 $("<span></span>")
,但不推荐 $("<span>")
。在jQuery 中,这个语法等同于$(document.createElement("span"))
在jQuery 1.8中,通过$(html,props)
,
您可以使用任何jQuery对象的方法或插件。在此之前,你只能使用一个方法名的短名单,并有没有成文的方式添加到列表中。然而,请注意,这可能会导致你的代码的行为改变,如果插件添加后,有相同的名称作为HTML属性。
如果一个字符串做为一个参数传递个$()
, jQuery 检查这个属性是否看上去像HTML (也就是, <tag ... >
之类的元素在这个字符串中)。如果没有, 这个字符串将被解释为选择器, 作为解析上下文。 但是如果该字符串是一个 HTML
代码片断,那么jQuery 就会根据它尝试创建一个新的 DOM
元素。然后jQuery对象创建并返回引用的这些元素。我们可以在这个对象上执行一些常用的jQuery方法:
$( "<p id='test'>My <em>new</em> text</p>" ).appendTo( "body" );
一个字符串显式解析成HTML,请使用$.parseHTML() 方法.
默认情况下,元素会被创建到加载了jQuery库文件的那个文档的.ownerDocument
下。
元素被注入到一个不同的文档应使用那个文档创建,例如:$("<p>hello iframe</p>", $("#myiframe").prop("contentWindow").document)
.
在上面的示例中,当一个HTML比一个没有属性的简单标签复杂的时候,实际上,创建元素的处理是利用了浏览器的 .innerHTML
机制。特别说明,jQuery创建一个新的<div>
元素,并且设置innerHTML
属性为传入的HTML代码片段。当参数是一个单标签,就像 $( "<img />" )
或 $( "<img>" )
, $( "<a></a>" )
或 $( "<a>" )
,jQuery将使用javasrcipt原生的 .createElement()
函数创建这个元素。
当传入一个复杂的html,一些浏览器可能不会产生一个完全复制HTML源代码所提供的DOM。正如前面提到的,jQuery使用的浏览器.innerHTML
属性来解析传递的HTML并将其插入到当前文档中。在此过程中,一些浏览器过滤掉某些元素,如<html>
, <title>
, 或 <head>
的元素。其结果是,被插入元素可能不是传入的原始的字符串。
不过,这些被过滤掉的标签有限的。有些浏览器可能不完全复制所提供的HTML源代码生成DOM。例如,Internet Explorer的版本8之前转换所有链接的href
属性为绝对URL路径,和Internet Explorer第9版之前,不增加一个单独的兼容层的情况下,将无法正确处理HTML5元素。
为了确保跨平台的兼容性,代码片段必须是良好的。标签可以包含其他元素,但需要搭配的结束标记:
$( "<a href='http://jquery.com'></a>" );
标签不能包含元素可能很快封闭,当然也可以不这样做:
$( "<img>" );
$( "<input>" );
当传递HTML给jQuery()
时,注意,文本节点不被视为DOM元素。 除了一些方法(如内容.content()
),它们一般都被忽略或删除。例如:
var el = $( "<br>2<br>3" ); // returns [<br>, "2", <br>]
el = $( "<br>2<br>3 >" ); // returns [<br>, "2", <br>, "3 >"]
这是预期的结果。 从jQuery1.9.0开始(除非使用jQuery Migrate plugin(jQuery迁移插件)), jQuery()
方法要求的HTML字符串是以一个<
(小于号)开头的字符串(即文本节点不能出现在HTML字符串的前面)。
从jQuery 1.4开始,给jQuery()
的第二个参数可以接受一个简单的对象组成的一个属性集合,可以传递.attr()方法。
重要提示: 如果第二个参数被传递,第一个参数中的HTML字符串 必须代表一个没有任何属性简单的元素。 从 jQuery 1.4开始,一些event type(事件类型)可以传递进来, 而且能够调用以下jQuery方法: val, css, html, text, data, width, height, or offset。
从 jQuery 1.8开始, 任何jQuery实例方法(一个jQuery.fn
的方法),可以被用来作为一个该对象的属性传递给第二个参数:
$( "<div></div>", {
"class": "my-div",
on: {
touchstart: function( event ) {
// do something
}
}
}).appendTo( "body" );
在这个对象中,"class"
(类)的名称必须使用引号括起来,因为它是一个JavaScript保留字,还有不能使用"className"
,因为它是指的DOM属性(property),不是属性(attribute)。
虽然第二个参数是方便,它的灵活性可能会导致意想不到的后果(例如$("<input>", {size: "4"})
调用.size()
方法,代替设置size属性)。上面的代码块可以被写入,代替为:
$( "<div></div>" ) .addClass( "my-div" ) .on({ touchstart: function( event ) { // do something } }).appendTo( "body" );
示例
动态创建一个 div 元素(以及其中的所有内容),并将它追加到 body 元素中。在这个函数的内部,是通过临时创建一个元素,并将这个元素的 innerHTML 属性设置为给定的标记字符串,来实现标记到 DOM 元素转换的。所以,这个函数既有灵活性,也有局限性。
$("<div><p>Hello</p></div>").appendTo("body");
创建一个 <input> 元素必须同时设定 type 属性。因为微软规定 <input> 元素的 type 只能写一次。
// 在 IE 中无效:
$("<input>").attr("type", "checkbox");
// 在 IE 中有效:
$("<input type='checkbox'>");
动态创建一个 div 元素(以及其中的所有内容),并将它追加到 body 元素中。在这个函数的内部,是通过临时创建一个元素,并将这个元素的 innerHTML 属性设置为给定的标记字符串,来实现标记到 DOM 元素转换的。所以,这个函数既有灵活性,也有局限性。
$("<div>", {
"class": "test",
text: "Click me!",
click: function(){
$(this).toggleClass("test");
}
}).appendTo("body");
创建一个 <input> 元素,同时设定 type 属性、属性值,以及一些事件。
$("<input>", {
type: "text",
val: "Test",
focusin: function() {
$(this).addClass("active");
},
focusout: function() {
$(this).removeClass("active");
}
}).appendTo("form");
查找文档中第一个表单中的所有单选按钮。
$("input:radio", document.forms[0]);
查找 Ajax 返回的 XML 文档中的所有 div 元素。
$("div", xml.responseXML);
将页面的背景色设置成黑色。
$(document.body).css( "background", "black" );
隐藏 myForm 表单中的所有 input 元素。
$(myForm.elements).hide()
查找所有 div 下的 p 元素,并为它们加上边框
<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery-latest.js"></script> </head> <body> <p>one</p> <div><p>two</p></div> <p>three</p> <script> $( "div > p").css("border", "1px solid gray"); </script> </body> </html>