3-9课,第4分50秒是不是讲错了?类似$('<div></div>')表达式返回的应该是一个jquery对象吧?
来源:
杨洋1989
2016-06-15
另外,老师你这样的写法$('<div>')是不是不太规范,w3c文档上要求标签闭合的,你写的基本都没闭合。
写回答
1回答
-
同学你的观察很仔细,w3c 的确是要求标签闭合。
但是 Jquery 并不是这样要求的。我们只要写了合适的字符串,Jquery 会自动帮我们创建一个DOM对象。
以下的写法,都是允许的,返回都复合「预期」
$('<div>') // [ <div></div> ] $('<div id="test">') // [ <div id="test"></div> ] $('<div id="test2">some text </div>') // [ <div id="test2">some text</div> ]
以下的写法,不合理,但也能正确返回
$('<div></a>') // [ <div></div> ] $('<div>test</a>') // [ <div>test</div> ]
认真来说,要探究为什么为这样,我们需要去看看Jquery的源代码,我随便找了一个版本的。 http://libs.baidu.com/jquery/2.1.4/jquery.js
摘出了跟这个问题有关的关键部分:
// jquery 入口函数 jQuery.fn.init = function( selector, context ) { // 判断是否 类似 < ... > 这样的字符 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 ]; // 满足条件后,进行 jQuery.parseHTML // 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 ) ); // 把字符串转换为一个 DOM 对象 // keepScripts (optional): If true, will include scripts passed in the html string jQuery.parseHTML = function( data, context, keepScripts ) { if ( !data || typeof data !== "string" ) { return null; } if ( typeof context === "boolean" ) { keepScripts = context; context = false; } context = context || document; var parsed = rsingleTag.exec( data ), scripts = !keepScripts && []; // Single tag if ( parsed ) { return [ context.createElement( parsed[1] ) ]; } parsed = jQuery.buildFragment( [ data ], context, scripts ); if ( scripts && scripts.length ) { jQuery( scripts ).remove(); } return jQuery.merge( [], parsed.childNodes ); };
希望可以解决你的疑问
112016-06-15
相似问题
作业3的小问题
回答 1
为什么要用new操作符???
回答 1