Fornisco un widget JavaScript a diversi siti Web, che caricano in modo asincrono. Il mio widget a sua volta deve caricare uno script fornito da un'altra parte, fuori dal mio controllo.Esegui un pezzo di JavaScript non appena uno script di terze parti non riesce a caricare
Esistono diversi modi per verificare se lo script è stato caricato correttamente. Tuttavia, ho anche bisogno di eseguire un codice diverso se il caricamento di questo script non ha avuto esito positivo.
Gli strumenti ovvio che non funzionano sono:
io non sono disposto a utilizzare le librerie JavaScript, come jQuery. Ho bisogno di uno script molto piccolo per ridurre al minimo il mio impatto sui siti che usano il mio widget.
Desidero rilevare l'errore il prima possibile, quindi non è consigliabile utilizzare un timer per eseguire il polling. Non mi dispiacerebbe usare un timer come ultima risorsa sui vecchi browser, però.
Ho trovato che l'evento
<script>
del tagonerror
non è affidabile in alcuni dei principali browser. (Sembrava dipendere da quali componenti aggiuntivi sono stati installati.)Tutto ciò che riguarda
document.write
è appena uscito. (Oltre a questo metodo è intrinsecamente cattivi, il mio codice è caricato in modo asincrono in mododocument.write
può fare cose cattive alla pagina.)
ho avuto un precedente soluzione che ha coinvolto il caricamento del <script>
in una nuova . In quell'iframe, ho impostato un gestore di eventi <body onload=...>
che controllava se l'evento <script onload=...>
era già stato attivato. Poiché <script>
era parte del documento iniziale, non iniettato in modo asincrono in seguito, onload
viene attivato solo dopo che il livello di rete è stato eseguito con il tag <script>
.
Tuttavia, ora ho bisogno di caricare lo script nel documento principale; non può più essere in un iframe. Quindi ho bisogno di un modo diverso per attivare il codice non appena il livello di rete ha rinunciato a cercare di recuperare lo script.
Ho letto "Deep dive into the murky waters of script loading" nel tentativo di capire quali garanzie di ordinazione posso contare su tutti i browser.
Se ho capito le tecniche documentate lì:
- ho bisogno di mettere il mio codice di errore di gestione in un file separato
.js
. - Quindi, su determinati browser posso garantire che il mio codice venga eseguito solo dopo che lo script di terze parti è stato eseguito o ha avuto esito negativo. Ciò richiede i browser che supportano sia:
- impostazione dell'attributo
<script async>
false tramite il DOM, - o utilizzando
<script onreadystatechange=...>
su IE 6+.
- impostazione dell'attributo
Nonostante guardando il async support table, non posso dire se posso contare su sceneggiatura ordinamento in numero sufficiente i browser per questo sia fattibile.
Quindi, come posso gestire in modo affidabile l'errore durante il caricamento di uno script che non controllo?
che dire di verificare l'esistenza di qualcosa nella sceneggiatura. Come se lo script contenga un certo oggetto, cerca quello –
@CrayonViolent, è facile determinare che lo script è stato caricato. Tuttavia, ho bisogno di sapere quando controllare. Se controllo troppo presto, lo script non è stato ancora scaricato. Devo sapere come distinguere tra "non è ancora stato caricato" e "non verrà mai caricato perché ci siamo arresi". Se posso essere sicuro che il mio controllo venga eseguito dopo che lo script è stato elaborato, allora sono tutto pronto. –
beh, imo il controllo di una cosa unica all'interno dello script sarà il tuo modo più affidabile. Ma davvero non penso che ci sia un modo per farlo senza usare 'setTimeout' ogni 100ms circa per x quantità di tempo e poi rinunciare. Questo è quello che faccio in situazioni come questa, e finora non ho trovato un metodo migliore; Non penso che ne esista uno in questo momento:/ –