【问题标题】:Global variable can't be accessed through window object - intermittently(?!)无法通过窗口对象访问全局变量 - 间歇性(?!)
【发布时间】:2014-02-01 12:52:13
【问题描述】:

我有两个页面,都具有相似的结构 - 带有如下 id 标签的表格

<TABLE id="assetsTable1" width="100%" class="tableWrapDataClass"> ...

<table id="vocationalRevenueTable" class="revenue" width="100%"> ...

两个页面都使用几乎相同的 JavaScript 代码。但是全局变量的值在第 2 页上的行为不同!

这是第 1 页的 sn-p;

<script type="text/javascript" src="templates/footer.js"></script>
<script type="text/javascript" src="script/jquery-1.8.1.js"></script>
<script type="text/javascript" src="script/scripts.js"></script>
<script>
                $(document).ready(function() {
                    var assetsTable1 = $('#assetsTable1');
                    var assetsTable2 = $('#assetsTable2');
                    var liabilitiesTable1 = $('#liabilitiesTable1');
                    var liabilitiesTable2 = $('#liabilitiesTable2');
                    var shareholderTable = $('#shareholderTable');

                    // note not all subtotals are shown
                    $("#A2Row1").hide();
                    $("#A2Row2").hide();
                    $("#L2Row1").hide();
                    $("#L2Row2").hide();
                    console.log(window.assetsTable1);
                });
                // etc

从第 2 页开始,

<script type="text/javascript" src="templates/footer.js"></script>
<script type="text/javascript" src="script/jquery-1.8.1.js"></script>
<script type="text/javascript" src="script/scripts.js"></script>
<script>
                $(document).ready(function() {
                    var vocRevTableRef = $('#vocationalRevenueTable');
                    var nonVocRevTableRef = $('#nonVocationalRevenueTable');
                    var otherRevTableRef = $('#otherRevenueTable');

                    // note not all subtotals are shown initially
                    $("#vocationalRevenueTableSub").hide();
                    $("#nonVocationalRevenueTableSub").hide();
                    $("#otherRevenueTableSub").hide();
                    console.log(window.vocRevTableRef);
                });
                // etc

在 Firebug 中,第 1 页上的 console.log() 调用显示得很合理

<table id="assetsTable1" class="tableWrapDataClass" width="100%">

然而,在第 2 页,它返回

undefined

但是,如果我修改两个页面上的 console.log() 调用以删除“窗口”。位,例如;

console.log(assetsTable1);

console.log(vocRevTableRef);

一切恢复正常。在这两种情况下,Firebug 都会显示对象

Object[table#vocRevTableRef.tableWrapDataClass]

Object[table#assetsTable1.tableWrapDataClass]

window 对象出了点问题。当然,这完全是令人抓狂的。我可能会错过什么?我应该寻找什么来调试这个? (HTML 似乎没有格式错误。)我只是试图将有问题的对象引用传递到一个函数中,该函数从 thePassedReference.tbodies 中提取行并将它们求和,但当然它在第 2 页上失败了,因为它很神秘传递一个未定义的值。哈!谢谢。

【问题讨论】:

    标签: javascript jquery global-variables window-object


    【解决方案1】:

    这两个变量都不是全局变量,第一个示例有效,因为浏览器允许通过其 ID a'la window.IdOfAnElement 访问元素(示例 1 中元素的 id 等于变量名)。

    注意:console.log 显示 DOMNode 的标记,当它显示变量的内容时,结果将是 jQuery 对象,而不是 DOMNode

    【讨论】:

    • “浏览器”是一个广义的术语。例如,Firefox 不会将这些元素公开为全局变量。
    • 你说得对,这似乎在最新版本之一中发生了变化。
    【解决方案2】:

    var vocRevTableRef 不是全局变量 - 删除 'var' 它将变为一个。当然,您的其他所谓的全局变量也是如此。第二个示例中的 Console.log 不起作用,因为隐藏元素 $("#vocationalRevenueTableSub").hide(); 变得无法访问。

    【讨论】:

      【解决方案3】:

      在第一页,你可以访问window.assetsTable1,因为你有一个带有id="assetsTable1"的元素。这不是因为你的变量(它被声明为var,所以不是全局的)

      在第二页上,没有id="vocRevTableRef" 的元素和名称为vocRevTableRef 的全局变量。因此它给出了undefined

      【讨论】:

      • 你说得对。哎哟。感谢您的帮助,一双新鲜的眼睛(和经验!)真的可以提供帮助。看起来我还不能升级答案。
      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多