836
836
} ) ;
837
837
} ) ;
838
838
839
-
840
839
var strundefined = typeof undefined ;
840
+
841
+ var rformElems = / ^ (?: i n p u t | s e l e c t | t e x t a r e a ) $ / i,
842
+ rkeyEvent = / ^ k e y / ,
843
+ rmouseEvent = / ^ (?: m o u s e | c o n t e x t m e n u ) | c l i c k / ,
844
+ rfocusMorph = / ^ (?: f o c u s i n f o c u s | f o c u s o u t b l u r ) $ / ,
845
+ rtypenamespace = / ^ ( [ ^ . ] * ) (?: \. ( .+ ) | ) $ / ;
846
+
841
847
// 事件
842
848
$ . event = {
843
849
global : { } ,
849
855
* @param data
850
856
* @param selector
851
857
*/
852
- add : function ( elem , types , hanlder , data , selector ) {
858
+ add : function ( elem , types , handler , data , selector ) {
853
859
var t ,
854
860
tmp ,
861
+ type ,
855
862
events ,
856
- elemData = $ . _data ( elem ) ,
857
- eventHandle ;
858
-
863
+ handlers ,
864
+ origType ,
865
+ handleObj ,
866
+ namespaces ,
867
+ handleObjIn ,
868
+ elemData = $ . _data ( elem ) , // 1. 在$.cahce缓存中获取存储的事件句柄对象,如果没就新建elemData
869
+ eventHandle ; // 不仅仅只是只是充当一个回调函数的角色,而是一个实现了EventListener接口的对象
870
+
871
+ if ( handler . handler ) {
872
+ handleObjIn = handler ;
873
+ handler = handleObjIn . handler ;
874
+ selector = handleObjIn . selector ;
875
+ }
876
+
877
+ // 第二步:创建编号
859
878
if ( ! handler . guid ) {
879
+ // 用来寻找或者删除handler,因为这个东东是缓存在缓存对象上的,没有直接跟元素节点发生关联
860
880
handler . guid = $ . guid ++ ;
861
881
}
862
882
863
883
if ( ! ( events = elemData . events ) ) {
864
884
events = elemData . events = { } ;
865
885
}
866
886
887
+ // 第三步:分解事件名与句柄
867
888
if ( ! ( eventHandle = elemData . handle ) ) {
868
889
eventHandle = elemData . handle = function ( e ) {
869
890
return typeof $ !== strundefined && ( ! e || $ . event . triggered !== e . type ) ?
873
894
eventHandle . elem = elem ;
874
895
}
875
896
897
+ // 第四步: 填充事件名与事件句柄
876
898
types = ( types || '' ) . match ( rnotwhite ) || [ '' ] ;
877
899
t = types . length ;
878
900
while ( t -- ) {
901
+ tmp = rtypenamespace . exec ( types [ t ] ) || [ ] ;
902
+ type = origType = tmp [ 1 ] ;
903
+ namespaces = ( tmp [ 2 ] || '' ) . split ( '.' ) . sort ( ) ;
904
+
905
+ if ( ! type ) {
906
+ continue ;
907
+ }
908
+
909
+ handleObj = $ . extend ( {
910
+ type : type ,
911
+ origType : origType ,
912
+ data : data ,
913
+ handler : handler ,
914
+ guid : handler . guid ,
915
+ selector : selector ,
916
+ needsContext : selector ,
917
+ namespace : namespaces . join ( '.' )
918
+ } , handleObjIn ) ;
919
+
920
+ if ( ! ( handlers = events [ type ] ) ) {
921
+ handlers = events [ type ] = [ ] ;
922
+ handlers . delegateCount = 0 ;
923
+
924
+ if ( elem . addEventListener ) {
925
+ elem . addEventListener ( type , eventHandle , false ) ;
926
+ } else if ( elem . attachEvent ) {
927
+ elem . attachEvent ( 'on' + type , eventHandle ) ;
928
+ }
929
+ }
930
+
931
+ if ( selector ) {
932
+ handlers . splice ( handlers . delegateCount ++ , 0 , handleObj ) ;
933
+ } else {
934
+ handlers . push ( handleObj ) ;
935
+ }
879
936
937
+ // 表示事件曾经使用过,用于事件优化
938
+ $ . event . global [ type ] = type ;
880
939
}
940
+
941
+ elem = null ;
881
942
} ,
882
943
remove : function ( ) {
883
944
888
949
/**
889
950
* 分派(执行)事件处理函数
890
951
*/
891
- dispatch : function ( ) {
952
+ dispatch : function ( event ) {
953
+ var i ,
954
+ j ,
955
+ args = slice . call ( arguments ) ,
956
+ handlerQueue = [ ] ,
957
+ handlers = ( $ . _data ( this , 'events' ) || { } ) [ event . type ] || [ ] ,
958
+ handleObj ;
959
+
960
+ args [ 0 ] = event ;
961
+ event . delegateTarget = this ;
962
+
963
+ handlerQueue = $ . event . handlers . call ( this , event , handlers ) ;
964
+ handlers [ 0 ] . handler . apply ( handlerQueue [ 0 ] . elem , args ) ;
892
965
893
966
} ,
894
967
/**
898
971
* @param handlers
899
972
*/
900
973
handlers : function ( event , handlers ) {
974
+ var handleQueue = [ ] ,
975
+ delegateCount = handlers . delegateCount ;
901
976
977
+ if ( delegateCount < handlers . length ) {
978
+ handleQueue . push ( { elem : this , handlers : handlers . slice ( delegateCount ) } ) ;
979
+ }
980
+
981
+ return handleQueue ;
902
982
} ,
903
983
/**
904
984
* fix修正Event对象
905
985
* 将原生的事件对象 event 修正为一个 可以读读写event 对象,并对该 event 的属性以及方法统一接口
906
986
* @param event
907
987
*/
908
988
fix : function ( event ) {
909
-
910
- }
911
- }
989
+ if ( event [ Jing . expando ] ) {
990
+ return event ;
991
+ }
912
992
913
- /**
914
- * 构造函数创建可读写的 jQuery事件对象 event, 该对象即可以是原生事件对象 event 的增强版,也可以是用户自定义事件
915
- * @constructor
916
- */
917
- $ . Event = function ( ) {
918
-
919
- }
920
-
921
- $ . Event . prototype = {
922
-
923
- }
993
+ var i ,
994
+ prop ,
995
+ copy ,
996
+ type = event . type ,
997
+ originalEvent = event ,
998
+ fixHook = this . fixHooks [ type ] ;
924
999
925
- _ . returnTrue = function ( ) {
926
- return true ;
927
- }
928
- _ . returnFalse = function ( ) {
929
- return false ;
1000
+ if ( ! fixHook ) {
1001
+
1002
+ }
1003
+
1004
+ } ,
1005
+ fixHooks : { }
930
1006
}
931
1007
1008
+
932
1009
$ . fn . extend ( {
933
1010
/**
934
1011
* 事件绑定总入口
943
1020
var type ,
944
1021
origFn ;
945
1022
946
- if ( data == null && fn == null ) {
1023
+ if ( data == null && fn == null ) { // 以 on('click', fn)方式调用
947
1024
fn = selector ;
948
1025
data = selector = undefined ;
949
1026
}
1027
+
1028
+ if ( fn === false ) {
1029
+ fn = _ . returnFalse ;
1030
+ } else if ( ! fn ) {
1031
+ return this ;
1032
+ }
950
1033
951
- return this . each ( function ( ) {
1034
+ return this . each ( function ( ) { // 对所有elem进行处理,比如$('#a,.a'),
952
1035
$ . event . add ( this , types , fn , data , selector ) ;
953
1036
} ) ;
954
1037
} ,
966
1049
}
967
1050
} ) ;
968
1051
1052
+ /**
1053
+ * 构造函数创建可读写的 jQuery事件对象 event, 该对象即可以是原生事件对象 event 的增强版,也可以是用户自定义事件
1054
+ * @constructor
1055
+ */
1056
+ $ . Event = function ( ) {
1057
+
1058
+ }
1059
+
1060
+ $ . Event . prototype = {
1061
+
1062
+ }
1063
+
1064
+ _ . returnTrue = function ( ) {
1065
+ return true ;
1066
+ }
1067
+ _ . returnFalse = function ( ) {
1068
+ return false ;
1069
+ }
1070
+
969
1071
/**
970
1072
* 缓存内部方法
971
1073
* @param elem
1081
1183
1082
1184
return arguments . length > 1 ?
1083
1185
this . each ( function ( ) {
1084
- $ . data ( this , key , value )
1186
+ $ . data ( this , key , value ) ;
1085
1187
} ) :
1086
1188
elem ? $ . data ( elem , key ) : undefined ;
1087
1189
// elem ? _.dataAttr(elem, key, $.data(elem, key)) : undefined;
1093
1195
}
1094
1196
} ) ;
1095
1197
1198
+ $ . fn . show = function ( ) {
1199
+ this . css ( { display : 'block' } ) ;
1200
+ }
1201
+
1202
+ $ . fn . hide = function ( ) {
1203
+ this . css ( { display : 'none' } ) ;
1204
+ }
1205
+
1206
+ /*
1207
+ $.each(['toggle', 'show', 'hide'], function(i, name){
1208
+ $.fn[name] = function(){
1209
+ $(this).css({ display : 'none' })
1210
+ }
1211
+ });
1212
+ */
1213
+
1096
1214
} ( window ) ) ;
1097
1215
1098
1216
// 2014-04-21 : 准备开发第一版
1103
1221
// 2014-05-07 : 增加$().appendTo,$().prependTo等方法,增加$().html();
1104
1222
// 2014-05-08 : 增加$().css({ color : 'red' }), $(window).width,height(), $(document).width,height();
1105
1223
// 2014-05-09 : 增加$().width()方法, event first;
1106
- // 2014-05-12 : 增加$().data(), $().removeData()方法
1224
+ // 2014-05-12 : 增加$().data(), $().removeData()方法
1225
+ // 2014-05-13 : 增加$().event.dispatch方法
0 commit comments