jquery文档处理方法append,html可以执行脚本

  今天才发现原来jquery文档处理方法如append,html,before等方法可以执行内容中的script标签中的javascript脚本或者加载src指向的脚本文件,真是失败啊,用了那么久jquery...

注意:text方法除外,text方法会将html标签中的<>替换为对应的实体对象

  jquery源代码中部分文档处理方法如下

    append: function() {
        return this.domManip(arguments, true, function( elem ) {
            if ( this.nodeType === 1 ) {
                this.appendChild( elem );
            }
        });
    },
    prepend: function() {
        return this.domManip(arguments, true, function( elem ) {
            if ( this.nodeType === 1 ) {
                this.insertBefore( elem, this.firstChild );
            }
        });
    }

  可以看出,参数被一个domManip方法处理过了,这个domManip主要是负责处理脚本和创建html代码时用的,如table的处理,源代码如下

    domManip: function( args, table, callback ) {
        var results, first, value = args[0], scripts = [], fragment, parent;
        // We can not cloneNode fragments that contain checked, in WebKit
        if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
            return this.each(function() {
                jQuery(this).domManip( args, table, callback, true );
            });
        }
        if ( jQuery.isFunction(value) ) {
            return this.each(function(i) {
                var self = jQuery(this);
                args[0] = value.call(this, i, table ? self.html() : undefined);
                self.domManip( args, table, callback );
            });
        }
        if ( this[0] ) {
            parent = value && value.parentNode;
            // If we're in a fragment, just use that instead of building a new one
            if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
                results = { fragment: parent };
            } else {
                results = buildFragment( args, this, scripts );
            }
            
            fragment = results.fragment;
            
            if ( fragment.childNodes.length === 1 ) {
                first = fragment = fragment.firstChild;
            } else {
                first = fragment.firstChild;
            }
            if ( first ) {
                table = table && jQuery.nodeName( first, "tr" );
                for ( var i = 0, l = this.length; i < l; i++ ) {
                    callback.call(
                        table ?
                            root(this[i], first) :
                            this[i],
                        i > 0 || results.cacheable || this.length > 1  ?
                            fragment.cloneNode(true) :
                            fragment
                    );
                }
            }
            if ( scripts.length ) {
                jQuery.each( scripts, evalScript );
            }
        }
        return this;
        function root( elem, cur ) {
            return jQuery.nodeName(elem, "table") ?
                (elem.getElementsByTagName("tbody")[0] ||
                elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
                elem;
        }
    }

 

加支付宝好友偷能量挖...


原创文章,转载请注明出处:jquery文档处理方法append,html可以执行脚本

评论(0)Web开发网
阅读(617)喜欢(0)JavaScript/Ajax开发技巧