Почему проблемы .innerHTML не являются проблемой при использовании JQuery (). Html ()? - PullRequest
3 голосов
/ 12 апреля 2011

Я обработал любой отдельный экземпляр document.getElementById("MyID").innerHTML = "A value" в этом руководстве по мировым часам Javascript, заставляющему Wordpress Admin не загружаться полностью и нарушающему различные области интерфейса администратора Wordpress.

Я решил это, заменив каждый экземпляр на jQuery("#MyID").html("A value")), который работает нормально. Что вызывает .innerHTML сбои, но не JQuery().html()?

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

В предположении я бы заподозрил либо материал, специфичный для браузера, либо document.getElementById("MyID") возвращает ноль, вызывая исключение.

0 голосов
/ 12 апреля 2011

О единственной разнице между тем, что вы пробовали, и тем, что может сделать html-метод jQuery - это удаление содержимого элемента перед вставкой нового содержимого.Поэтому попробуйте сначала удалить содержимое, и, если вы только вставляете простой текст, создайте и вставьте текстовый узел вместо установки innerHTML.

Итак:

function replaceContent(id, s) {
  var el = document.getElementById(id);
  if (el) {
    while (el.firstChild) {
      el.removeChild(el.firstChild);
    }
    el.appendChild(document.createTextNode(s));
  }
}
0 голосов
/ 12 апреля 2011

Вероятно, это важная часть источника jQuery:

try {
    for ( var i = 0, l = this.length; i < l; i++ ) {
        // Remove element nodes and prevent memory leaks
        if ( this[i].nodeType === 1 ) {
            jQuery.cleanData( this[i].getElementsByTagName("*") );
            this[i].innerHTML = value;
        }
    }

    // If using innerHTML throws an exception, use the fallback method
} catch(e) {
    this.empty().append( value );
}

Обратите внимание, что он обрабатывает выданные исключения.

Убедитесь сами в 1.5.2 .

0 голосов
/ 12 апреля 2011

Вот как это делает jQuery:

html: function( value ) {
    if ( value === undefined ) {
        return this[0] && this[0].nodeType === 1 ?
            this[0].innerHTML.replace(rinlinejQuery, "") :
            null;

    // See if we can take a shortcut and just use innerHTML
    } else if ( typeof value === "string" && !rnocache.test( value ) &&
        (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
        !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {

        value = value.replace(rxhtmlTag, "<$1></$2>");

        try {
            for ( var i = 0, l = this.length; i < l; i++ ) {
                // Remove element nodes and prevent memory leaks
                if ( this[i].nodeType === 1 ) {
                    jQuery.cleanData( this[i].getElementsByTagName("*") );
                    this[i].innerHTML = value;
                }
            }

        // If using innerHTML throws an exception, use the fallback method
        } catch(e) {
            this.empty().append( value );
        }

    } else if ( jQuery.isFunction( value ) ) {
        this.each(function(i){
            var self = jQuery( this );

            self.html( value.call(this, i, self.html()) );
        });

    } else {
        this.empty().append( value );
    }

    return this;
},
...