代码之家  ›  专栏  ›  技术社区  ›  Emily

jquery和$questions

  •  11
  • Emily  · 技术社区  · 15 年前

    我正在修改一些包含大量jquery的代码,但我不确定某些jquery语句在做什么。

    在jquery代码的顶部有

    jQuery.noConflict
    

    * 1。我明白。但还有一些代码具有:

    <script type="text/javascript">
    (function($) {
    
    $(document).ready(function() {
    
        jQuery.fn.fixEmail = function() {
        {
       return $(this).each(function() {
           var $s = $(this);                  
               ...code...
            }
    }
    </script>
    

    我知道jquery之所以被使用是因为它没有冲突。参数是什么?

    * 2。在另一个函数中,它们使用

    <script type="text/javascript">
    jQuery(function(){
        var $ = jQuery;
        var cc = {
            mode : 'teaser',
            featureVisible : true,
            $loader : '<p class="loadingAnimation"><img height="32" src="' +
                    config.xoImgUrl +
                    '/images/ajax-loader.gif" width="32" /></p>',
                    ....more code...
                }
    }
    </script>
    

    所以他们正在从noconflict将$设置为jquery。但是为什么呢?他们可以使用jquery吗?

    * 3。有一个插件我想使用,它是由以下初始化的:

       var $j = jQuery.noConflict();
        var $ = {};
        $j(document).ready(function(){
            $j.history.init(pageload);
            $j("a[@rel='history']").click(function(){
                ...more code...
            });
        });
    

    我知道不合作者做了什么,但是做了什么 var $ = {} 怎么办?

    4 回复  |  直到 15 年前
        1
  •  66
  •   SolutionYogi Eric Lippert    15 年前

    例1:

    我想你错过了一些代码:

    (function($) {
    
    $(document).ready(function() {
    
        jQuery.fn.fixEmail = function() {
        {
       return $(this).each(function() {
           var $s = $(this);                  
               ...code...
            }
    }
    )(jQuery); //This line was missing in your code. 
    

    让我们重写一下这段代码,了解发生了什么。

    function complicatedFunction($) {
              // the document.ready call goes here.
    }
    

    接下来,如何调用这个函数?

    complicatedFunction(someObject);
    

    所以在复杂函数中 $ 某物 . 同意吗?

    如果你写

    complicatedFunction(jQuery);
    

    然后在函数内部, $ 指的是 JQuery 对象。因此,复杂函数内部的所有内容都可以像普通jquery用户那样使用“$”。

    回到原来的代码,如果我们决定不命名这个函数,即使其匿名,那么您可以将代码可视化为,

    (function($) { })(jQuery);
    

    您正在创建一个匿名函数,使用一个名为$的参数。 立即调用这个匿名函数,并将其传递给jquery对象。 这样,您就不会修改全局$对象,但是匿名函数中的所有代码的工作方式就像$总是可用的一样。很酷,不是吗?:)

    例2:

    jQuery(function(){
            var $ = jQuery;
            var cc = {
                    mode : 'teaser',
                    featureVisible : true,
                    $loader : '<p class="loadingAnimation"><img height="32" src="' +
                                    config.xoImgUrl +
                                    '/images/ajax-loader.gif" width="32" /></p>',
                    ....more code...
                }
    });
    

    与示例1类似,我没有看到这种类型的编码。(我甚至不确定这是否可行)

    无论如何,在传递给jquery的匿名函数内部,您可以本地化$的使用,而不影响其他代码。 是的,他们可以在任何地方简单地使用jquery对象,但这将非常冗长,不是吗?

    例3:

    var $ = {};
    

    上面一行定义了一个空对象,并将其赋给变量$。

    这和做一样,

    var $ = new Object();
    

    这类似于如何使用两种不同的语法定义数组。

    var items = [];  //same as var items = new Array();
    

    一点历史

    记住,'$没有什么内在的特殊性。它是一个变量名,和其他变量名一样。在早期,人们使用document.getElementByID编写代码。因为javascript区分大小写,所以在编写document.getElementByID时出错是正常的。我应该大写“B”或“by”吗?我应该用身份证的大写字母“I”吗?你明白了。因为函数是JavaScript中的头等公民,所以您可以一直这样做

    var$=document.getElementByID;//从document.getElementByID释放!

    当原型库到达时,他们将获得DOM元素的函数命名为“$”。几乎所有的JavaScript库都复制了这个想法。原型还引入了$$函数来使用CSS选择器选择元素。

    jquery也调整了$function,但是扩展了它,使它接受所有类型的“选择器”,以获得您想要的元素。现在,如果您已经在项目中使用了原型并希望包含jquery,那么您将遇到问题,因为“$”可以引用原型的实现,也可以引用jquery的实现。这就是为什么jquery可以选择noconflict,这样您就可以在项目中包含jquery,该项目使用原型并缓慢地迁移代码。我认为这是约翰的一个绝妙之举!:)

        2
  •  4
  •   Zach    15 年前

    在这段代码的末尾是否缺少一些代码?通常惯例是这样做:

    jQuery.noConflict();
    
    (function($){
    
    $(document).ready(function() {
    
        jQuery.fn.fixEmail = function() {
        {
       return $(this).each(function() {
           var $s = $(this);                  
               ...code...
            }
    }
    
    })(jQuery);
    

    注意,在底部,jquery作为参数传递给函数表达式,因此$等于jquery,但仅在该函数表达式中。

    他们本可以使用jquery,但可能依赖于使用$的复制/粘贴代码。

    我可能会将它们重构为使用类似于1中提到的约定。我不知道他们为什么把美元设定为一个物体,但它有一股难闻的气味。

        3
  •  0
  •   Chris Brandsma    15 年前

    这个代码有一股臭味。他们使用的是另一个javascript库吗?

    1. $通常是jquery函数,但我相信原型也使用它。这可能是原型代码吗? 2:你说得对。至少我想不出原因。 3:重置为新对象。基本取消jquery
        4
  •  0
  •   Amal Sirisena    15 年前

    我想你见过这个 Using jQuery with other JS libraries ?我认为该页面回答了您的问题(请参阅页面底部的JQuery参考魔法-快捷方式部分)。

    总结:

    1. 传递$是一种在函数块中使用jquery的方法,而不永久覆盖它。
    2. 我只能说作者更喜欢简明扼要的$而不是jquery。
    3. 这是在另一个街区吗?为了方便起见,我认为他们希望重用$用于其他目的,而不必永久覆盖它。

    在您发布的代码中,不同的冲突避免机制的用法有点不一致,因此如果您能够重构,那么您可能需要重构这些机制。