Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在加载jQuery之前预注册处理程序?_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 是否可以在加载jQuery之前预注册处理程序?

Javascript 是否可以在加载jQuery之前预注册处理程序?,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,jQuery在页面上加载较晚,但依赖jQuery可用的javascript在jQuery之前加载的情况非常常见,特别是如果您遵循将脚本放在附近的做法 所以基本上我想从这里开始: <script> someFunctionThatUsesLateJQuery(){ [code that relies on jQuery] } </script> ... <script src="jquery.js"></script> <script&

jQuery在页面上加载较晚,但依赖jQuery可用的javascript在jQuery之前加载的情况非常常见,特别是如果您遵循将脚本放在
附近的做法

所以基本上我想从这里开始:

<script>
  someFunctionThatUsesLateJQuery(){ [code that relies on jQuery] }
</script>

...

<script src="jquery.js"></script>
<script>
  $(function(){
    someFunctionThatUsesLateJQuery();
  });
</script>

使用jQuery()的某些函数{[依赖于jQuery的代码]}
...
$(函数(){
使用SlatejQuery()的某些函数;
});
对这样的事情:

<script>
  _$.ready(function(){ [code that relies on jQuery] });
</script>

...

<script src="jquery.js"></script>

_$.ready(函数(){[依赖于jQuery的代码]});
...
与异步统计跟踪(ála Google Analytics)非常相似,是否有任何东西允许您在加载jQuery后注册要执行的javascript函数调用,而不会出现可怕的
$is undefined
错误

我的意思是在不注册和取消注册超时/间隔的情况下进行此操作。

是否曾经/是否有可能向jQuery添加某种类型的预注册变量,一旦加载,jQuery就会识别和处理这些变量

用例: 值得注意的是,我得到的特定用例是一个drop-in JS小部件,我希望在
放置的场景中发生一些DOM操作,因此在
附近发生jQuery加载的情况下,它很可能在jQuery加载之前出现


然后,我不想要求用户在代码执行的正确点注册特定的函数调用(这取决于它们的实现),从而进一步加重用户的负担。。。我希望它能“正常工作”

当所有函数调用移到数据属性时,您可以尝试使用通用和流行的解决方案。然后,在加载jQuery时,抛出所有具有此类属性的DOM元素并运行这些函数。 也就是说,您可以添加
数据类型='load'数据函数='YourNamespace.yourFunctionName'
,而不是函数调用。在window.load事件之后,您可以通过
$('[data type=“load”]')
选择所有元素,对它们进行迭代,然后执行函数调用


UPD:猜测,异步函数队列模式可用于阅读以下内容:

根据建议,您可以尝试以下方法:

(function() {
    var runMyCode = function($) {
        // jquery-dependent code here
        $("#foo").data('bar', true);
    };

    var timer = function() {
        if (window.jQuery && window.jQuery.ui) {
            runMyCode(window.jQuery);
        } else {
            window.setTimeout(timer, 100);
        }
    };
    timer();
})();
我还发现了一个更复杂的解决方案,但我个人更喜欢上面的解决方案

无超时更新:

<script>
var runMyCode = function($) {
    // jquery-dependent code here
    $("#foo").data('bar', true);
};
</script>

...

<script src="jquery.js"></script>
<script>
    $(function(){
        runMyCode(window.jQuery);
    });
</script>

var runMyCode=函数($){
//这里是jquery相关代码
$(“#foo”).data('bar',true);
};
...
$(函数(){
runMyCode(window.jQuery);
});

如果插入jQuery脚本include,则可以侦听onload事件

function loadJS(url, onloadCallback, elId){
//Inject script include into HEAD
    var scriptEl = document.createElement('script');
    scriptEl.type = 'text/javascript';
    scriptEl.src = url;
    if(elId)scriptEl.id = elId;
    document.getElementsByTagName('head')[0].appendChild(scriptEl);

    if(onloadCallback){
        scriptEl.onload = scriptEl.onreadystatechange = function(){
            if(!scriptEl.readyState || (scriptEl.readyState === 'complete' || scriptEl.readyState === 'loaded')){
                onloadCallback();
                scriptEl.onload = scriptEl.onreadystatechange = null;
            }
        }
    }
}

loadJS("http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function(){
    console.log( window.$ );
});

也许我不完全理解这个用例,但RequireJS听起来可能是一个不错的选择:


例如,您可以看到我为过去的项目编写的小JSLib,谢谢Dmitry,这是一种有趣的方法。不幸的是,它仍然要求在jQuery加载后解析实际运行的代码,这正是我试图解决的问题avoid@Simon我几乎可以肯定,在jQuery加载之后,如果不对代码进行后期处理,您将无法找到解决方案。无论如何,你需要弄清楚在库加载之前发生了什么,然后你必须做smth。我同意。问题的关键不一定是要找到解决方案,而是要强调解决方案的必要性。我认为这需要在jQuery中进行烘焙。诚然,这样做不一定合适,但我正在测试水域并检查它是否已经完成。@Simon在这种情况下,最好的选择是直接向jQuery提交问题。设置超时不是个好主意,但是从第一个视图来看,您提供的第二个链接看起来不错。谢谢您的建议,但我明确表示我不想使用计时器。您链接到的另一个解决方案基本上是我的想法,但我想知道是否有任何计划将其包含在jQuery中。对不起,超时函数,那么在加载jQuery后将jQuery传递给预定义函数的第二个解决方案呢?正如我所说,这几乎正是我的建议,所以这是一个很好的发现。问题是它不是jQuery的一部分,所以我不能指望它是可用的(查看最新更新重用案例)编辑:刚刚意识到你的意思是你的第二个更新建议。正如krillgar所说,它实际上没有任何好处,仍然存在同样的问题;在这种情况下,我现在能想到的最接近的解决方案就是链接中描述的那个。我很想知道你将如何解决这个问题!您希望“立即”执行哪种DOM操作,而这种操作不能等待jQuery加载,并且还会导致第二次通过您的DOM?我不希望立即执行DOM操作。我只想在jQuery准备就绪时进行操作,而不必让“开发人员”编写单独的调用,那么为什么要在jQuery加载之前进行第一次调用呢?对于开发人员来说,调用函数真的不应该被视为一种“负担”。它还将有助于确保一切按正确的顺序进行。特别是如果你对你的JavaScript采用面向对象的方法,它并不是一个复杂的“需求”。如果你检查我的用例,它实际上只是关于整洁和能够保证在单个
标记中工作的代码。这是与第三方打交道,并尽量减少支持请求
define(["jquery", "jquery.alpha", "jquery.beta"], function($) {
    //the jquery.alpha.js and jquery.beta.js plugins have been loaded.
    $(function() {
        $('body').alpha().beta();
    });
});