taking a look into the jQuery library, the following is the relevant section from v2.2.0 line 2827.
init = jQuery.fn.init = function(selector, context, root) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
if (!selector) {
return this;
}
// Method init() accepts an alternate rootjQuery
// so migrate can support jQuery.sub (gh-2101)
root = root || rootjQuery;
// Handle HTML strings
if (typeof selector === "string") {
if (selector[0] === "<" &&
selector[selector.length - 1] === ">" &&
selector.length >= 3) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [null, selector, null];
} else {
match = rquickExpr.exec(selector);
}
// Match html or make sure no context is specified for #id
if (match && (match[1] || !context)) {
// HANDLE: $(html) -> $(array)
if (match[1]) {
context = context instanceof jQuery ? context[0] : context;
// Option to run scripts is true for back-compat
// Intentionally let the error be thrown if parseHTML is not present
jQuery.merge(this, jQuery.parseHTML(
match[1],
context && context.nodeType ? context.ownerDocument || context : document,
true
));
// HANDLE: $(html, props)
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
for (match in context) {
// Properties of context are called as methods if possible
if (jQuery.isFunction(this[match])) {
this[match](context[match]);
// ...and otherwise set as attributes
} else {
this.attr(match, context[match]);
}
}
}
return this;
You will see that it checks if the selector is a string
, and if it does then see's if it starts with <
and ends with >
.
if (typeof selector === "string") {
if (selector[0] === "<" &&
selector[selector.length - 1] === ">" &&
selector.length >= 3) {
Then, having in mind the regex rsingleTag
being:-
var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
Which matches both "<div>"
and "<div />"
, returning div
as group[1]
.
The parseHTML
uses that to return a div
element, in the merge
:-
jQuery.parseHTML = function( data, context, keepScripts ) {
...
var parsed = rsingleTag.exec( data );
// Single tag
if ( parsed ) {
return [ context.createElement( parsed[ 1 ] ) ];
}
then using the regex again, and context
as your object for setting the properties:-
// HANDLE: $(html, props)
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
it for
's over each property setting with this.attr(match, context[match]);
So, at the end it's wrong to use one of the first two options for a
div?
As above shows, its personal preference. Both work the same.