18
18
// Store the original 'chosen' method
19
19
var fn_chosen = $ . fn . chosen ;
20
20
21
- $ . fn . extend ( {
21
+ $ . fn . extend ( {
22
22
// summery:
23
23
// Extend the original 'chosen' method to support images
24
24
28
28
29
29
var html_template = options . html_template || fn_template ;
30
30
31
+ var self = this ;
32
+
31
33
// Attach Ready event before continue with chose
32
34
this . each ( function ( input_field ) {
33
35
34
36
$this = $ ( this ) ;
35
37
36
- $this . on ( "liszt:ready" , function change ( e , chosen ) {
37
-
38
+ $this . on ( "chosen:ready" , function change ( e , chosen ) {
38
39
chosen = chosen . chosen ;
39
40
41
+ // The change event handler used further down doesn't pass in the chosen object so we need to store this for later.
42
+ self . chosen = chosen ;
43
+
44
+ // The ready event is being triggered twice so ensure we only handle it once
45
+ if ( self . readyEventTriggered ) {
46
+ return ;
47
+ } else {
48
+ self . readyEventTriggered = true ;
49
+ }
50
+
40
51
var form_field = chosen . form_field ;
41
52
42
53
var options = form_field . options ;
43
- var spans = $ ( chosen . container ) . find ( '.chzn-choices span' ) ;
44
-
54
+ var spans = $ ( chosen . container ) . find ( '.chosen-choices span' ) ;
45
55
46
- if ( options && options . length ) {
56
+ if ( options && options . length ) {
47
57
48
58
for ( var i = 0 ; i < options . length ; i ++ ) {
49
59
53
63
var text = $ ( option ) . text ( ) ;
54
64
55
65
if ( selected && img_src ) {
56
-
57
- var template = html_template . replace ( '{url}' , img_src ) ;
58
-
59
- if ( spans . length ) {
60
- for ( var j = 0 ; j < spans . length ; j ++ )
61
- if ( text == $ ( spans [ j ] ) . text ( ) ) {
62
- $ ( spans [ j ] ) . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
63
- }
66
+ var template = html_template . replace ( '{url}' , img_src ) ;
67
+ if ( spans . length ) {
68
+ for ( var j = 0 ; j < spans . length ; j ++ )
69
+ if ( text === $ ( spans [ j ] ) . text ( ) ) {
70
+ $ ( spans [ j ] ) . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
71
+ }
64
72
} else {
65
- $ ( chosen . container ) . find ( '.chzn -single span' ) . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
73
+ $ ( chosen . container ) . find ( '.chosen -single span' ) . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
66
74
}
67
75
}
68
76
69
77
}
70
78
}
71
79
72
- } ) ;
80
+ } ) ;
73
81
} ) ;
74
82
75
83
// original behavior - use function.apply to preserve context
76
84
var ret = fn_chosen . apply ( this , arguments ) ;
77
85
78
86
this . each ( function ( input_field ) {
79
87
80
- var $this , chosen ;
88
+ var $this ;
81
89
82
90
$this = $ ( this ) ;
83
91
84
- chosen = $this . data ( 'chosen' ) ;
85
-
86
92
$this . on ( "change" , function change ( evt , selected ) {
87
93
// summery
88
94
// This function is triggered when the chosen instance has changed,
91
97
// selected: Object
92
98
// Contains the value of the selected
93
99
//
100
+
101
+ var chosen = self . chosen ;
94
102
var options = chosen . form_field . options ;
95
103
96
- if ( selected != undefined && selected . selected != undefined && options && options . length ) {
104
+ if ( selected !== undefined && selected . selected != = undefined && options && options . length ) {
97
105
98
106
for ( var i = 0 ; i < options . length ; i ++ ) {
99
107
var option = options [ i ] ;
100
108
var value = ( $ ( option ) . attr ( 'value' ) ) ? $ ( option ) . attr ( 'value' ) : $ ( option ) . text ( ) ;
101
109
var img_src = $ ( option ) . attr ( 'data-img-src' ) ;
102
110
103
- if ( img_src != undefined && selected . selected == value ) {
111
+ if ( img_src !== undefined && selected . selected = == value ) {
104
112
var template = html_template . replace ( '{url}' , img_src ) ;
105
113
106
114
// For multiple selection
107
- span = $ ( chosen . container ) . find ( '.chzn -choices span' ) . last ( )
115
+ span = $ ( chosen . container ) . find ( '.chosen -choices span' ) . last ( )
108
116
span . find ( 'img' ) . remove ( )
109
117
span . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
110
118
111
119
// For single select
112
- span = $ ( chosen . container ) . find ( '.chzn -single span' )
120
+ span = $ ( chosen . container ) . find ( '.chosen -single span' )
113
121
span . find ( 'img' ) . remove ( )
114
122
span . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
115
123
}
116
124
}
117
125
}
118
126
} ) ;
119
127
120
- $this . on ( "liszt:hiding_dropdown" , function ( e , _c ) {
121
-
122
- var options = chosen . form_field . options ;
128
+ $this . on ( "chosen:hiding_dropdown" , function ( e , chosen ) {
129
+ if ( ! chosen ) {
130
+ return ;
131
+ }
132
+ chosen = chosen . chosen ;
133
+ var options = chosen . form_field ; //.options;
123
134
124
135
var selected = $ ( chosen . form_field ) . find ( ':selected' ) ;
125
136
132
143
var template = html_template . replace ( '{url}' , img_src ) ;
133
144
134
145
// For multiple selection
135
- span = $ ( chosen . container ) . find ( '.chzn -choices span' ) . last ( )
146
+ span = $ ( chosen . container ) . find ( '.chosen -choices span' ) . last ( )
136
147
span . find ( 'img' ) . remove ( )
137
148
span . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
138
149
139
150
// For single select
140
- span = $ ( chosen . container ) . find ( '.chzn -single span' )
151
+ span = $ ( chosen . container ) . find ( '.chosen -single span' )
141
152
span . find ( 'img' ) . remove ( )
142
153
span . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
143
154
} )
144
155
145
- $this . on ( "liszt :showing_dropdown" , function showing_dropdown ( evt , _chosen ) {
156
+ $this . on ( "chosen :showing_dropdown" , function showing_dropdown ( evt , _chosen ) {
146
157
// summery
147
158
// This function is triggered when the chosen instance dropdown list becomes visible
148
159
// For Chose custom events: http://forwebonly.com/jquery-chosen-custom-events-and-how-to-use-them/
151
162
// The event object
152
163
// _chosen: Object {chosen:Chosen}
153
164
// Contains the current instance of Chosen class
154
- var lis = $ ( chosen . container ) . find ( '.chzn-drop ul li' )
155
- var options = $ ( chosen . form_field ) . find ( 'optgroup, option:not(:empty)' ) ;
156
-
157
- // SS uses a modified Chosen.js and after the 'showing_dropdown' event the
158
- // values get immediatelly reset, also removing the images. Solved it with setTimeout.
159
- setTimeout ( function ( lis , options ) {
160
- for ( var i = 0 ; i < lis . length ; i ++ ) {
161
- var li = lis [ i ] ;
162
- var option = options [ i ] ;
163
- var img_src = $ ( option ) . attr ( 'data-img-src' ) ;
164
165
165
- if ( typeof img_src != 'undefined' && img_src != '' ) {
166
- var template = html_template . replace ( '{url}' , img_src ) ;
167
- $ ( li ) . prepend ( template . replace ( '{class_name}' , 'chose-image-list' ) ) ;
168
- }
166
+ // Ensure images have not already been processed (occurs because this dropdown event seems to be
167
+ // triggered twice.
168
+ var hasImage = $ ( _chosen . chosen . container ) . find ( '.chosen-drop ul li img' ) ;
169
+ if ( hasImage . length > 0 ) {
170
+ return ;
171
+ }
172
+
173
+ var lis = $ ( _chosen . chosen . container ) . find ( '.chosen-drop ul li' )
174
+ var options = $ ( _chosen . chosen . form_field ) . find ( 'optgroup, option:not(:empty)' ) ;
175
+
176
+ for ( var i = 0 ; i < lis . length ; i ++ ) {
177
+ var li = lis [ i ] ;
178
+ var option = options [ i ] ;
179
+ var img_src = $ ( option ) . attr ( 'data-img-src' ) ;
180
+
181
+ if ( typeof img_src !== 'undefined' && img_src !== '' ) {
182
+ var template = html_template . replace ( '{url}' , img_src ) ;
183
+ $ ( li ) . prepend ( template . replace ( '{class_name}' , 'chose-image-list' ) ) ;
169
184
}
170
- } , 1 , lis , options ) ;
185
+ }
171
186
} ) ;
172
- } ) ;
173
- $this . trigger ( 'liszt:hiding_dropdown' ) ;
187
+ } ) ;
188
+
189
+ if ( typeof $this !== 'undefined' ) {
190
+ $this . trigger ( 'chosen:hiding_dropdown' ) ;
191
+ }
192
+
174
193
return ret ;
175
194
}
176
- } ) ;
195
+ } ) ;
177
196
178
- } ) ( jQuery ) ;
197
+ } ) ( jQuery ) ;
0 commit comments