.before( content [, content ] )Возвращает: jQuery
Описание: Вставляет содержимое, заданное параметром, перед каждым элементом в наборе сопоставленных элементов.
-
версия добавлена: 1.0.before( content [, content ] )
- contentСтрока HTML, DOM-элемент, текстовый узел, массив элементов и текстовых узлов или объект jQuery, который нужно вставить перед каждым элементом в наборе сопоставленных элементов.
- contentОдин или несколько дополнительных DOM-элементов, текстовых узлов, массивов элементов и текстовых узлов, строк HTML или объектов jQuery, которые нужно вставить перед каждым элементом в наборе сопоставленных элементов.
-
-
версия добавлена: 1.4.before( function )
- functionФункция, которая возвращает строку HTML, DOM-элемент(ы), текстовый(е) узел(ы) или объект jQuery, которые нужно вставить перед каждым элементом в наборе сопоставленных элементов. Получает индекс позиции элемента в наборе в качестве аргумента. Внутри функции
thisотносится к текущему элементу в наборе.
-
-
версия добавлена: 1.10-and-2.0.before( function-html )
- function-htmlФункция, которая возвращает строку HTML, DOM-элемент(ы), текстовый(е) узел(ы) или объект jQuery, которые нужно вставить перед каждым элементом в наборе сопоставленных элементов. Получает индекс позиции элемента в наборе и старое значение HTML элемента в качестве аргументов. Внутри функции
thisотносится к текущему элементу в наборе.
-
Методы .before() и .insertBefore() выполняют ту же задачу. Основное различие заключается в синтаксисе — в частности, в расположении содержимого и цели. С помощью .before(), содержимое, которое нужно вставить, поступает из аргумента метода: $(target).before(contentToBeInserted). С помощью .insertBefore(), с другой стороны, содержимое предшествует методу и вставляется перед целевым объектом, который, в свою очередь, передается в качестве аргумента метода .insertBefore(): $(contentToBeInserted).insertBefore(target).
Рассмотрим следующий HTML:
<div class="container"> <h2>Greetings</h2> <div class="inner">Hello</div> <div class="inner">Goodbye</div> </div>
Можно создать содержимое и вставить его перед несколькими элементами одновременно:
$( ".inner" ).before( "<p>Test</p>" );
Каждый внутренний <div> элемент получает это новое содержимое:
<div class="container"> <h2>Greetings</h2> <p>Test</p> <div class="inner">Hello</div> <p>Test</p> <div class="inner">Goodbye</div> </div>
Также можно выбрать элемент на странице и вставить его перед другим:
$( ".container" ).before( $( "h2" ) );
Если таким образом выбранный элемент вставляется в одно место в другом месте DOM, он будет перемещен перед целевым объектом (не клонирован):
<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> перед первым абзацем:
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()всегда возвращают исходный неизмененный набор. Попытка использовать эти методы для узла без родителя не оказывает никакого влияния — то есть, ни набор, ни узлы, которые он содержит, не изменяются. - По умолчанию любой конструктор или метод jQuery, который принимает строку HTML — jQuery(), .append(), .after() и т. д. — потенциально может выполнять код. Это может произойти из-за вставки тегов script или использования атрибутов HTML, которые выполняют код (например,
<img onload="">). Не используйте эти методы для вставки строк, полученных из ненадежных источников, таких как параметры запроса URL, куки или входные данные формы. Это может привести к уязвимостям XSS (межсайтовый скриптинг). Удалите или экранируйте любые данные пользователя перед добавлением содержимого в документ.
Примеры:
Вставляет некоторый HTML перед всеми абзацами.
<!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-3.7.0.js"></script>
</head>
<body>
<p> is what I said...</p>
<script>
$( "p" ).before( "<b>Hello</b>" );
</script>
</body>
</html> Демо:
Вставляет DOM-элемент перед всеми абзацами.
<!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-3.7.0.js"></script>
</head>
<body>
<p> is what I said...</p>
<script>
$( "p" ).before( document.createTextNode( "Hello" ) );
</script>
</body>
</html> Демо:
Вставляет объект jQuery (аналогичный массиву DOM-элементов) перед всеми абзацами.
<!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-3.7.0.js"></script>
</head>
<body>
<p> is what I said...</p><b>Hello</b>
<script>
$( "p" ).before( $( "b" ) );
</script>
</body>
</html>