#jquery #html #html-parsing
#jquery #HTML #html-синтаксический анализ
Вопрос:
Есть ли какая-либо причина, по которой я бы использовал $('<div></div>')
вместо $('<div>')
?
Или $('<div><b></b></div>')
вместо $('<div><b>')
?
Мне нравится последнее в обоих случаях, потому что оно короче.
Ответ №1:
jQuery автоматически закрывает теги за вас, нет необходимости закрывать его самостоятельно.
$('<div>')
это совершенно правильная вещь
Однако во втором случае вы добавляете то, <b>
что я бы сделал:
$('<div>',{html: $('<b>')}); // or $('<div>').append($('<b>'))
Комментарии:
1. Я согласен с этим
$('<div>',{html: $('<b>')})
до определенного момента… когда вы начинаете вкладывать эти вещи глубиной более 4 уровней, ваши глаза начинают кровоточить. Но это действительно кажется более ОО2. lol итак, вы определяете это в переменных, никогда не говорил, что лучше всего делать все встроенным, что я и сделал.
3. @Neal да, это то, что я делаю, но когда я не добавляю классы, атрибуты и т.д., Я просто использую str8
$('<div><b></b></div>')
4. Попробуйте jsfiddle.net/ADNjv это читается более естественно 🙂 меньше пробелов и скобок !
5. @охотник или просто сделай:
$('<div>').append($('<b>'))
Ответ №2:
Я обнаружил крайние случаи в IE, когда мой код был волшебным образом исправлен с помощью $("<div></div>")
вместо $("<div>")
. Я всегда делаю это из паранойи.
Я уверен, что в какой-то момент в документах jQuery специально сказано, что вы должны закрыть все свои теги. Это больше не относится к версии 1.6, но если вы используете 1.3.2 или 1.4.2, вы можете захотеть закрыть их для обеспечения безопасности.
Хотя, если вы посмотрите на исходный код, у меня возникнет соблазн, что для простых тегов это совершенно безопасно. Будьте осторожны, что для сложных тегов или тегов с атрибутами, используемыми исходным кодом .innerHTML
, поэтому я настоятельно рекомендую вам передавать правильно закрытые теги.
Источник
var rsingleTag = /^<(w )s*/?>(?:</1>)?$/;
...
// If a single string is passed in and it's a single tag
// just do a createElement and skip the rest
ret = rsingleTag.exec(selector);
if (ret) {
if (jQuery.isPlainObject(context)) {
selector = [document.createElement(ret[1])];
jQuery.fn.attr.call(selector, context, true);
} else {
selector = [doc.createElement(ret[1])];
}
} else {
ret = jQuery.buildFragment([match[1]], [doc]);
selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
}
В этом случае с помощью $("<div>")
вы обнаружите, что ret[1]
это «div», поэтому он вызывает document.createElement("div")
.
Комментарии:
1. Примером, с которым я столкнулся, было:
$('<span class="manip_link" href="#" onClick="return false;">').text('[remove]');
Это не отображалось в Internet Explorer 6, 7 или 8. Одним из способов заставить его работать в IE было превратить его в «самозакрывающийся тег», сказав... false;" />
.
Ответ №3:
Это зависит от того, используете ли вы один тег или несколько тегов для создания элемента / elements.
Если вы используете один тег, jQuery будет использовать document.createElement
метод для создания элемента, поэтому не имеет значения, используете ли вы "<div/>"
или "<div></div>"
.
Если у вас есть несколько элементов, jQuery создаст элементы, создав div
элемент и поместив HTML-код в innerHTML
свойство. Чтобы заставить браузер правильно анализировать HTML-код, вы должны написать его в соответствии с используемой вами версией HTML. Если вы используете XHTML для страницы, HTML-код, который вы используете для создания элементов, также должен быть XHTML.
Ответ №4:
jQuery сделает это за вас, но подумайте о написании правильного HTML для лучшей читаемости (первый в вопросе) 🙂