Skip to content

Commit eabf1ea

Browse files
committed
Finish event transfer
1 parent 0b7a5a4 commit eabf1ea

File tree

1 file changed

+20
-35
lines changed

1 file changed

+20
-35
lines changed

code-input.js

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)