Je développe un widget javascript qui dépend de jQuery. Le widget peut ou non être chargé sur une page où jQuery est déjà chargé. Il y a plusieurs problèmes qui se posent dans ce cas...
-
Si la page Web ne contient pas de jQuery, je dois charger mon propre jQuery. Il semble toutefois y avoir un problème délicat de synchronisation lors de cette opération. Par exemple, si mon widget se charge et s'exécute avant que jQuery n'ait fini de se charger et de s'exécuter, j'obtiens une
jQuery is not defined
erreur. -
Si la page web contient jQuery, je peux généralement travailler avec. Toutefois, si la version de jQuery est ancienne, j'aimerais charger la mienne. Mais si je charge ma propre version, je dois le faire de manière à ne pas piétiner la page web.
$
variable. Si je règlejQuery.noConflict()
et tous leurs scripts dépendent de$
alors je viens de casser leur page. -
Si la page Web utilise une autre bibliothèque javascript (par exemple, prototype), je devais tenir compte de l'utilisation de la bibliothèque prototype.
$
variable également.
En raison de tout ce qui précède, il semble plus facile de ne pas dépendre de jQuery. Mais avant de m'engager dans cette voie, qui impliquera surtout de réécrire le code de mes widgets, je voulais d'abord vous demander conseil.
Le squelette de base de mon code, y compris le bogue de synchronisation et parfois $
bugs, suit :
<script type="text/javascript" charset="utf-8">
// <![CDATA
if (typeof jQuery === 'undefined') {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = '{{ URL }}/jquery.js';
head.appendChild(script);
}
// ]]>
</script>
<script type="text/javascript" src="{{ URL }}/widget.js"></script>
Mon widget a la structure suivante :
(function($) {
var mywidget = {
init: function() {
...
}
};
$(document).ready(function() {
mywidget.init();
});
})(jQuery);
Si vous avez des conseils ou des ressources pour créer un widget qui puisse fonctionner dans tous les environnements mentionnés, nous vous en remercions.