2013-08-16 6 views
2

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à.

+1

A l'intérieur de votre module faire quelque chose comme 'window.Localized = Localized' pour rendre le module disponible dans le monde. –

+1

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

+0

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

Répondre

0

Il se trouve que mon javascript est globalement défini et accessible partout dans le fichier qui est inclus et il peut être appeler à partir de la console aussi bien, sauf que je dois initialiser qu'en faisant Localized.ready(function(){}); alors je peux obtenir pour travailler.

Donc, si quelqu'un cherche à créer sa propre fonction globale et à la rendre standard, il peut suivre cette voie.

amdWeb.js est ce que j'utilise comme standard pour créer une fonction globale.

1

Avez-vous déjà regardé la fonction globale de Three.js? C'est super facile à comprendre!

(function (global, factory) { 
 
\t typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : 
 
\t typeof define === 'function' && define.amd ? define(['exports'], factory) : 
 
\t (factory((global.THREE = global.THREE || {}))); 
 
}(this, (function (exports) { 'use strict';

Questions connexes