【问题标题】:How to store a global value (not necessarily a global variable) in jQuery?如何在 jQuery 中存储全局值(不一定是全局变量)?
【发布时间】:2011-02-21 10:50:24
【问题描述】:

目前我正在开发一个使用大量 JavaScript、jQuery、Microsoft 客户端 JavaScript 和其他库的旧网页。底线 - 我不能从头开始重写整个页面,因为业务无法证明它的合理性。所以……就是这样。无论如何,我需要用一个变量来污染(我真的没有尝试过)全局命名空间。我正在考虑三个选项-

  1. 只需使用普通的 JavaScript 声明存储/检索它 - var x = 0;

  2. 使用 jQuery 存储/检索 DOM 标签中的值 - $("body").data("x", 0);

  3. 使用隐藏的表单字段,并使用 jQuery 设置/检索值 - $("whatever").data("x", 0);

有没有更好的方法?我查看了现有的一堆代码,我不相信变量可以在函数中作用域。

【问题讨论】:

    标签: javascript jquery global-variables


    【解决方案1】:

    您可以在 jQuery 对象中创建命名空间,如下所示:

    $.mynamespace = { 
        myVar : "something", 
        myVar2 : "somethingElse" 
    }; 
    

    或:

    $.mynamespace = {};
    $.mynamespace.myVar = "something";
    $.mynamespace.myVar2 = "somethingElse";
    

    请记住,任何名为“mynamespace”的插件方法都将被覆盖,因此请务必使用合理的名称。

    【讨论】:

    • 为什么要把命名空间变量声明为jQuery的一个属性?!
    • @Pedro - 不需要。我只是指出这是一种可能性。
    • 如果我要使用这个,我在哪里声明呢?我所有的 javascript 代码都在一个 JS 文件中。我不想将 JavaScript 代码与 HTML 代码混在一起。
    • 这是一个愚蠢的解决方案,它很容易在声明的命名空间与 jQuery 对象的变量和方法之间发生名称冲突。我不明白这个解决方案的价值。对我来说,这不好。
    • 我可以在所有 iframe 表单父级中使用这个全局变量吗?
    【解决方案2】:

    对我来说处理这种情况的最好方法是在窗口对象中定义一个对象:

    window.my_config =
    {
        my_var1 : 1,
        my_var1 : 2,
        my_var1 : 3
    };
    

    这将使您的示波器保持整洁。每当您使用 window.my_config 访问全局时,任何查看代码的人都会知道正在访问全局。

    【讨论】:

    • 这对我来说比使用 jquery 命名空间更有意义。这种方式有什么理由不能很好或更好地工作吗?
    【解决方案3】:

    您可以在全局范围内创建一个哈希并将其用作命名空间:

    MyNamepace={}
    MyNamespace.newvar = 'value'
    // MyNamespace.newvar => 'value'
    

    【讨论】:

    • 这是一个愚蠢的解决方案,它很容易在声明的命名空间与其他全局变量和方法之间发生名称冲突。我不明白这个解决方案的价值。对我来说,这很糟糕。
    • 您可以控制全局范围内存在哪些名称,但您无法控制更新时可能添加到 jQuery 的方法和变量名称。这是命名空间在许多语言中明确存在的重要原因之一。当他们不这样做时,名称开始变得奇怪(即:Smalltalk-systems 类名)
    • 并非总是如此。没有什么可以阻止一些流氓库覆盖您的哈希。本质上,您无法避免没有显式命名空间的问题。这就是为什么 jQuery 模块编写文档建议在 jQuery 对象中使用单个散列以用于命名空间,因为 jQuery 命名空间事实上仅限于流行的插件。
    【解决方案4】:

    只是与您分享我的实践,我会在所需的 JavaScript 文件中创建一个带有合理前缀的全局对象/var,就像我正在处理一个该对象将是一个文本框的页面,然后我会命名它:

    g_TxtMyValue = 'value';    // g_ specifies it to be a global variable, it is one
                               // of the many conventions used
    

    如果你有多个全局变量,你也可以有一个命名空间,例如:

    my_txt = {};  // For a real site I would use a prefix relative to the project
                  // name instead of "my".
    
    my_txt.testValueOne = 'Value one';
    my_txt.testValueOne = 'Value two';
    

    这些变量在初始化后将在整个网站上可供您使用。

    我希望这会有所帮助。

    【讨论】:

      【解决方案5】:

      使用下划线isEmpty()

      _.isEmpty('') 将返回 true

      【讨论】:

        【解决方案6】:

        只是一个简短的通知:

        fancybox 是否在做 AJAX(意思是:如果它在 iFrame 中加载,则应在 close 方法中添加“父级”),如下所示:

        parent.$.fancybox.close();
        

        【讨论】:

          猜你喜欢
          • 2016-01-24
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多