0

javascript/DOM にデータを保存し、ajax 呼び出しを送信しています。私が行うときの成功および/または.done関数で:

$('#results').html(data);

JavaScript/DOM モデルが破損しますが、そうすると:

var el = document.getElementById('results');
el.innerHTML = data;

その後、すべてが期待どおりに機能します。ここにはあまり情報がないことはわかっていますが、私の質問は、ページの状態に影響を与える可能性のある innerHTML の設定とは別に、jQuery html() が他に何をしているのかということです。

4

2 に答える 2

4

この関数を文字列で使用する主な理由は、メモリ リークやメモリ データの矛盾を防ぐためではhtmlなくinnerHTML、削除された要素にリンクされたイベント ハンドラやその他の jQuery データを削除するためです。

が文字列の場合、 を使用する以外に DOM を「破損」させるdata理由はありません。$('#results').html(data);innerHTML

于 2013-11-07T12:41:42.083 に答える
1

Internet Explorer 9 以前では、DOM のテーブルは読み取り専用でした。つまり、実行しようとすると、TBODY、TR などのel.innerHTML = newHTML;場合にスローされるエラーが発生します。jQuery関数は、フォールバック メソッド ( jQuery ソース内) を使用してそのケースを処理し、すべてに対して同じコードを使用できるようにします。バージョンに関係なく、ブラウザの。el.html()this.empty().append(value)

jQuery ソースのメソッドのコードを確認する価値があるかもしれません。

html : function (value) {
    return jQuery.access(this, function (value) {
        var elem = this[0] || {},
        i = 0,
        l = this.length;

        if (value === undefined) {
            return elem.nodeType === 1 ?
            elem.innerHTML.replace(rinlinejQuery, "") :
            undefined;
        }

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

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

            try {
                for (; i < l; i++) {
                    // Remove element nodes and prevent memory leaks
                    elem = this[i] || {};
                    if (elem.nodeType === 1) {
                        jQuery.cleanData(getAll(elem, false));
                        elem.innerHTML = value;
                    }
                }

                elem = 0;

                // If using innerHTML throws an exception, use the fallback method
            } catch (e) {}
        }

        if (elem) {
            this.empty().append(value);
        }
    }, null, value, arguments.length);
}
于 2013-11-07T12:51:17.030 に答える