jQuery: риск не закрывать теги в конструкторах

#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>')) 
  

Скрипта:http://jsfiddle.net/maniator/m9wbb /

Комментарии:

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 для лучшей читаемости (первый в вопросе) 🙂