3-9课,第4分50秒是不是讲错了?类似$('<div></div>')表达式返回的应该是一个jquery对象吧?

来源:

杨洋1989

2016-06-15

另外,老师你这样的写法$('<div>')是不是不太规范,w3c文档上要求标签闭合的,你写的基本都没闭合。

写回答

1回答

Lyn

2016-06-15

同学你的观察很仔细,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 );
};


希望可以解决你的疑问

1
1
杨洋1989
非常感谢!
2016-06-15
共1条回复

Web App用组件方式开发全站

用HTML5/CSS3/JS流行技术,实现移动端可视化数据报告

3164 学习 · 516 问题

查看课程