browserify and document ready?

后端 未结 5 1017
慢半拍i
慢半拍i 2021-02-08 00:28

I\'m struggling with using Browserify and document ready events. How do I craft a module that exports content only available after the document ready event has fired? How do I

相关标签:
5条回答
  • 2021-02-08 01:05

    This works for me in one project, not sure it can work always.

    Put the script, for example: <script src="/path/to/main.js"></script> right before </body>.

    In the file going to be browserify the-file.js -o main.js.

    // the-file.js:
    
    var $ = require("jquery");
    
    //......
    
    window.$ = $;  // window is the global object in browsers
    $(document).ready(function(){
        // all the old things here ....
    });
    

    Another way might be better:

    // the-file.js:
    
    var $ = require("jquery");
    
    //......
    
    (function($){
    
        $(document).ready(function(){
            // all the old things here ....
        });
    
    })($); // Anonymous function get called with $.
    
    0 讨论(0)
  • 2021-02-08 01:10

    I would suggest to use window.onload Something along the lines of

    const main = () => {
    
    //Your logic here
    
    }
    
    window.onload = main;

    0 讨论(0)
  • 2021-02-08 01:13

    Usually you have one master file that fires up the entire application, so you can simply wrap it in the ready callback. It doesn't make much sense to do anything before the document is ready anyway. Sure you could return a function in every single file that does DOM manipulation, but that would turn into a mess quickly.

    document.addEventListener('DOMContentLoaded', function () {
        var app = require('./app');
        // ...
    });
    
    0 讨论(0)
  • 2021-02-08 01:18

    Try this:

    var domready = require("domready");
    
    domready(function () {
        exports.something = /* whatever you want */
    });
    

    You'll need to download the domready package:

    npm install domready
    

    Then just use browserify:

    browserify input.js -o output.js
    

    Yes. It's that simple.


    Consider that we have two files: library.js and main.js.

    // library.js
    
    var domready = require("domready");
    
    domready(function () {
        exports.test = "Hello World!";
    });
    
    // main.js
    
    var library = require("./library");
    var domready = require("domready");
    
    domready(function () {
        alert(library.test);
    });
    

    As long as you require your library before you register your main domready function you should be able to use your library seamlessly.


    Sometimes you may wish to set module.exports to a function. In that case you can use the following hack:

    // library.js
    
    var domready = require("domready");
    
    module.exports = function () {
        return exports._call.apply(this, arguments);
    };
    
    domready(function () {
        exports._call = function () {
            alert("Hello World!");
        };
    });
    
    // main.js
    
    var library = require("./library");
    var domready = require("domready");
    
    domready(function () {
        library();
    });
    

    Note that the _call property is not in any way special.

    0 讨论(0)
  • 2021-02-08 01:26

    Instead of listening for a ready event, you can put your browserify bundle in a deferred script tag:

    <script src="bundle.js" defer></script>
    

    This allows you to remove the ready wrapper completely since the bundle will not be executed until the DOM is loaded.

    Unfortunately support of defer is patchy, and I don't recommend it unless you don't have to support IE < 10. Consider this answer one for the future, as browser support for it grows.

    0 讨论(0)
提交回复
热议问题