JQuery html() против innerHTML
Могу ли я полностью положиться на JQuery's html()
метод, ведущий себя идентично innerHTML
? Есть ли разница между innerHTML
и JQuery's html()
метод? Если оба метода делают одно и то же, могу ли я использовать jQuery html()
метод вместо innerHTML
?
Моя проблема: я работаю над уже разработанными страницами, страницы содержат таблицы, а в JavaScript innerHTML
свойство используется для их динамического заполнения.
Приложение работает нормально в Firefox, но Internet Explorer выдает ошибку: unknown runtime exception
, Я использовал JQuery's html()
метод и ошибка IE исчезла. Но я не уверен, что это будет работать для всех браузеров, и я не уверен, стоит ли заменить все innerHTML
свойства с JQuery's html()
метод.
Большое спасибо.
8 ответов
Чтобы ответить на ваш вопрос:
.html()
просто позвонит .innerHTML
после выполнения некоторых проверок для nodeTypes и прочего. Он также использует try/catch
блок, где он пытается использовать innerHTML
во-первых, и если это не удастся, то изящно откатится к JQuery .empty()
+ append()
В частности, относительно того, "могу ли я полностью положиться на метод jquery html(), который будет работать как innerHTML", мой ответ НЕТ!
Запустите это в Internet Explorer 7 или 8, и вы увидите.
jQuery выдает неверный HTML при установке HTML, содержащего тег
Если вас интересует функциональность, то jQuery's .html()
выполняет те же функции, что и .innerHTML()
, но он также выполняет проверки совместимости браузера.
По этой причине всегда используйте jQuery's .html()
вместо .innerHTML()
где возможно.
innerHTML не является стандартным и может не работать в некоторых браузерах. Я использовал html() во всех браузерах без проблем.
Учитывая общую поддержку .innerHTML
В наши дни единственная эффективная разница в том, что .html()
выполнит код в любом <script>
теги, если есть какие-либо в HTML, который вы даете. .innerHTML
под HTML5 не будет.
По своему дизайну любой конструктор или метод jQuery, который принимает строку HTML - jQuery(), .append(), .after() и т. Д., - потенциально может выполнять код. Это может произойти путем внедрения тегов скрипта или использования атрибутов HTML, которые выполняют код (например,
<img onload="">
). Не используйте эти методы для вставки строк, полученных из ненадежных источников, таких как параметры запроса URL, файлы cookie или входные данные формы. Это может привести к уязвимости межсайтового скриптинга (XSS). Удалите или удалите любой пользовательский ввод перед добавлением содержимого в документ.
Примечание: оба .innerHTML
а также .html()
может выполнить JS другими способами (например, onerror
атрибуты).
"Этот метод использует свойство innerHTML браузера". - jQuery API
Вот код, который поможет вам начать. Вы можете изменить поведение.innerHTML - вы даже можете создать свой собственный полный.innerHTML. (PS: переопределение.innerHTML также будет работать в Firefox, но не в Chrome - они работают над этим.)
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)
Ключевое отличие состоит в том, что метод jQuery выполняет любые встроенные теги внутри HTML.
Это было ключевым для меня, так как я использовал запрос на выборку, чтобы получитьresponse
в котором был HTML с тегами внутри, как часть модальной работы в WordPress. Это не сработало, и я сузил его до тех, которые, как мне казалось, были идентичными. После того, как консоль зарегистрирует ответ, скопирует его в файл и найдет<script>
Я нашел код, который выполнялся с, а не с.innerHTML
.
Существует также проверка типов, как упоминал jAndy.
Для выполнения сценариев проверьте этот вопрос, связанный с приведенными выше комментариями RedRiderX: как запустить javascript в html, загруженном через ajax.
jQuery.html()
документация, которая не очень полезна для этого нишевого вопроса: https://api.jquery.com/html/