zoukankan      html  css  js  c++  java
  • jQuery.buildFragment源码分析

    一、jQuery.buildFragment使用方法

    1、参数

    jQuery.buildFragment( args, context, scripts );

    2、返回值

    return { fragment: fragment, cacheable: cacheable };


    二、思路分析

    1、处理context参数

    根据传入到context参数值的不同,确保context为文档根节点document

    2、限制可缓存条件

    2.1、字符串小于512字节
    2.2、字符串不存在option标签(克隆option标签会丢失选中状态,因此不缓存)
    2.3、字符串不存在<object>,<embed>标签(IE 6不能把<object>,<embed>标签嵌入到文档碎片中)
    2.4、字符串不存在checked属性(只针对克隆拥有checked属性节点时丢失选中状态的浏览器,如:Safria)
    2.5、字符串中不存在html5标签(只针对不支持html5标签的浏览器)

    3、处理args数组

    通过jQuery.clean函数格式化处理数组项字符串,并生成dom节点添加到文档碎片中

    4、判断缓存值

    如果缓存值为由clean函数处理的文档碎片,则数组项字符串略过clean函数处理

    5、返回值

    函数返回一个对象,保存文档碎片和可缓存状态

    三、源码注释分析

    【基于jQuery1.8.3】

     1 var rnocache = /<(?:script|object|embed|option|style)/i,
     2     rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
     3     rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i");
     4 
     5 jQuery.fragments = {};
     6 
     7 
     8 jQuery.buildFragment = function( args, context, scripts ) {
     9     var fragment, cacheable, cachehit,
    10         first = args[ 0 ];
    11 
    12     // Set context from what may come in as undefined or a jQuery collection or a node
    13     // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
    14     // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
    15     
    16     // 根据参数context值的不同,确保context为文档根节点document
    17     // jQuery1.8.0版本以后代码相对于之前版本有很大改进,以下是改进地方:
    18     // 针对context参数值为undefined, jQuery对象,DOM元素节点情况改进代码
    19     // 解决了1.8.0版本中context参数为文档片段(#document-fragment)的bug
    20     
    21     context = context || document;
    22     context = !context.nodeType && context[0] || context;
    23     context = context.ownerDocument || context;
    24 
    25 
    26     // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
    27     // Cloning options loses the selected state, so don't cache them
    28     // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
    29     // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
    30     // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
    31 
    32     // html字符串小于512字节
    33     // 克隆option标签会丢失选中状态,因此不缓存
    34     // IE 6不能把<object>,<embed>标签嵌入到文档碎片中
    35     // WebKit浏览器(如:Safria)克隆拥有checked属性节点时,也会丢失选中状态,因此不缓存,google最新版本不存在该bug
    36     // 最后,IE6,7、8不会正确地重用由html5标签元素创建的缓存片段
    37     
    38     if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
    39         first.charAt(0) === "<" && !rnocache.test( first ) &&
    40         
    41         // 如果浏览器能够克隆checked属性 和 支持html5,
    // 或者html字符串中不存在checked 和 不支持html5标签采用xhtml风格
    42 (jQuery.support.checkClone || !rchecked.test( first )) && 43 (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { 44 45 // Mark cacheable and look for a hit 46 // 如果以上条件都满足,则打上可缓存标记 47 cacheable = true; 48 49 // 将数组项字符串(主要是html字符串)缓存到jQuery.fragment对象的属性列表中,并获取缓存值 50 // 如果clean函数已经处理过了第二次相同的字符串内容,缓存值则为clean函数处理的文档碎片,字符串解析可以略过clean处理 51 fragment = jQuery.fragments[ first ]; 52 53 // 在clean函数处理了第一次字符串(与第二次相同)后,cachehit为true 54 cachehit = fragment !== undefined; 55 } 56 57 // 判断缓存值 58 if ( !fragment ) { 59 fragment = context.createDocumentFragment(); 60 61 // 通过clean函数处理args数组,将数组每一项字符串都生成dom节点, 62 // 并且添加到提供的文档碎片(fragment)中,因此返回的对象中的fragment属性 63 // 保存了参数args数组项字符串生成的dom节点 64 jQuery.clean( args, context, fragment, scripts ); 65 66 // Update the cache, but only store false 67 // unless this is a second parsing of the same content 68 69 // 当cachehit为true时,jQuery.fragment[first]为clean函数处理的文档碎片 70 if ( cacheable ) { 71 jQuery.fragments[ first ] = cachehit && fragment; 72 } 73 } 74 75 return { fragment: fragment, cacheable: cacheable }; 76 };

     转载请注明转自博客园jQuery.buildFragment源码分析

  • 相关阅读:
    基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建
    ruby 中%Q %q %W %w %x %r %s的用法
    ruby中 Win32ole的各应用操作方法(word excel Outlook IE)
    dubbo服务自动化测试搭建
    Spring AOP 结合自定义注解的使用
    Mysql 中 JSON_CONTAINS、JSON_ARRAY 的使用
    Spring Cloud Eureka 的一些配置
    Spring Cloud 整合 Spring Boot Admin
    Nginx 泛域名解析配置
    Spring Data Solr
  • 原文地址:https://www.cnblogs.com/yangjunhua/p/2849155.html
Copyright © 2011-2022 走看看