link element onload
This is kind of a hack, but if you can edit the CSS, you could add a special style (with no visible effect) that you can listen for using the technique in this post: http://www.west-wind.com/weblog/posts/478985.aspx
You would need an element in the page that has a class or an id that the CSS will affect. When your code detects that its style has changed, the CSS has been loaded.
A hack, as I said :)
HTML onload Event in link element doesn't work
Based on https://www.w3schools.com/tags/ev_onload.asp onload event attribute can be used with tags:
<body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">, <link>, <script> and <style>
You are NOT using <link>
tag. You are using anchor(<a>
) tag on which this attribute is not supported!<link>
tag is used to link an external resource to the document. For example CSS file.
<head>
<link rel="stylesheet" type="text/css" href="theme.css">
</head>
link element's 'load' event not firing, and 'onload' non-operational too
Found the main problem: was setting src
instead of href
. Will check after lunch to see whether the events are firing, but at a brief glance, it looks to be working so far.
Why is the link element's onload attribute unreliable for android stock browsers?
Android browser doesn't support "onload" / "onreadystatechange" events for element: http://pieisgood.org/test/script-link-events/
But it returns:
"onload" in link === true
So, my solution is to detect Android browser from userAgent and then wait for some special css rule in your stylesheet (e.g., reset for "body" margins).
If it's not Android browser and it supports "onload" event- we will use it:
var userAgent = navigator.userAgent,
iChromeBrowser = /CriOS|Chrome/.test(userAgent),
isAndroidBrowser = /Mozilla\/5.0/.test(userAgent) && /Android/.test(userAgent) && /AppleWebKit/.test(userAgent) && !iChromeBrowser;
addCssLink('PATH/NAME.css', function(){
console.log('css is loaded');
});
function addCssLink(href, onload) {
var css = document.createElement("link");
css.setAttribute("rel", "stylesheet");
css.setAttribute("type", "text/css");
css.setAttribute("href", href);
document.head.appendChild(css);
if (onload) {
if (isAndroidBrowser || !("onload" in css)) {
waitForCss({
success: onload
});
} else {
css.onload = onload;
}
}
}
// We will check for css reset for "body" element- if success-> than css is loaded
function waitForCss(params) {
var maxWaitTime = 1000,
stepTime = 50,
alreadyWaitedTime = 0;
function nextStep() {
var startTime = +new Date(),
endTime;
setTimeout(function () {
endTime = +new Date();
alreadyWaitedTime += (endTime - startTime);
if (alreadyWaitedTime >= maxWaitTime) {
params.fail && params.fail();
} else {
// check for style- if no- revoke timer
if (window.getComputedStyle(document.body).marginTop === '0px') {
params.success();
} else {
nextStep();
}
}
}, stepTime);
}
nextStep();
}
Demo: http://codepen.io/malyw/pen/AuCtH
Capturing load event on LINK
For CSS stylesheets (not LINK elements in general) i'm using manual interval, by poking it's rules length. It works crossbrowser (AFAIT).
try {
if ( cssStylesheet.sheet && cssStylesheet.sheet.cssRules.length > 0 )
cssLoaded = 1;
else if ( cssStylesheet.styleSheet && cssStylesheet.styleSheet.cssText.length > 0 )
cssLoaded = 1;
else if ( cssStylesheet.innerHTML && cssStylesheet.innerHTML.length > 0 )
cssLoaded = 1;
}
catch(ex){}
In code above, the cssStylesheet is DOMElement.
Are LINK elements loaded synchronously?
The process for obtaining <link>
resources is described in the corresponding section of the HTML5 spec, and answers like this:
User agents may opt to only try to obtain such resources when they are needed, instead of pro-actively fetching all the external resources that are not applied
However,
The [
<link>
] element must delay the load event of the element's document until all the attempts to obtain the resource and its critical subresources are complete
…meaning that a document's load
event won't fire until all <link>
s have been loaded (or failed)
Next.js - How to add a link tag inside the head with literal onload attribute string value?
So I eventually fixed this using a <style>
tag with dangerouslySetInnerHTML
in a custom _document.js
. All together it should look like this:
<link rel="preconnect" href="https://fonts.googleapis.com" crossOrigin="anonymous" />
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap" as="style" />
<style dangerouslySetInnerHTML={ {
__html: `</style>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap"
media="print"
onload="this.media='all';"
/>
<style>`
} }></style>
<noscript>
<link
rel="stylesheet"
type="text/css"
href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap" />
</noscript>
Which generates the following output:
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin="anonymous"/>
<link rel="preload" href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap" as="style"/>
<style></style>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap" media="print" onload="this.media='all';" />
<style></style>
<noscript><link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;600&family=Karla:wght@700&display=swap"/></noscript>
Not pretty, but better than having a <div>
inside the <head>
(which is not interpreted correctly by all browsers).
There's an open RFC to create a RawHTML
component or extend Fragment
to accept dangerouslySetInnerHTML
so that something like this is possible without hacks, but it's been more than a year since it was created.
Also, there's quite a long discussion about this as well with a few different solutions (hacks) that seem to work.
You can see the solution working here: https://andorratechvalley.com/
Related Topics
Read a File One Line At a Time in Node.Js
Fastest Method to Replace All Instances of a Character in a String
Converting JavaScript Object With Numeric Keys into Array
Event.Preventdefault() Function Not Working in Ie
Variable Name as a String in JavaScript
Difference Between Two Dates in Years, Months, Days in JavaScript
Why Is Null an Object and What's the Difference Between Null and Undefined
Sending Command Line Arguments to Npm Script
What Is the JavaScript ≫≫≫ Operator and How to Use It
Iterating Over Result of Getelementsbyclassname Using Array.Foreach
How to Chain and Share Prior Results With Promises
JavaScript and Operator Within Assignment
What Are Alternatives to Document.Write
Curly Brackets in Arrow Functions
Converting Between Strings and Arraybuffers
Is It Not Possible to Stringify an Error Using Json.Stringify