JQuery HTML () बनाम इनर। Html


81

क्या मैं jQuery की html()विधि पर पूरी तरह से भरोसा कर सकता हूं जो समान है innerHTML? क्या innerHTMLjQuery की html()विधि के बीच कोई अंतर है ? यदि ये विधियाँ दोनों समान हैं, तो क्या मैं jQuery की html()विधि का उपयोग कर सकता हूँ innerHTML?

मेरी समस्या यह है: मैं पहले से ही डिज़ाइन किए गए पृष्ठों पर काम कर रहा हूं, पृष्ठों में टेबल हैं और जावास्क्रिप्ट में innerHTMLसंपत्ति को गतिशील रूप से आबाद करने के लिए उपयोग किया जा रहा है।

आवेदन फ़ायरफ़ॉक्स पर ठीक काम कर रहा है, लेकिन इंटरनेट एक्सप्लोरर एक त्रुटि आग unknown runtime exception:। मैंने jQuery की html()विधि का उपयोग किया है और IE की त्रुटि गायब हो गई है। लेकिन मुझे यकीन नहीं है कि यह सभी ब्राउज़रों के लिए काम करेगा और मुझे यकीन नहीं है कि सभी innerHTMLगुणों को jQuery की html()विधि के साथ बदलना है या नहीं ।

बहुत बहुत धन्यवाद।


9
jQuery के html () का उपयोग करें। मुझे कई मौकों पर इनर HTML से समस्याएँ हुईं। और html () सभी ब्राउज़रों पर काम करेगा।
Glavić

जवाबों:


118

तुम्हारे प्रश्न का उत्तर देने के लिए:

.html()केवल .innerHTMLनोडटाइप और सामान के लिए कुछ जांच करने के बाद कॉल करेंगे । यह एक try/catchब्लॉक का भी उपयोग करता है जहां यह innerHTMLपहले उपयोग करने की कोशिश करता है और यदि वह विफल रहता है, तो यह jQuery के .empty()+ पर सुंदर रूप से वापस आ जाएगाappend()


13
ध्यान दें कि इंटरनेट एक्सप्लोरर 8 (और शायद सबसे पहले) के अतिरिक्त चेक बड़े आवेषण के लिए एक महत्वपूर्ण प्रदर्शन हिट जोड़ सकते हैं, इसलिए यदि IE पर प्रदर्शन महत्वपूर्ण है तो आप innerHTMLसीधे उपयोग करने पर विचार कर सकते हैं।
११

3
एक संक्षिप्त प्रदर्शन तुलना: jsperf.com/innerhtml-vs-html-vs-empty-append
thdoan

17

विशेष रूप से "क्या मैं jquery html () विधि पर पूरी तरह भरोसा कर सकता हूं कि यह आंतरिक HTML जैसा प्रदर्शन करेगा" मेरा जवाब नहीं है!

इसे इंटरनेट एक्सप्लोरर 7 या 8 में चलाएं और आप देखेंगे।

jQuery खराब HTML का निर्माण करता है जब HTML की स्थापना एक <FORM> टैग के साथ होती है जो <P> टैग में निहित होता है जहां स्ट्रिंग की शुरुआत एक नई रेखा होती है!

यहां कई परीक्षण मामले हैं और जब टिप्पणी चलती है तो पर्याप्त रूप से आत्म व्याख्यात्मक होनी चाहिए। यह काफी अस्पष्ट है, लेकिन समझ में नहीं आ रहा है कि क्या हो रहा है। मैं एक बग रिपोर्ट दर्ज करने जा रहा हूं।

<html>

    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>   

        <script>
            $(function() {

                // the following two blocks of HTML are identical except the P tag is outside the form in the first case
                var html1 = "<p><form id='form1'><input type='text' name='field1' value='111' /><div class='foo' /><input type='text' name='field2' value='222' /></form></p>";
                var html2 = "<form id='form1'><p><input type='text' name='field1' value='111' /><div class='foo' /><input type='text' name='field2' value='222' /></p></form>";

                // <FORM> tag nested within <P>
                RunTest("<FORM> tag nested within <P> tag", html1);                 // succeeds in Internet Explorer    
                RunTest("<FORM> tag nested within <P> tag with leading newline", "\n" + html1);     // fails with added new line in Internet Explorer


                // <P> tag nested within <HTML>
                RunTest("<P> tag nested within <FORM> tag", html2);                 // succeeds in Internet Explorer
                RunTest("<P> tag nested within <FORM> tag with leading newline", "\n" + html2);     // succeeds in Internet Explorer even with \n

            });

            function RunTest(testName, html) {

                // run with jQuery
                $("#placeholder").html(html);
                var jqueryDOM = $('#placeholder').html();
                var jqueryFormSerialize = $("#placeholder form").serialize();

                // run with innerHTML
                $("#placeholder")[0].innerHTML = html;

                var innerHTMLDOM = $('#placeholder').html();
                var innerHTMLFormSerialize = $("#placeholder form").serialize();

                var expectedSerializedValue = "field1=111&field2=222";

                alert(  'TEST NAME: ' + testName + '\n\n' +
                    'The HTML :\n"' + html + '"\n\n' +
                    'looks like this in the DOM when assigned with jQuery.html() :\n"' + jqueryDOM + '"\n\n' +
                    'and looks like this in the DOM when assigned with innerHTML :\n"' + innerHTMLDOM + '"\n\n' +

                    'We expect the form to serialize with jQuery.serialize() to be "' + expectedSerializedValue + '"\n\n' +

                    'When using jQuery to initially set the DOM the serialized value is :\n"' + jqueryFormSerialize + '\n' +
                    'When using innerHTML to initially set the DOM the serialized value is :\n"' + innerHTMLFormSerialize + '\n\n' +

                    'jQuery test : ' + (jqueryFormSerialize == expectedSerializedValue ? "SUCCEEDED" : "FAILED") + '\n' +
                    'InnerHTML test : ' + (innerHTMLFormSerialize == expectedSerializedValue ? "SUCCEEDED" : "FAILED") 

                    );
            }

        </script>
    </head>

    <div id="placeholder">
        This is #placeholder text will 
    </div>

