【问题标题】:Javascript - script load orderJavascript - 脚本加载顺序
【发布时间】:2012-04-04 20:20:06
【问题描述】:

我有这个代码:

$("#pop_mali_oglas").on('click', function(){
        TINY.box.show({url:'<?php echo base_url()?>form/novi_unos/<?php echo $p ?>'});
        $.getScript("<?php echo JS ?>vendor/jquery.ui.widget.js");
        $.getScript("<?php echo JS ?>tmpl.min.js");
        $.getScript("<?php echo JS ?>load-image.min.js");
        $.getScript("<?php echo JS ?>canvas-to-blob.min.js");        
        $.getScript("<?php echo JS ?>bootstrap.min.js");        
        $.getScript("<?php echo JS ?>bootstrap-image-gallery.min.js");     
        $.getScript("<?php echo JS ?>jquery.iframe-transport.js");
        $.getScript("<?php echo JS ?>jquery.fileupload.js");
        $.getScript("<?php echo JS ?>jquery.fileupload-ip.js");
        $.getScript("<?php echo JS ?>jquery.fileupload-ui.js");
        $.getScript("<?php echo JS ?>locale.js");        
        $.getScript("<?php echo JS ?>main.php");       
        return false;                    
});

第一行最后加载(TINY.box.show({url:'&lt;?php echo base_url()?&gt;form/novi_unos/&lt;?php echo $p ?&gt;'});),我需要先加载它,然后再加载其余部分。我该怎么做?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    我猜第二个参数 (ajax true|false) 默认为 true,这就是为什么它似乎是最后加载的原因。传入一个 0 作为第二个参数来强制它是同步的。

    【讨论】:

    • 不!同步是邪恶的!邪恶的我告诉你。说真的,尽管 JavaScript 人需要对异步操作感到满意,因为它们无处不在。同步并不邪恶,但会阻塞用户界面,让用户感到难过。
    • @tkone - 两者我都很满意,这取决于具体情况。我只是向 OP 指出,第二个参数指定异步或非异步,这就是它似乎最后加载的原因。
    • 我主要是在开玩笑。 :)
    【解决方案2】:

    这些是异步加载的——它们会以它们加载的任何顺序出现。为了确保一个在其余部分之前加载,最好的办法是加载一个,然后在触发的回调中加载其他的第一次加载。

    类似

    $.getScript(first script to load, function(){
        // other get script functions
    });
    


    编辑

    显然这不是关于脚本加载而是执行顺序。

    第一个 tinybox 行首先执行,但是,在其他行执行并返回之前,调用它的结果可能不可见。这可能是由于 tinybox 命令正在异步加载文件。我上面的答案仍然适用,但您需要了解 tinybox 如何在异步事件成功完成后执行回调。

    【讨论】:

    • 唯一的问题是他想首先运行的函数不是 getscript ;)
    • 什么意思?你知道op吗?为什么这不起作用?
    • 我之前给他这个方法尝试过,他没有成功(我的意思是 /beforeedit/ 想法),不知道为什么它不起作用控制台什么也没给出
    • 因此编辑和如何解决的建议。 TINY.box 所做的任何事情都需要提供回调以在完成后运行其他代码。否则没有简单的方法来做到这一点。
    • 是的,我试图在我的最新尝试中将它放在回调类型的包装器中,但我怀疑我认为你需要在 TINY.box 进程中附加回调是正确的
    【解决方案3】:

    问题是所有脚本都是异步加载的,这基本上意味着它们都被同时触发,这意味着它们很可能会破坏一切。如果您依赖它们按顺序加载..

    查看this past answer 了解运行函数或任何 javascript 的方法。

    就像 tkone 在他的示例中展示的那样,该函数将首先运行 TINY.box.show 函数,然后再运行所有 $.getScript 函数。

    $("#pop_mali_oglas").on('click', function(){
              scriptload(function() {
              getscripts()
              return false; 
            });
    });
    
    function scriptload(callback) {
     tinyboxfunc()
     callback();
    } 
    
    function tinyboxfunc() {
    TINY.box.show({url:'<?php echo base_url()?>form/novi_unos/<?php echo $p ?>'}); 
    };
    
    function getscripts() {
                $.getScript("<?php echo JS ?>vendor/jquery.ui.widget.js");
                $.getScript("<?php echo JS ?>tmpl.min.js");
                $.getScript("<?php echo JS ?>load-image.min.js");
                $.getScript("<?php echo JS ?>canvas-to-blob.min.js");        
                $.getScript("<?php echo JS ?>bootstrap.min.js");        
                $.getScript("<?php echo JS ?>bootstrap-image-gallery.min.js");     
                $.getScript("<?php echo JS ?>jquery.iframe-transport.js");
                $.getScript("<?php echo JS ?>jquery.fileupload.js");
                $.getScript("<?php echo JS ?>jquery.fileupload-ip.js");
                $.getScript("<?php echo JS ?>jquery.fileupload-ui.js");
                $.getScript("<?php echo JS ?>locale.js");        
                $.getScript("<?php echo JS ?>main.php"); 
    };
    

    【讨论】:

    • 这不起作用。只加载了 TINY.box,没有调用 $.getScript。
    • 你检查过控制台有什么吗?
    • 是的,只有一个响应,来自 TINY.box。
    • 它正在工作,但是,TINY.box 再次加载最后。postimage.org/image/71j04jqn7/full
    • 发生了一些奇怪的事情:D。依然没有。我认为最好放弃,尝试其他方法。就像一级方程式赛车手或屠夫。
    【解决方案4】:

    您应该在 $.getScript 之前设置$.ajaxSetup

     $.ajaxSetup({
      async: false
     });
    

    郑重声明,$.getScript() 确实是异步执行的,所以在使用前先设置好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多