jQuery this.html () возвращает неопределенное - PullRequest
6 голосов
/ 10 февраля 2012

Я переформатирую действительно плохой HTML, используя jQuery.Мне нужно соединить элементы <font> в одном месте.Я пробовал этот код:

$('font+font').each(function() {
    this.html().appendTo( this.prev() );
    this.remove();
});

, но он выдал мне эту ошибку: Ошибка типа: undefined не является функцией (оценивает this.html ())


Вот пример HTML:

<font>This fragment </font><font>is actually one element.</font>


Обновление

Я обновил свой код с $(this), но это все еще не работает.Когда я запускаю этот код

$('font+font').each(function() {
    $(this).html().appendTo( $(this).prev() );
    $(this).remove();
});

, я получаю эту ошибку: TypeError: 'undefined' не является функцией (вычисляется '$ (this) .html (). AppendTo ($ (this).prev ()) ')

Ответы [ 5 ]

16 голосов
/ 10 февраля 2012
  1. this должен быть заключен в объект jQuery, прежде чем вы сможете использовать методы jQuery для него.
  2. .html() возвращает строку. Вы не можете использовать методы jQuery для строки без переноса. Вместо этого используйте $this.prev().append( $this.html() ).
  3. При использовании $(this) более одного раза целесообразно хранить $(this) во временной переменной. Это соглашение ставит префикс jQuery для объектов со знаком доллара.

Код:

$('font+font').each(function() {
    var $this = $(this);
    $this.prev().append( $this.html() );
    $this.remove();
});
8 голосов
/ 10 февраля 2012

Когда вы используете каждый оператор, он возвращает this как элемент DOM, а не объект jQuery..html() должен вызываться для объекта jQuery.Поэтому первая часть вашего исправления заключается в преобразовании this в элемент jQuery с символом $.

$(this).html(); //don't use this.html();

Вторая проблема заключается в том, что html() возвращает строку.Вы не можете вызвать AppendTo() для строки, только объект jQuery.Поскольку вы работаете с .html(), я предполагаю, что вам нужно содержимое строки, а не полное содержимое.Если бы это было так, ответ Роба был бы более уместным.

this.textContent = $(this).prev().html() + this.textContent; // prepend siblings content

Окончательный код в конечном итоге выглядит так:

$('font+font').each(function() {
    this.textContent = $(this).prev().html() + this.textContent;
    $(this).prev().remove();
});

http://jsfiddle.net/b6vLL37k/1

2 голосов
/ 10 февраля 2012

Вам нужно использовать $(this), а не this

2 голосов
/ 10 февраля 2012

Вам нужно использовать $(this) для jQuery, чтобы помочь вам.

0 голосов
/ 10 февраля 2012

Я не смог исправить ваш код.Как насчет такого:

 var text = '';
 $('font').each(function() {
   text += $(this).text();
 });
 console.log($('<p />').text(text));
...