J'essaie de créer une fonction globale où je peux l'utiliser n'importe où dans un fichier .js
.Créer une fonction globale en JavaScript
Nous avons plus de 50 fichiers javascript joints et dans chaque fichier je veux pouvoir utiliser cette bibliothèque n'importe où.
Localized.js
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like enviroments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
if (typeof Localized !== 'undefined') {
throw 'Localized" already in use';
}
root.Localized = factory();
}
}(this, function() {
var _strings,
_readyCallback,
_isReady = false,
_requestedStrings = false;
function ready(data) {
_readyCallback = _readyCallback || function(){};
function domReady() {
// If the DOM isn't ready yet, repeat when it is
if (document.readyState !== "complete") {
document.onreadystatechange = domReady;
return;
}
document.onreadystatechange = null;
_strings = data;
_isReady = true;
_readyCallback();
}
domReady();
}
// Get the current lang from the document's HTML element, which the
// server set when the page was first rendered. This saves us having
// to pass extra locale info around on the URL.
function getCurrentLang() {
var html = document.querySelector("html");
return html && html.lang ? html.lang : "en-US";
}
var Localized = {
get: function(key) {
if (!_strings) {
console.error("[goggles.webmaker.org] Error: string catalog not found.");
return "";
}
return (_strings[ key ] || "");
},
getCurrentLang: getCurrentLang,
// Localized strings are ready
ready: function(cb) {
if (!_requestedStrings) {
_requestedStrings = true;
_readyCallback = cb;
function onload(data) {
ready(data);
}
onload.error = console.log;
var xhr = new XMLHttpRequest();
xhr.open('GET', '/strings/' + getCurrentLang() + '?bust=' + Date.now(), false);
xhr.send(null);
if (xhr.status !== 200) {
err = new Error(id + ' HTTP status: ' + status);
err.xhr = xhr;
onload.error(err);
return;
}
onload(JSON.parse(xhr.responseText));
};
if (_isReady) {
_readyCallback();
}
},
isReady: function() {
return !!_isReady;
}
};
return Localized;
}));
Je veux être en mesure d'aller dans l'une des 50 fichiers et faire Localized.get("something");
Mais je n'ai même pas l'objet Localized
disponible dans la web console. Par exemple si vous avez jQuery
vous pouvez faire $
dans la console Web et vous pouvez faire n'importe quoi là.
A l'intérieur de votre module faire quelque chose comme 'window.Localized = Localized' pour rendre le module disponible dans le monde. –
D'où exécutez-vous cela? Je m'attendrais à ce qu'il soit global à cause de 'root.Localized = factory();'. Si ce n'est pas le cas, alors ce 'que vous passez n'est pas l'objet global. Exécutez-vous cela à partir d'une autre fonction, peut-être un IIFE ou un gestionnaire document.ready? – bfavaretto
Vous avez mentionné que vous voulez répliquer comment jQuery le fait, alors pourquoi ne pas regarder la source jQuery et voir par vous-même? Si je me souviens bien, il est similaire à ce que Frank a dit – yuvi