Изменения в jQuery внутреннего текста, но сохранить в формате HTML



Я хотел бы изменить текст HTML-элемента, но сохранить остальную часть внутреннего html с помощью jQuery.



например:



<a href="link.html">Some text <img src="image.jpg" /></a> 


заменить "Некоторый текст" на "другой текст", и результат должен выглядеть так:



<a href="link.html">Other text <img src="image.jpg" /></a> 


изменить:
Мое текущее решение заключается в следующем:



var aElem = $('a');
var children = aElem.children();

aElem.text("NEW TEXT");
aElem.append(children);


но должен быть какой-то более элегантный способ сделать это.

302   14  

14 ответов:

Это, кажется, работает просто отлично.

Демо

<html>
    <head>
    </head>
    <body>
        <a href="link.html">Some text <img src="img.jpg" /></a>
    </body>

    </html>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            var $link = $('a');
            var $img = $link.find('img'); 
            $link.html('New Text');
            $link.append($img);
        });
    </script>

Так как вы не можете изменить ссылку вариант будет просто использовать replace

$("a").html($("a").html().replace("Some text", "Other text"));

пример jsfiddle.

обернуть текст, который вы хотите изменить в течение

<a href="link.html"><span>Some text</span> <img src="image.jpg" /></a> 

$('a span').html( 'new text' );

мое решение, хотя и немного запоздало.

$('a').each(function() {
    var contents = $(this).contents();
    if (contents.length > 0) {
        if (contents.get(0).nodeType == Node.TEXT_NODE) {
            $(this).html('NEW TEXT').append(contents.slice(1));
        }
    }
});

некоторые замечания:

  1. contents() включает в себя текстовые узлы, в отличие от children().
  2. необходимо создать скопировать содержимое через var contents = ... или же остальные элементы теряются навсегда после замены на $(this).html('NEW TEXT').
  3. The length регистрация необязательна, но рекомендуется.
  4. The nodeType регистрация необязательна, но рекомендуется.

альтернативным способом было бы использовать contents() метод следующим образом:

дано

<a href="link.html">Some text <img src="image.jpg" /></a>

вы можете заменить 'Some text' С помощью jQuery

var text = $('a').contents().first()[0].textContent;
$('a').contents().first()[0].textContent = text.replace("Some text", "Other text");

пример jsFiddle здесь.

идея contents() был вдохновлен этой вопрос, на который ответил пользователь charlietfl.

эффективный и надежный способ, который не требует от вас знать, что такое внутренние элементы или что такое текст:

var $a = $('a');
var inner = '';
$a.children.html().each(function() {
    inner = inner + this.outerHTML;
});
$a.html('New text' + inner);

вы можете изменить его .содержание()

$('.yourElement').contents()[0].data = 'New Data';

где в вашем случае "[0].данных"

попробуйте этот код

$('a').live('click', function(){
    var $img = $(this).find('img'); 
    $(this).text('changed');
    $(this).append($img);
});

вам нужно будет добавить в <span> элемент и изменить текст этого элемента, например:

<a href="link.html"><span id="foo">Some text</span><img src="image.jpg" /></a>

затем, вы можете позвонить в jQuery:

$("#foo").html("Other text");

и ваш результат будет эффективно быть:

<a href="link.html"><span id="foo">Other text</span><img src="image.jpg" /></a>

это улучшение, которое я сделал в jquery.единая библиотека. В частности,

я добавил функцию jQuery для этой потребности.

возможно, Вам потребуется преобразовать html-сущности в текстовое представление, поэтому я добавил

моя общая версия:

let button = $('#yourElement');
button.html(button.html().replace(button[0].innerText, "New Text"));

Стенография для большего количества элементов и ведущего текста для изменения:

elemshtml = '';
$("a *").each(function(){elemshtml +=$(this)[0].outerHTML});
$("a").html('Some text' + elemshtml);

просто используйте некоторые простые функции js:

$('a') [0].возвращение null.nodeValue = "новый текст";

Comments

    Ничего не найдено.