</html>

मुझे लगता है कि यह बग रिपोर्ट मुझे यह बताने के रूप में वापस आई कि मेरे पास अमान्य HTML था जिसे <P> टैग में अनुमति दी गई थी - या ऐसा कुछ। यह काफी समय पहले था इसलिए मुझे यकीन नहीं है कि कुछ भी बदल गया है, लेकिन यह अभी भी 3 साल बाद बढ़ रहा है इसलिए अगर किसी को कुछ भी जोड़ना है तो कृपया टिप्पणी जोड़ें
Simon_Weaver

यह अभी भी IE9 में है, बस उसी के साथ प्रयास करें: $ ("शरीर")। Html ("<p> <form> <div> देखें कि मैंने वहाँ क्या किया? </ Div> </ form> </ p>" );
सुपरजादेह

8

यदि आप कार्यक्षमता के बारे में सोच रहे हैं, तो jQuery के .html()रूप में एक ही इरादा कार्यक्षमता करता है .innerHTML, लेकिन यह क्रॉस-ब्राउज़र संगतता के लिए चेक भी करता है।

इस कारण से, आप हमेशा jQuery है उपयोग कर सकते हैं .html()के बजाय .innerHTMLजहां संभव हो।


2
इनरएचटीएमएल दस्तावेज़ / तत्व संपत्ति पर एक संपत्ति है और एक विधि नहीं है।
सतीश एन रामटेयरे

6

भीतरी HTML मानक नहीं है और कुछ ब्राउज़रों में काम नहीं कर सकता है। मैंने बिना किसी समस्या के सभी ब्राउज़र में html () का उपयोग किया है।


3
: अब यह मानक है (समय प्रश्न पूछा गया था के बारे में पता नहीं है) domparsing.spec.whatwg.org/#innerhtml
ग्रिफिन


3

इन दिनों के सामान्य समर्थन को.innerHTML देखते हुए , अब एकमात्र प्रभावी अंतर यह है कि किसी भी टैग में कोड निष्पादित.html() करेगा यदि आपके द्वारा दिए गए html में कोई भी है। , एचटीएमएल 5 के तहत<script>.innerHTML , नहीं होगा।

से jQuery डॉक्स :

डिज़ाइन द्वारा, कोई भी jQuery कन्स्ट्रक्टर या विधि जो HTML स्ट्रिंग - jQuery (), .append (), .after (), आदि को स्वीकार करता है - संभवतः कोड निष्पादित कर सकता है। यह स्क्रिप्ट टैग के इंजेक्शन या HTML विशेषताओं का उपयोग करके हो सकता है जो कोड निष्पादित करते हैं (उदाहरण के लिए, <img onload="">)। अविश्वसनीय तरीकों से प्राप्त स्ट्रिंग्स को सम्मिलित करने के लिए इन विधियों का उपयोग न करें, जैसे कि URL क्वेरी पैरामीटर, कुकीज़ या फॉर्म इनपुट। ऐसा करने से क्रॉस-साइट-स्क्रिप्टिंग (XSS) कमजोरियों का परिचय हो सकता है। दस्तावेज़ में सामग्री जोड़ने से पहले किसी भी उपयोगकर्ता इनपुट को निकालें या उससे बच जाएं।

नोट: दोनों .innerHTMLऔर .html()जे एस अन्य तरीकों (जैसे निष्पादित कर सकते हैं onerrorविशेषता)।


बहुत ही रोचक। तो हम HTML5 को डालने पर मजबूर कैसे कर सकते हैं <स्क्रिप्ट> टैग डालने पर?
ऐजक्वियर

यह थोड़ा पुराना है लेकिन मुझे अभी भी लगता है कि एक और उत्तर का समाधान आज अच्छी तरह से काम करेगा। यदि आप jQuery का उपयोग कर रहे हैं, तो आप निश्चित रूप से सिर्फ .html () का उपयोग कर सकते हैं।
RedRiderX

अब जब मैं इसे फिर से देखता हूं, तो यह जवाब scriptएक बड़े HTML टुकड़े से बाहर टैग लगाने के चरण को याद करता है । शायद एक नया प्रश्न / उत्तर क्रम में है?
RedRiderX

0

आपको शुरू करने के लिए यहां कुछ कोड दिए गए हैं। आप .innerHTML के व्यवहार को संशोधित कर सकते हैं - आप अपना स्वयं का .innerHTML शिम भी बना सकते हैं। (पुनश्च: पुनर्परिभाषित .innerHTML फ़ायरफ़ॉक्स में भी काम करेगा, लेकिन क्रोम नहीं - वे इस पर काम कर रहे हैं।)

if (/(msie|trident)/i.test(navigator.userAgent)) {
 var innerhtml_get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").get
 var innerhtml_set = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerHTML").set
 Object.defineProperty(HTMLElement.prototype, "innerHTML", {
  get: function () {return innerhtml_get.call (this)},
  set: function(new_html) {
   var childNodes = this.childNodes
   for (var curlen = childNodes.length, i = curlen; i > 0; i--) {
    this.removeChild (childNodes[0])
   }
   innerhtml_set.call (this, new_html)
  }
 })
}

var mydiv = document.createElement ('div')
mydiv.innerHTML = "test"
document.body.appendChild (mydiv)

document.body.innerHTML = ""
console.log (mydiv.innerHTML)

http://jsfiddle.net/DLLbc/9/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.