-
Notifications
You must be signed in to change notification settings - Fork 534
/
event_fix.js
143 lines (133 loc) · 5.6 KB
/
event_fix.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//=========================================
// 事件补丁模块
//==========================================
define("event_fix", !!document.dispatchEvent, ["mass"], function( $ ){
//模拟IE678的reset,submit,change的事件代理
var rformElems = /^(?:input|select|textarea)$/i
var facade = $.event = {
special: {}
};
var special = facade.special
special.change = {
setup: function() {
if ( rformElems.test( this.nodeName ) ) {
// IE doesn't fire change on a check/radio until blur; trigger it on click
// after a propertychange. Eat the blur-change in special.change.handle.
// This still fires onchange a second time for check/radio after blur.
if ( this.type === "checkbox" || this.type === "radio" ) {
$( this ).bind( "propertychange._change", function( event ) {
if ( event.originalEvent.propertyName === "checked" ) {
this._just_changed = true;
}
});
$( this). bind("click._change", function( event ) {
if ( this._just_changed && !event.isTrigger ) {
this._just_changed = false;
}
// Allow triggered, simulated change events (#11500)
facade.simulate( "change", this, event, true );
} );
}
return false;
}
// Delegated event; lazy-add a change handler on descendant inputs
$ (this).bind( "beforeactivate._change", function( e ) {
var elem = e.target;
if ( rformElems.test( elem.nodeName ) && !$._data( elem, "_change_attached" ) ) {
$( elem ).bind( "change._change", function( event ) {
if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
facade.simulate( "change", this.parentNode, event, true );
}
$._data( elem, "_change_attached", true );
})
}
});
},
handle: function( event ) {
var elem = event.target;
// Swallow native change events from checkbox/radio, we already triggered them above
if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
return event.handleObj.handler.apply( this, arguments );
}
},
teardown: function() {
facade.remove( this, "._change" );
return !rformElems.test( this.nodeName );
}
}
special.submit = {
setup: function() {
// Only need this for delegated form submit events
if ( this.tagName === "FORM" ) {
return false;
}
// Lazy-add a submit handler when a descendant form may potentially be submitted
$( this).bind( "click._submit keypress._submit", function( e ) {
// Node name check avoids a VML-related crash in IE (#9807)
var elem = e.target,
form = /input|button/i.test(elem.tagName) ? elem.form : undefined;
if ( form && !$._data( form, "_submit_attached" ) ) {
facade.bind( form,{
type: "submit._submit",
callback: function( event ) {
event._submit_bubble = true;
}
});
$._data( form, "_submit_attached", true );
}
});
// return undefined since we don't need an event listener
},
postDispatch: function( event ) {
// If form was submitted by the user, bubble the event up the tree
if ( event._submit_bubble ) {
delete event._submit_bubble;
if ( this.parentNode && !event.isTrigger ) {
facade.simulate( "submit", this.parentNode, event, true );
}
}
},
teardown: function() {
// Only need this for delegated form submit events
if ( this.tagName == "FORM" ) {
return false;
}
// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
facade.remove( this, "._submit" );
}
}
})
/*
* input事件的支持情况:IE9+,chrome+, gecko2+, opera10+,safari+
* 2012.5.1 fix delegate BUG将submit与reset这两个适配器合而为一
* 2012.10.18 重构reset, change, submit的事件代理
<!DOCTYPE HTML>
<html>
<head>
<title>change</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="mass.js" ></script>
<script>
$.require("ready,event", function(){
$("form").on( "change", function() { $.log(this.tagName) })
$(document).on( "change",'select', function() { $.log(this.tagName) })
})
</script>
</head>
<body >
<form action="javascript:void 0">
<select>
<option>
1111111
</option>
<option>
222222
</option>
<option>
33333
</option>
</select>
</form>
</body>
</html>
*/