2010-06-13 3 views

ответ

11

Я удалил # из ID, так как он не является допустимым символом идентификатора.

Учитывая, что, попробуйте следующее:

Живой пример:http://jsfiddle.net/u49wy/

var $contents = $('#alvin').contents(); 

$contents[$contents.length - 1].nodeValue = 'orange'; 

.contents() возвращает все дочерние узлы элемента, в том числе текстовые узлы.

Код затем захватывает последний элемент (который является текстовым узлом) и обновляет его nodeValue, то есть как вы обновляете значение текстового узла.

+0

+1, вы избили меня, хотя я все еще разместил свое решение, потому что оно немного отличается :-) –

+0

@ Andy - Спасибо за +. Да, мой работает с предположением о конкретном позиционировании. Это будет подбрасывать в зависимости от конкретных потребностей OP. – user113716

+0

Спасибо! Я знал, что это можно сделать. Хотелось бы, чтобы я мог присудить множество решений, таких как E * -E * .com (тоже Энди). –

6

патрик опередил меня, но мое решение немного более динамичным в том, что он будет выбрать текст в любом месте, даже если были метки с обеих сторон:

$('#alvin').contents().filter(function() { 
    return this.nodeType == 3; 
})[0].nodeValue = "orange"; 

Он делает это путем фильтрации содержимого, так что остаются только текстовые узлы, а первый nodeValue изменяет на «оранжевый».

http://jsfiddle.net/ssRyB/

+0

Спасибо! Хотел бы я наградить несколькими решениями, такими как E * -E * .com. –

1

id="#alvin" не действует синтаксис, '#' используется как часть селектора для JQuery или в CSS.

Для этого очень ограниченного примера замените «яблоко» на «оранжевый», я бы просто прочитал innerHTML и переписал его. Я даже не использую jQuery для этого.

window.onload = function() { 
    var alvin = document.getElementById('alvin') 
    alvin.innerHTML = alvin.innerHTML.replace('apple', 'orange'); 
} 

Я не использовал jQuery, потому что у jQuery нет чистого способа выбора шальных текстовых узлов. Итак, что, если мы обернули любые дочерние текстовые узлы в промежутках? Мы могли бы сделать это:

$('#alvin').contents().filter(function() { 
    return this.nodeType == 3; 
}).wrap('<span></span>').end(); 

Таким образом, мы остались со структурой:

<a id="alvin" href="http://www.camille.com"><ins class="xxx">Anna</ins><span>apple</span></a> 

Тогда мы можем использовать прилегающую селектор +, чтобы получить на него, как это - ins+span означает <span> после <ins>:

var elem = $('#alvin ins+span'); 
elem.text(elem.text().replace('apple', 'orange')); 
+0

Не много jQuery там ...;) –

+0

Да, я тоже был не очень доволен своим ответом. Я добавил второй подход. – artlung

+0

Я исправил синтаксис; благодаря! –

0

Другой способ (не очень красиво, хотя):

$("#alvin").html($("#alvin").html().replace(/apple$/,'orange')); 

Редактировать: Добавлено $ в конце яблока. Спасибо, Патрик.

+1

Фактически это не будет работать с закрывающим тегом 'a', поскольку он не является частью содержимого' # alvin'. Метод '.html()' возвращает только внутренний HTML-контент. Не какая-либо часть набора тегов, соответствующая селектору. Тем не менее, вы можете использовать конец индикатора ввода '$'. :) – user113716

Смежные вопросы