angularjs bindJQuery函数详解

    xiaoxiao2021-12-14  26

    ANGULARJS bindJQuery函数讲解

    首先先上代码: 先看两个函数 这两个函数在接下来用得上。isUndefined和 isDefined isUndefined函数定义如下:

    function isUndefined(value){ return typeof value==='undefined'; }

    isUndefined这个函数判断value是否为‘undefined’类型。 只有value 为’undefined’类型时,都会返回 true. 如果value为null或其他类型,则这个函数都会返回 false;

    isDefined函数如下:

    function isDefined(value){ return typeof value!=='undefined'; }

    isDefined判断value值是否为’undefined’; 如果为undefined则返回false 否则其他的返回true

    接下来看主函数 bindJQuery.

    var bindJQueryFired=false; function bindJQuery(){ var originalCleanData; if(bindJQueryFired){ return; } var jqName=jq(); jQuery=isUndefined(jqName) ?window.jQuery: !jqName ? undefined : window[jqName]; if(jQuery&&JQuery.fn.on){ jqLite=jQuery; extend(jQuery.fn,{ scope:jQLitePrototype.scope, isolateScope:JQLitePrototype.isolateScope, controller:JQLitePrototype.injector, inheritedData:JQLitePrototype.inheritedData; )}; originalCleanData=jQuery.cleanData; jQuery.cleanData=function(elems){ var events; for(var i=0,elem;(elem=elem[i]!=null;i++){ events=jQuery._data(elem,"events"); if(events&&events.$destroy){ jQuery(elem).triggerHandler('$destroy'); } } originalCleanData(elems); }; }else{ jqLite=JQLite; } angular.element=jqLite; bindJQueryFired=true;] 以上就是bindJQuery的代码段,下面来分批进行介绍各部分作用。 var bindJQueryFired=false;

    这句话的作用相当与一个开关,首次加载的时候定义为开启状态,当满足某些条件后,自动关闭。

    function bindJQuery(){ /*定义变量 清除数据。关于angularJS的数据缓存,以及如何清理没有搞明白。 如果你们懂的,可以给我施舍下哈,亲们。*/ var originaCleanData; /*如果开关已开,则直接退出函数*/ if(bindJQueryFired){ return; /*定义了一个jq()函数并把它赋给 jqName*/ var jqName=jq();}

    既然使用了jq()这个函数,那么咋么来看看jq()这个函数怎么定义的

    function jq(){ /*首先先判断有没有jq.name 如果有则直接返回,如果没有 *则继续执行下面的代码。 */ if(isDefined(jq.name_)){ return jq.name_; } /*定义临时变量,存储从dom元素中查找到的elememnt*/ var el; /*定义 变量 i 用于for循环*/ var i; /* ngAttrPrefixes是一个数组,定义了首字节,用于记录 * angularjs中所有可能出现的头字节。 */ var ngAttrPrefixes=['ng-','data-ng-','ng:','x-ng-']; /*定义变量ii 用于定义ngAttrPrefixes数组的长度*/ var ii=ngAttrPrefixes.length; /*prefix 用于获取ngAttrPrefixes里的变量,用于for循环*/ var prefix; /*定义name 获取el元素的属性值*/ var name; for(i=0;i<ii.length;i++){ /*遍历ngAttrPrfixes 并把内容赋给 prefix*/ prefix=ngAttrPrefixes[i]; /*在整个文档中查找元素或id或class中查找 * ng-jq、data-ng-jq、ng\:jq、x-ng-jq这几个值,如果找到将它赋给el; * 如果没有找到直接跳过。 * 当找到以上几个值后并赋给el后,查找这个元素上的属性名分别为 * ng-jq、data-ng-jq、ng:jq、x-ng-jq */并将这些属性名上的值赋给name; if(el=window.document.querySelector('['+prefix.replace(':','\\:')+'jq]')){ name=el.getAttribute(prefix+'jq'); break; } } /*最后将这个name值赋给jq.name*/ return (jq.name_=name); };

    jq()这个函数有什么作用? 接下来回到主函数 bindJQuery这个函数中。

    function bindJQuery(){ var originalCleanData; if(bindJQueryFired){ return; } /*获取到jq.name并将值赋给jqName*/ var jqName=jq(); /* 假设 jq()函数返回了一个值不是'undefined' */ * 则isUndefined(jqName)返回值为true jQuery=window.jQuery;*/ * 如果jq()函数返回的是一个值 jq.name; */ * 则isUndefined(jqName)返回false */ * 首先先判读 !jqName是否为true */ * (由于jqName现在返回的值有效,则现在的 !jqName为 false) */ * 则 jQuery=window[jqName]; */ * 什么时候会执行jQuery=undefined. */ * 当jqName即不为js里定义的 string bool,number,null,object,undefined,以外的类型 */ * 会执行jQuery=undefined; */ * 应该防止程序出错而定义的。 */ jQuery=isUndefined(jqName) ?window.jQuery: !jqName ? undefined : window[jqName]; /*前面一定给jQuery赋值 接下来判断是否有jQuery.fn.on这个函数。 */ /* 将jQuery赋给angularjs自己定义的jqLite. */ /* extend函数是在第一个参数下面添加其他的方法。 */ /* 并且在jQuery.fn jQuery 原型下面添加几个方法。这几个方法,我还没有 */ /* 琢磨,有时间在和大家分享。 */ if(jQuery&&jQuery.fn.on){ jqLite=jQuery; extend(jQuery.fn,{ scope:jQLitePrototype.scope, isolateScope:JQLitePrototype.isolateScope, iniector:jQLitePrototype.injector, inheritedData:jQLitePrototype.inheritedData }); originalCleanData=jQuery.cleanData; /*jQuery.cleanData这个函数没有看懂。*/ jQuery.cleanData=function(elems){ var events; for(var i=0,ele;(ele=elems[i])!=null;i++){ events=jQuery._data(elem,"events"); if(events&&events.$destroy){ jQuery(elem).triggerHandler('$desroy'); } } originalCleanData(elems); }; }else{ jqLite=jQLite; } /*将jqLite赋给angular.element*/ angular.element=jqLite; /*将开关关闭*/ bindJQueryFired=true;

    文章还在编写矫正中,有的地方肯定不足,请谅解 。。。

    转载请注明原文地址: https://ju.6miu.com/read-968252.html

    最新回复(0)