I have defined a custom element and I want to execute a script only when the custom element is upgraded to its registered type. The use case is that I must call a custom method.
My main html file looks like this:
<project-list></project-list>
<script>
var project_list = document.getElementsByTagName("project-list")[0]
project_list.custom_method("some_data");
</script>
The custom element is registered in a HTML import like this:
<script>
"use strict";
var currentScript = document._currentScript || document.currentScript;
class ProjectList extends HTMLElement {
createdCallback(){
console.log("created");
}
custom_method(data) {
console.log("custom_method() OK");
console.log(data);
this.innerHTML = data;
}
}
document.registerElement("project-list", ProjectList);
</script>
My question is simple: how to make sure the script in the main html file is called only after the custom element gains its custom_method
method?
I'm looking for an elegant solution. Something that the spec authors would have thought of. I don't mind changing the architecture quite a bit (for example by moving the javascript from the main file into another custom element if that is necessary).
Sync HTML Import
As suggested by @dandavis, because of the
sync
default behaviour of the<link>
and<script>
elements, you just have to put your tags in the right order: registration before method call.Or instead you can call your custom method when the
DOMContentLoaded
or thewindow.onload
event is fired, as below:Async HTML Import
If for some reasons you want to load your HTML Import file asynchronousely, you can wait for the
link.onload
event. At this time the |<script>
inside the import has been already exectued, the custom element registered and created.With WebComponents.js polyfill
In this situation the polyfill won't instantiate the created object immediately after the import is loaded. Instead you should listen to the
WebComponentsReady
event:It works with Firefox, IE 11, and also with Chrome.