Czy mogę całkowicie polegać na html()
metodzie jQuery zachowującej się identycznie jak innerHTML
? Czy jest jakaś różnica między metodą innerHTML
i jQuery html()
? Jeśli obie te metody robią to samo, czy mogę użyć html()
metody jQuery zamiast innerHTML
?
Mój problem polega na tym, że pracuję na już zaprojektowanych stronach, strony zawierają tabele, aw JavaScript innerHTML
właściwość jest używana do ich dynamicznego wypełniania.
Aplikacja działa poprawnie na Firefox ale Internet Explorer odpala błąd: unknown runtime exception
. Użyłem html()
metody jQuery i błąd IE zniknął. Ale nie jestem pewien, czy zadziała we wszystkich przeglądarkach i nie jestem pewien, czy zastąpić wszystkie innerHTML
właściwości html()
metodą jQuery .
Wielkie dzięki.
Odpowiedzi:
Odpowiedzieć na Twoje pytanie:
.html()
po prostu zadzwoni.innerHTML
po sprawdzeniu typów węzłów i innych rzeczy. Używa równieżtry/catch
bloku, w którym próbuje użyć jakoinnerHTML
pierwszy, a jeśli to się nie powiedzie, z wdziękiem powróci do.empty()
+append()
źródło
innerHTML
bezpośrednio.W szczególności w odniesieniu do „Czy mogę całkowicie polegać na metodzie jquery html (), która będzie działać jak innerHTML”, moja odpowiedź brzmi NIE!
Uruchom to w programie Internet Explorer 7 lub 8, a zobaczysz.
jQuery generuje zły kod HTML podczas ustawiania kodu HTML zawierającego tag <FORM> zagnieżdżony w tagu <P>, gdzie początek ciągu jest znakiem nowej linii!
Jest tutaj kilka przypadków testowych, a komentarze po uruchomieniu powinny być wystarczająco zrozumiałe. Jest to dość niejasne, ale niezrozumienie tego, co się dzieje, jest trochę niepokojące. Mam zamiar zgłosić błąd.
źródło
Jeśli zastanawiasz się nad funkcjonalnością, to jQuery
.html()
wykonuje te same zamierzone funkcje co.innerHTML
, ale sprawdza również zgodność z różnymi przeglądarkami.Z tego powodu zawsze możesz użyć jQuery
.html()
zamiast.innerHTML
tam, gdzie to możliwe.źródło
innerHTML nie jest standardem i może nie działać w niektórych przeglądarkach. Użyłem html () we wszystkich przeglądarkach bez problemu.
źródło
„Ta metoda korzysta z właściwości innerHTML przeglądarki”. - jQuery API
http://api.jquery.com/html/
źródło
Biorąc pod uwagę ogólne wsparcie w
.innerHTML
dzisiejszych czasach, jedyną skuteczną różnicą jest teraz to, że.html()
będzie wykonywał kod w dowolnych<script>
tagach, jeśli są jakieś w podanym html..innerHTML
, Pod HTML5 , nie będzie.Z dokumentacji jQuery :
Uwaga: oba
.innerHTML
i.html()
mogą wykonywać js w inny sposób (np.onerror
Atrybut).źródło
script
tagów z większego fragmentu html. Może potrzebne jest nowe pytanie / odpowiedź?Oto kod na dobry początek. Możesz modyfikować zachowanie .innerHTML - możesz nawet stworzyć własną kompletną podkładkę .innerHTML. (PS: przedefiniowanie .innerHTML będzie działać również w przeglądarce Firefox, ale nie w Chrome - pracują nad tym).
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/
źródło