Javascript 如何延迟document.ready直到设置变量?

Javascript 如何延迟document.ready直到设置变量?,javascript,jquery,qunit,Javascript,Jquery,Qunit,我在IFRAME中进行QUnit测试,并且有一个递归JavaScript函数,在启动QUnit之前将父页面中的所有脚本加载到IFRAME中。这很有效。我的问题是,我们的一些脚本使用document.ready启动 例如: $(document).ready(function () { // blah }); 做他们的工作。我不希望仅仅为了测试而更改生产代码,我也不希望这些生产脚本在加载每个脚本之前认为IFRAME文档已经“就绪” 如何延迟“document.ready”本身 以下是我的

我在IFRAME中进行QUnit测试,并且有一个递归JavaScript函数,在启动QUnit之前将父页面中的所有脚本加载到IFRAME中。这很有效。我的问题是,我们的一些脚本使用document.ready启动

例如:

$(document).ready(function () {
    // blah
});
做他们的工作。我不希望仅仅为了测试而更改生产代码,我也不希望这些生产脚本在加载每个脚本之前认为IFRAME文档已经“就绪”

如何延迟“document.ready”本身

以下是我的伪代码,为您提供了一个示例:

scripts[0] = "/foo/bar.js";
scripts[1] = "/blah/blah.js";

function RecursiveScriptStart(){
    // I want to set document.ready = false right here!
    if(scripts.length == 0) {
        QUnitStart();
        return;
    }
    RecursiveScriptLoader(0, scripts);
}

function RecursiveScriptLoader(currentScriptID, scripts) {
    $.getScript(scripts[currentScriptID], function () {
        if (currentScriptID == (scripts.length - 1)) {
            QUnitStart();
        }
        else {
            RecursiveScriptLoader(currentScriptID + 1, scripts);
        }
    });
}


function QUnitStart() {
        // I want to set document.ready = true right here!
        QUnit.stop();
        QUnit.start();
}
实际的代码与此类似,但涉及一个jquery选择器,该选择器使用JavaScript标记“src”属性填充数组“
scripts[]


谢谢

如果您使用的是jQuery 1.6+,那么您可以使用。只需在脚本顶部设置
$.holdReady(true)
,然后在
QUnitStart
的开头设置
$.holdReady(false)
如果您使用jQuery 1.6或更高版本,则可以使用它延迟启动就绪事件

对于1.4.3或更高版本,可以使用$.readyWait属性延迟就绪事件(不是我的代码)

如果您有兴趣了解jquery如何处理该行的就绪事件搜索

jQuery( document ).trigger( "ready" ).unbind( "ready" );

在jquery.js的开发者副本中,您可以在test.html中使用此加载顺序来填充其他人留下的内容

<script src="jquery.js"></script>
<script src="qunit.js"></script>
<script>$.holdReady(true);</script>
<script src="theThingIwantToTest.js"></script>
<script src="theTestScript.js"></script>

$.holdReady(真);

setInterval(函数(){
log(document.getElementById('waitForMe');
}, 500);
之前
之后
扩展测试,我已经测试了RequireJs domReady插件

<html lang="en">
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="/vendor/require/require.js"></script>
        <script type="text/javascript">
            window.setInterval(function() {
                console.log(document.getElementById('waitForMe'));
            }, 500);

            require.config({
                baseUrl: '/',
                paths: {
                    domReady: 'vendor/require/plugin/dom-ready',
                    jQuery: 'vendor/jquery'

                },
                shim: {
                    async: {
                        exports: 'async'
                    },
                    jQuery: {
                        exports: 'jQuery'
                    }
                }
            });

            require(['domReady', 'jQuery'], function(domReady, $) {
                console.log('jQuery loaded');
                $(function() {
                    console.log('jQuery dom ready');
                });

                domReady(function() {
                    console.log('domReady requireJs plugin, callback');
                })
            });

            require(['domReady!', 'jQuery'], function(domReady, $) {
                console.log('domReady! (no callback)');
            });

            require(['domReady', 'jQuery'], function(domReady, $) {
                console.log('domReady plugin loaded');
            });
        </script>
    </head>
    <body>
        Before
        <script type="text/javascript" src="/php-with-sleep.php"></script>
        After
        <div id="waitForMe"></div>
    </body>
</html>

setInterval(函数(){
log(document.getElementById('waitForMe');
}, 500);
require.config({
baseUrl:“/”,
路径:{
domReady:'供应商/要求/插件/dom就绪',
jQuery:'供应商/jQuery'
},
垫片:{
异步:{
导出:“异步”
},
jQuery:{
导出:“jQuery”
}
}
});
require(['domReady','jQuery'],函数(domReady,$){
log('jQuery-loaded');
$(函数(){
log('jquerydom ready');
});
domReady(函数(){
log('domReady requireJs plugin,callback');
})
});
require(['domReady!','jQuery'],函数(domReady,$){
log('domReady!(无回调)');
});
require(['domReady','jQuery'],函数(domReady,$){
log('domReady plugin loaded');
});
之前
之后

这个代码对我有用;调用
$(窗口).load()
$(文档).ready()中


此方法将通过确保上次运行的代码未传递给
$(窗口)来保留所有情况下的执行顺序。加载()
,直到所有
$(文档).ready()
脚本完成。

问题可能会有所帮助。@htellez如果没有jQuery,您将不会有
$(文档).ready()
块,因此,为了回答这个问题,我们必须了解更多关于您正在使用什么的细节。也许最好作为一个单独的问题来问,而不是在对这个问题的评论中。
<html lang="en">
    <head>
        <meta charset="utf-8">
        <script type="text/javascript" src="/vendor/require/require.js"></script>
        <script type="text/javascript">
            window.setInterval(function() {
                console.log(document.getElementById('waitForMe'));
            }, 500);

            require.config({
                baseUrl: '/',
                paths: {
                    domReady: 'vendor/require/plugin/dom-ready',
                    jQuery: 'vendor/jquery'

                },
                shim: {
                    async: {
                        exports: 'async'
                    },
                    jQuery: {
                        exports: 'jQuery'
                    }
                }
            });

            require(['domReady', 'jQuery'], function(domReady, $) {
                console.log('jQuery loaded');
                $(function() {
                    console.log('jQuery dom ready');
                });

                domReady(function() {
                    console.log('domReady requireJs plugin, callback');
                })
            });

            require(['domReady!', 'jQuery'], function(domReady, $) {
                console.log('domReady! (no callback)');
            });

            require(['domReady', 'jQuery'], function(domReady, $) {
                console.log('domReady plugin loaded');
            });
        </script>
    </head>
    <body>
        Before
        <script type="text/javascript" src="/php-with-sleep.php"></script>
        After
        <div id="waitForMe"></div>
    </body>
</html>
$(document).ready(function() {
    $(window).load(function() {
        // this code will run after all other $(document).ready() scripts
        // have completely finished, AND all page elements are fully loaded.
    });
});