
de.knightsoftnet.mtwidgets.client.ui.widget.resourceloader.JsResources Maven / Gradle / Ivy
package de.knightsoftnet.mtwidgets.client.ui.widget.resourceloader;
import elemental2.dom.DomGlobal;
import elemental2.dom.Element;
import elemental2.dom.Event;
import elemental2.dom.EventListener;
import elemental2.dom.HTMLScriptElement;
import elemental2.dom.NodeList;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JsResources {
protected static final String TAG_TYPE = "script";
protected static final String SCRIPT_TYPE = "text/javascript";
protected static Map initializationStarted = new HashMap<>();
protected static Map rememberEvent = new HashMap<>();
protected static Map> eventLisenerQueue = new HashMap<>();
/**
* async load of resources.
*
* @param function function to call on load
*/
public static void whenReady(final String scriptname, final EventListener function) {
List eventList = JsResources.eventLisenerQueue.get(scriptname);
if (eventList == null) {
eventList = new ArrayList<>();
JsResources.eventLisenerQueue.put(scriptname, eventList);
}
eventList.add(function);
if (BooleanUtils.isTrue(JsResources.initializationStarted.get(scriptname))
|| JsResources.isInHeader(scriptname)) {
if (JsResources.isInitialized(scriptname)) {
JsResources.eventLisenerQueue.get(scriptname)
.forEach(action -> action.handleEvent(JsResources.rememberEvent.get(scriptname)));
JsResources.eventLisenerQueue.get(scriptname).clear();
}
return;
}
JsResources.initializationStarted.put(scriptname, Boolean.TRUE);
final HTMLScriptElement jsScript =
(HTMLScriptElement) DomGlobal.document.createElement(TAG_TYPE);
if (StringUtils.endsWith(scriptname, ".js")) {
jsScript.src = scriptname;
} else {
jsScript.innerHTML = scriptname;
}
jsScript.type = JsResources.SCRIPT_TYPE;
DomGlobal.document.head.appendChild(jsScript);
jsScript.addEventListener("load", event -> {
JsResources.eventLisenerQueue.get(scriptname).forEach(action -> action.handleEvent(event));
JsResources.eventLisenerQueue.get(scriptname).clear();
JsResources.rememberEvent.put(scriptname, event);
});
}
/**
* check if script is available and initialized.
*
* @return true if it exists
*/
public static boolean isInitialized(final String scriptname) {
final boolean loaded = JsResources.rememberEvent != null || StringUtils.isEmpty(scriptname);
return loaded || JsResources.isInHeader(scriptname);
}
/**
* check if script is already in the header.
*
* @return true if it exists
*/
public static boolean isInHeader(final String scriptname) {
final NodeList linkList = DomGlobal.document.head.getElementsByTagName(TAG_TYPE);
return linkList.asList().stream()
.filter(element -> StringUtils.endsWith(scriptname, ".js")
? StringUtils.equals(((HTMLScriptElement) element).src, scriptname)
: StringUtils.equals(((HTMLScriptElement) element).innerHTML, scriptname))
.findFirst().isPresent();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy