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
54
64
55
65
if ( selected && img_src ) {
56
66
57
- var template = html_template . replace ( '{url}' , img_src ) ;
67
+ var template = html_template . replace ( '{url}' , img_src ) ;
58
68
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
- }
69
+ if ( spans . length ) {
70
+ for ( var j = 0 ; j < spans . length ; j ++ )
71
+ if ( text == $ ( spans [ j ] ) . text ( ) ) {
72
+ $ ( spans [ j ] ) . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
73
+ }
64
74
} else {
65
- $ ( chosen . container ) . find ( '.chzn -single span' ) . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
75
+ $ ( chosen . container ) . find ( '.chosen -single span' ) . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
66
76
}
67
77
}
68
78
69
79
}
70
80
}
71
81
72
- } ) ;
82
+ } ) ;
73
83
} ) ;
74
84
75
85
// original behavior - use function.apply to preserve context
76
86
var ret = fn_chosen . apply ( this , arguments ) ;
77
87
78
88
this . each ( function ( input_field ) {
79
89
80
- var $this , chosen ;
90
+ var $this ;
81
91
82
92
$this = $ ( this ) ;
83
93
84
- chosen = $this . data ( 'chosen' ) ;
85
-
86
94
$this . on ( "change" , function change ( evt , selected ) {
87
95
// summery
88
96
// This function is triggered when the chosen instance has changed,
91
99
// selected: Object
92
100
// Contains the value of the selected
93
101
//
102
+
103
+ var chosen = self . chosen ;
94
104
var options = chosen . form_field . options ;
95
105
96
106
if ( selected != undefined && selected . selected != undefined && options && options . length ) {
104
114
var template = html_template . replace ( '{url}' , img_src ) ;
105
115
106
116
// For multiple selection
107
- span = $ ( chosen . container ) . find ( '.chzn -choices span' ) . last ( )
117
+ span = $ ( chosen . container ) . find ( '.chosen -choices span' ) . last ( )
108
118
span . find ( 'img' ) . remove ( )
109
119
span . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
110
120
111
121
// For single select
112
- span = $ ( chosen . container ) . find ( '.chzn -single span' )
122
+ span = $ ( chosen . container ) . find ( '.chosen -single span' )
113
123
span . find ( 'img' ) . remove ( )
114
124
span . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
115
125
}
116
126
}
117
127
}
118
128
} ) ;
119
129
120
- $this . on ( "liszt:hiding_dropdown" , function ( e , _c ) {
121
-
122
- var options = chosen . form_field . options ;
130
+ $this . on ( "chosen:hiding_dropdown" , function ( e , chosen ) {
131
+ if ( ! chosen ) {
132
+ return ;
133
+ }
134
+ chosen = chosen . chosen ;
135
+ var options = chosen . form_field ; //.options;
123
136
124
137
var selected = $ ( chosen . form_field ) . find ( ':selected' ) ;
125
138
132
145
var template = html_template . replace ( '{url}' , img_src ) ;
133
146
134
147
// For multiple selection
135
- span = $ ( chosen . container ) . find ( '.chzn -choices span' ) . last ( )
148
+ span = $ ( chosen . container ) . find ( '.chosen -choices span' ) . last ( )
136
149
span . find ( 'img' ) . remove ( )
137
150
span . prepend ( template . replace ( '{class_name}' , 'chose-image' ) ) ;
138
151
139
152
// For single select
140
- span = $ ( chosen . container ) . find ( '.chzn -single span' )
153
+ span = $ ( chosen . container ) . find ( '.chosen -single span' )
141
154
span . find ( 'img' ) . remove ( )
142
155
span . prepend ( template . replace ( '{class_name}' , 'chose-image-small' ) ) ;
143
156
} )
144
157
145
- $this . on ( "liszt :showing_dropdown" , function showing_dropdown ( evt , _chosen ) {
158
+ $this . on ( "chosen :showing_dropdown" , function showing_dropdown ( evt , _chosen ) {
146
159
// summery
147
160
// This function is triggered when the chosen instance dropdown list becomes visible
148
161
// For Chose custom events: http://forwebonly.com/jquery-chosen-custom-events-and-how-to-use-them/
151
164
// The event object
152
165
// _chosen: Object {chosen:Chosen}
153
166
// 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
167
157
- // SS uses a modified Chosen.js and after the 'showing_dropdown' event the
168
+ // Ensure images have not already been processed (occurs because this dropdown event seems to be
169
+ // triggered twice.
170
+ var hasImage = $ ( _chosen . chosen . container ) . find ( '.chosen-drop ul li img' ) ;
171
+ if ( hasImage . length > 0 ) {
172
+ return ;
173
+ }
174
+
175
+ var lis = $ ( _chosen . chosen . container ) . find ( '.chosen-drop ul li' )
176
+ var options = $ ( _chosen . chosen . form_field ) . find ( 'optgroup, option:not(:empty)' ) ;
177
+
178
+ // SS uses a modified Chosen.js and after the 'showing_dropdown' event the
158
179
// 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
180
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
- }
181
+ for ( var i = 0 ; i < lis . length ; i ++ ) {
182
+ var li = lis [ i ] ;
183
+ var option = options [ i ] ;
184
+ var img_src = $ ( option ) . attr ( 'data-img-src' ) ;
185
+
186
+ if ( typeof img_src != 'undefined' && img_src != '' ) {
187
+ var template = html_template . replace ( '{url}' , img_src ) ;
188
+ $ ( li ) . prepend ( template . replace ( '{class_name}' , 'chose-image-list' ) ) ;
169
189
}
170
- } , 1 , lis , options ) ;
190
+ }
191
+
192
+ /* setTimeout(function(lis, options){
193
+ for(var i = 0; i < lis.length; i++){
194
+ var li = lis[i];
195
+ var option = options[i];
196
+ var img_src = $(option).attr('data-img-src');
197
+
198
+ if(typeof img_src != 'undefined' && img_src != ''){
199
+ var template = html_template.replace('{url}',img_src);
200
+ $(li).prepend(template.replace('{class_name}','chose-image-list'));
201
+ }
202
+ }
203
+ }, 1, lis, options);*/
171
204
} ) ;
172
- } ) ;
173
- $this . trigger ( 'liszt :hiding_dropdown' ) ;
205
+ } ) ;
206
+ $this . trigger ( 'chosen :hiding_dropdown' ) ;
174
207
return ret ;
175
208
}
176
- } ) ;
209
+ } ) ;
177
210
178
- } ) ( jQuery ) ;
211
+ } ) ( jQuery ) ;
0 commit comments