.before()

.before( content [, content ] )返回类型:jQuery

描述:在匹配元素的集合中每个元素的开头插入用参数指定的内容。

  • 增补版本:1.0.before( content [, content ] )

    • content
      类型:htmlString or Element or Text or Array or jQuery
      要插入到匹配的元素集合中每个元素的前面的HTML字符串、DOM元素、文本节点、元素的数组以及文本节点,或者jQuery对象。
    • content
      类型:htmlString or Element or Text or Array or jQuery
      要插入到匹配的元素集合中每个元素前面的一个或多个额外的DOM元素、文本节点、元素和文本节点的数组、HTML字符串,或者jQuery对象。
  • 增补版本:1.4.before( function )

    • function
      类型:Function( Integer index ) => htmlString or Element or Text or jQuery
      一个函数,返回要插入到匹配的元素集合中每个元素前面的HTML字符串、DOM元素、文本节点,或jQuery对象。接受集合中的元素的索引位置作为参数。在此函数内部,this指的是集合中的当前元素。
  • 增补版本:1.10.before( function-html )

    • function-html
      类型:Function( Integer index, String html ) => htmlString or Element or Text or jQuery
      一个函数,返回要插入到匹配的元素集合中每个元素前面的HTML字符串、DOM元素、文本节点,或jQuery对象。接受集合中元素的索引位置以及元素的旧的HTML值作为参数。在此函数内部,this指的是集合中的当前元素。

.before()方法和.insertBefore()方法实施了相同的任务。其主要区别在语法中——特别是,内容和目标的位置。利用.before(),要插入的内容来自于方法的参数:$(target).before(cotentToBeInserted)。另一方面,利用.insertBefore(),内容在方法前面,被插入到目标前面,目标被传递为.insertBefore()方法的参数。

请考虑以下HTML:

1
2
3
4
5
<div class="container">
<h2>Greetings</h2>
<div class="inner">Hello</div>
<div class="inner">Goodbye</div>
</div>

你可以创建内容,并一次性把它插入到若干个元素前面:

1
$( ".inner" ).before( "<p>Test</p>" );

每个<div.inner>元素取得了最新内容:

1
2
3
4
5
6
7
<div class="container">
<h2>Greetings</h2>
<p>Test</p>
<div class="inner">Hello</div>
<p>Test</p>
<div class="inner">Goodbye</div>
</div>

你还可以从网页上选择一个元素,并把它插入到另一个元素前面:

1
$( ".container" ).before( $( "h2" ) );

如果用这种方法选中的元素被插入到DOM中的另一个位置,它会被移去见到目标的前面(而不是克隆过去)。

1
2
3
4
5
<h2>Greetings</h2>
<div class="container">
<div class="inner">Hello</div>
<div class="inner">Goodbye</div>
</div>

重点:然而,如果存在不止一个目标元素,将会针对除了最后一个目标元素之外的目标元素创建被插入元素的副本。

额外的参数

类似于别的内容添加方法,譬如.prepend()方法和.after().before()还支持传入多个参数作为输入。受支持的输入参数包括DOM元素、jQuery对象、HTML字符串以及DOM元素的数组。

例如,下面的代码将在第一个段落前面插入两个新的<div>以及一个已有的<div>

1
2
3
4
5
var newdiv1 = $( "<div id='object1'></div>" ),
newdiv2 = document.createElement( "div" ),
existingdiv1 = document.getElementById( "foo" );
$( "p" ).first().before( newdiv1, [ newdiv2, existingdiv1 ] );

因为.before()可以接受任意个额外参数,可以通过传入三个<div>作为三个分开的参数来实现同样的结果,比如:$( "p" ).first().before( $newdiv1, newdiv2, existingdiv1 )。参数的类型和数目将很大程度上取决于你如何在代码中收集元素。

补充说明:

  • 在jQuery 1.9以前,.before()将试图添加或修改当前jQuery集合中的节点,如果此集合的第一个节点没有连接到文档,那样的话将返回一个新的jQuery集合,而不是原始的集合。此方法可能会返回也可能不会返回一个新结果集,取决于它的参数的数目或连接性。自从jQuery 1.9以来,.after().before().replaceWith()始终返回原始的未经修改的集合。在没有父元素的节点上尝试使用这些方法不会有效果——也就是说,集合与它包含节点都不会有改变。
  • 根据设计,任何接受HTML字符串的jQuery构造函数或方法——jQuery().append().after()等等——都可以潜在地执行代码。通过脚本标签注入或者使用执行代码的HTML特性(例如,<img onload="">)也能发生这种情况。不要使用这些方法来插入来自不可信任的来源的字符串,譬如URL查询参数、cookies,或表单输入。如果那样做的话会导致跨域脚本(XSS)漏洞。在把内容添加到文档之前,请先删除或转义任何用户输入。

示例:

把一些HTML插入到所有段落前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>before demo</title>
<style>
p {
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p> is what I said...</p>
<script>
$( "p" ).before( "<b>Hello</b>" );
</script>
</body>
</html>

演示:

把一个DOM元素插入到所有段落前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>before demo</title>
<style>
p {
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p> is what I said...</p>
<script>
$( "p" ).before( document.createTextNode( "Hello" ) );
</script>
</body>
</html>

演示:

把一个jQuery对象(类似于DOM元素的数组)插入到所有段落前面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>before demo</title>
<style>
p {
background: yellow;
}
</style>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p> is what I said...</p><b>Hello</b>
<script>
$( "p" ).before( $( "b" ) );
</script>
</body>
</html>

演示: