Переместить закрывающий тег </a> в конец содержащего элемента

Я пытаюсь получить ссылку для обтекания всего текста в div. Я могу найти решения только тогда, когда вы полностью перемещаете определенные элементы DOM или перемещаете другие элементы в элемент.

текущая ситуация:

<div class = "text">
    <a href = "link">text</a> and more text
</div>

желаемая ситуация:

<div class = "text">
    <a href = "link">text and more text</a>
</div>

К сожалению, я не могу изменить разметку, поэтому мне приходится что-то делать с jQuery.

Вы заботитесь о пробеле между </a> и </div>?

Bergi 24.12.2018 14:31

Возможно ли разместить два <a> в одном div? Что должно произойти в таком случае? Я заметил, что ни один из ответов не учитывает нескольких братьев и сестер, и единственное предлагаемое исправление (while (this.nextSibling)) в конечном итоге приведет к вложению одноуровневых <a>.

11684 24.12.2018 16:36

Вы хотите, чтобы в </a> были добавлены только текстовые узлы, следующие за вашим <a>? Что будет, если есть другие элементы? Изменится ли это в зависимости от типа элемента (например, хотите ли вы сделать что-то другое с <b> по сравнению с <div>)? Что, если дополнительные элементы имеют действия щелчка по умолчанию (например, другой <a>)? Вы хотите сохранить какие-либо существующие прослушиватели событий и / или ссылки на перемещаемые узлы?

Makyen 24.12.2018 20:52

Вы уверены, что тег a является firstElementChilddiv? Ваша цель - изменить DOM или просто сделать весь div интерактивным? И, самое главное, что вы на самом деле пробовали до сих пор?

Shaggy 24.12.2018 22:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
17
4
1 080
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Сначала вы можете получить HTML-код внутри div с классом text, а затем заменить закрывающий тег </a> на '', а затем, наконец, добавить закрывающий тег </a> к замененной строке, чтобы получить то, что вы ожидаете:

var aHTML = $('.text').html();
aHTML = aHTML.trim().replace(/</a>/, '') + '</a>';
$('.text').html(aHTML);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "text">
    <a href = "link">text</a> and more text
 </div>
Ответ принят как подходящий

Вам нужно использовать .append( function ), чтобы вставить в него nextSibling привязки.

$(".text a").append(function(){
  return this.nextSibling
});

$(".text a").append(function(){
  return this.nextSibling
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "text">
  <a href = "link">text</a> and more text
</div>

Также вы можете использовать .html( function ) вместо этого, а затем удалить следующего брата с помощью .remove()

$(".text a").html(function(i, h){
  return h + this.nextSibling.nodeValue;
})[0].nextSibling.remove();

Или в одна линия используя ES6

$(".text a").html((i,h) => h+this.nextSibling.nodeValue)[0].nextSibling.remove();

$(".text a").html(function(i, h){
  return h + this.nextSibling.nodeValue;
})[0].nextSibling.remove();
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "text">
  <a href = "link">text</a> and more text
</div>

Или используя чистый javascript

var ele = document.querySelector(".text a");
ele.innerHTML += ele.nextSibling.nodeValue;
ele.nextSibling.remove();

var ele = document.querySelector(".text a");
ele.innerHTML += ele.nextSibling.nodeValue;
ele.nextSibling.remove();
<div class = "text">
  <a href = "link">text</a> and more text
</div>

Близко, но innerHTML лучше не перезаписывать.

dfsq 24.12.2018 09:40

Зачем помещать этот оператор присваивания в строку return, если он не имеет ничего общего с return, за которым следует запятая, а затем фактическое возвращаемое значение? Плохой и запутанный стиль, если вы спросите меня.

Peter B 24.12.2018 09:44

@PeterB Он возвращает h+text из-за оператора запятой. Но вы правы, разбивать две строки кода в одну с помощью запятой - не лучший стиль.

dfsq 24.12.2018 09:46

Поскольку вы изменяете innerHTML / .html() напрямую, это отключит все прослушиватели событий, которые есть в существующем контенте, и сделает недействительными любые ссылки на существующий контент. Это может нарушить функциональность страницы и / или привести к сбою другого JavaScript и / или возникновению исключений. Если вы не знать, что изменение innerHTML / .html() допустимо, этого следует избегать, когда это возможно / разумно.

Makyen 24.12.2018 20:46

Избегайте возиться с html напрямую, лучше не менять и не перезаписывать. Все, что вам нужно сделать, это взять следующий текстовый родственный узел Node и добавить его к предыдущему a:

$('.text a').each(function() {
  $(this).append(this.nextSibling)
})
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class = "text">
  <a href = "link">text</a> and more text
</div>

При необходимости вы можете проверить, является ли следующий узел TextNode, если вам нужно пропустить узлы элементов:

if (this.nextSibling.nodeType === 3) {
  $(this).append(this.nextSibling)
}

Для полноты картины понадобится шлейф while(node.nextSibling) ....

Salman A 24.12.2018 15:19

HTML / JavaScript не работает таким образом, чтобы вы могли «переместить» закрывающий тег подобным образом, но вы можете переместить текст. Кроме того, для этого вам не нужен jQuery; это очень просто сделать с ванильным JavaScript:

let link = document.querySelector('.text a')
let textAfterLink = link.nextSibling
link.appendChild(textAfterLink)
<div class = "text">
  <a href = "link">text</a> and more text
</div>

Здесь у вас есть один подход, который найдет весь текст развернутый внутри элемента с классом .text и присоединит все эти тексты к первому дочернему элементу <a>. В этом подходе используется метод содержание(), связанный с фильтр(), с использованием условия addequated для удаления дочерних текстов, в то же время они добавляются к элементу <a>.

$('.text').each(function()
{
    $(this).contents().filter(function()
    {
        // Filter text type only.
        return (this.nodeType === 3);
    })
    .appendTo($(this).find("a:first-child"));
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class = "text">
    <a href = "link">text</a> and more text
</div>

<hr>

<div class = "text">
  <a href = "link">Rise up this morning</a>
  Smile with the rising sun
  <br>
  Three little birds
  <br>
  Pitched by my doorstep
  <br>
  <p>DON'T TOUCH THIS ONE!</p>
  Singing sweet songs
  <br>
  Of melodies pure and true
  <br>
  Sayin': This is my message to you
  <br>
  Saying, don't worry about a thing
  <br>
  'Cause every little thing
  <br>
  Gonna be all right
</div>

Другие вопросы по теме