@@ -13,7 +13,6 @@ var codeInput = {
1313 ] ,
1414 // Attributes to monitor - needs to be global and static
1515
16- last_events : { } , // Last events applied; removed when changed so can be added to textarea, etc.
1716 /* Templates */
1817 usedTemplates : {
1918 } ,
@@ -50,6 +49,7 @@ var codeInput = {
5049 super ( ) ; // Element
5150 }
5251
52+ last_events = { } ; // Last events applied; removed when changed so can be added to textarea, etc.
5353
5454 /* Run this event in all plugins with a optional list of arguments */
5555 plugin_evt ( id , args ) {
@@ -172,14 +172,8 @@ var codeInput = {
172172 // Events
173173 textarea = this . querySelector ( "textarea" ) ;
174174 // Add event listeners, bound so `this` can be referenced
175- if ( this . onchange ) {
176- textarea . addEventListener ( "change" , this . onchange . bind ( this ) ) ;
177- this . onchange = undefined ; // Prevent duplicate
178- }
179- if ( this . onselectionchange ) {
180- textarea . addEventListener ( "selectionchange" , this . onselectionchange . bind ( this ) ) ;
181- this . onselectionchange = undefined ; // Prevent duplicate
182- }
175+ this . transfer_event ( "change" , this . querySelector ( "textarea" ) , null , this . onchange ) ;
176+ this . transfer_event ( "selectionchange" , this . querySelector ( "textarea" ) , null , this . onselectionchange ) ;
183177
184178 /* Add code from value attribute - useful for loading from backend */
185179 this . update ( value , this ) ;
@@ -199,6 +193,8 @@ var codeInput = {
199193 if ( this . isConnected ) {
200194 // This will sometimes be called before the element has been created, so trying to update an attribute causes an error.
201195 // Thanks to Kevin Loughead for pointing this out.
196+
197+ this . plugin_evt ( "attributeChanged" , [ name , oldValue , newValue ] ) ; // Plugin event
202198 switch ( name ) {
203199
204200 case "value" :
@@ -248,40 +244,29 @@ var codeInput = {
248244
249245 // Events
250246 case "onchange" :
251- {
252- // Doesn't exist
253- let textarea = this . querySelector ( "textarea" )
254- if ( oldValue ) {
255- textarea . removeEventListener ( "change" , this . last_events [ "change" ] ) ;
256- }
257- if ( newValue ) {
258- this . last_events [ "change" ] = newValue . bind ( this ) ;
259- textarea . addEventListener ( "change" , this . last_events [ "change" ] ) ;
260- this . onchange = undefined ; // Prevent duplicate
261- }
262- }
247+ this . transfer_event ( "change" , this . querySelector ( "textarea" ) , oldValue , newValue ) ;
263248 break ;
264249 case "onselectionchange" :
265- {
266- // Doesn't exist
267- let textarea = this . querySelector ( "textarea" )
268- if ( oldValue ) {
269- textarea . removeEventListener ( "selectionchange" , this . last_events [ "selectionchange" ] ) ;
270- }
271- if ( newValue ) {
272- this . last_events [ "selectionchange" ] = newValue . bind ( this ) ;
273- textarea . addEventListener ( "selectionchange" , this . last_events [ "selectionchange" ] ) ;
274- this . onselectionchange = undefined ; // Prevent duplicate
275- }
276- }
250+ this . transfer_event ( "selectionchange" , this . querySelector ( "textarea" ) , oldValue , newValue ) ;
277251 break ;
278-
279- this . plugin_evt ( "attributeChanged" , [ name , oldValue , newValue ] ) ; // Plugin event
280252 }
281253 }
282254
283255 }
284256
257+ /* Transfer an event by name from this to an inner element. */
258+ transfer_event ( evt_name , transfer_to , oldValue , newValue ) {
259+ // Doesn't exist
260+ if ( oldValue ) {
261+ transfer_to . removeEventListener ( evt_name , this . last_events [ evt_name ] ) ;
262+ }
263+ if ( newValue ) {
264+ this . last_events [ evt_name ] = this . onchange . bind ( this ) ;
265+ transfer_to . addEventListener ( evt_name , this . last_events [ evt_name ] ) ;
266+ this [ `on${ evt_name } ` ] = undefined ; // Prevent duplicate
267+ }
268+ }
269+
285270 /* Value attribute */
286271 get value ( ) {
287272 return this . getAttribute ( "value" ) ;
0 commit comments