2

我们在网站的 HEAD 中有这个,我们不确定它的作用。这可能是咨询公司遗留下来的调试问题?感谢您提供任何线索。

<script>
    (function (r) {
        _ready = {
            q: function () {
                return r;
            }
        };
        $ = function (f) {
            if (typeof f === "function") {
                r.push(arguments);
            }
            return $;
        };
        jQuery = $.ready = $;
    }([]));
</script>

仅供参考,我们批判性地看待这个的原因是它似乎与其他一些 jquery 库发生冲突,例如 NRelate 的。

4

4 回答 4

7

肯定会有所帮助

从上面给出的链接,

它在加载 jQuery 之前设置 jQuery.ready 回调

例如

假设你有 jQuery 这样的 body,

 <div id="main">
        <script>
            $(function(){
                $("#main").prepend( "<p>Heyo!</p>" );
            });
        </script>
    </div>
    <div>...more HTML...</div>
    <script src="/js/jquery.js"></script>

它不会工作,因为 jQuery 是在底部加载的,而您正试图在此之前使用它。

所以,我们做这个解决方法,

<head>
    <script>
        (function(a){
             _ready = {
                q: function () {
                  return r;
                }
               };

             $ = function (f) {
               if (typeof f === "function") {
                r.push(arguments);
               }
             return $;
            };

            jQuery=$.ready=$;
        }([]));
    </script>
</head>
<body>
    <div id="main">
        <script>
            $(function() {
                $( "#main" ).prepend( "<p>Heyo!</p>" );
            });
        </script>
        <div>...more HTML...</div>
    </div>
    <script src="/js/jquery.js"></script>
    <script>
        (function( i, s, q, l ) {
            for( q = window._ready.q(), l = q.length; i < l; ) {
                $.apply( this, s.call( q[ i++ ] ) );
            }
            window._ready.q = undefined;
        }( 0, Array.prototype.slice ));
    </script>
    <script src="/js/scripts.js"></script>
</body>

第一个脚本的作用是通过将任何对 $.ready 的调用的参数存储到数组中来模拟 jQuery 的 ready 函数,其中第一个参数是函数。这个数组对于我们的全局作用域的_ready.q方法是私有的,当被调用时,它会返回这个数组。

第二个脚本通过调用循环遍历数组_ready.q(),然后将最初传递给冒名顶替者 $.ready 的参数应用于真正的 $.ready。



PS它是一个自调用函数,其中一个空数组与变量 name 一起传递r。参考这个

于 2012-05-25T21:26:45.500 回答
3

r将是最后传递给函数的空数组。

完全注释的副本:

//         v--- receives the [] passed in below
(function (r) {
    // Creates an implicit global variable called `_ready`
    // (or overwrites one that's already there)
    _ready = {
        // Makes `r` available via `_ready.q()` or
        // `window._ready.q()`
        q: function () {
            return r;
        }
    };
    // Creates an implicit global variable called `$`
    // (or overwrites one that's already there)
    $ = function (f) {
        if (typeof f === "function") {
            r.push(arguments);
        }
        return $;
    };

    // Creates/overwrites the global variable `jQuery` and `$.ready`
    // with the function defined above
    jQuery = $.ready = $;
}([]));
//^^-- the value passed to r

似乎允许您创建一个函数数组,以便在实际加载 jQuery 时根据您接管jQuery$$.ready符号来调用。实际执行此操作的代码未显示。_ready.q()通过(或)实际使用该数组的任何代码都可以访问该数组window._ready.q()

并且说它令人费解并且需要认真评论(更不用说宣布隐含的全局 -不寒而栗 - )将是轻描淡写。

也可以看看:

于 2012-05-25T21:23:32.833 回答
2

它可能在实际加载 jQuery 之前创建所有调用的 jQuery 函数(和提供的参数)的列表。

我希望您会找到其他一些代码,这些代码会在_ready.q()实际加载后读取 jQuery 的内容并将其传递给 jQuery。

于 2012-05-25T21:29:19.400 回答
0

r是位于底部的空数组[],基本上r是数组的别名,将在匿名函数内部使用,因此r.push会将项目推入空数组

(function(){ ... })()被定义为匿名函数。

于 2012-05-25T21:26:41.363 回答