【问题标题】:Javascript Scoping Issue or Instantiation Issue?Javascript范围问题或实例化问题?
【发布时间】:2012-07-31 21:18:25
【问题描述】:

我有一个网页,它根据文本输入字段中的用户“keyup”事件即时进行一些计算。这是一个动态构建的相当大的页面,所以我必须保留一个哈希/数组值,我可以从页面内的其他位置引用它们。

所以在页面顶部我正在这样做 -

var itemBalanceHash = new Array();
var itemID_2_POIDHash = new Array();
var currentPODocumentID;
var warningArray = new Array();

然后我继续定义一些使用我刚刚定义的变量的函数。 但是,直到我完成定义这些函数之后,这些变量才开始被使用(即填充了东西。)

<script type="text/javascript">                                
itemBalanceHash["${topitem.itemIdentifier}"]="${topitem.itemOutstandingEncumberedAmount}";
itemID_2_POIDHash["${topitem.itemIdentifier}"] = currentPODocumentID;
</script>

这个脚本块出现在我的页面中间,因为它正在构建。事实上,它会被多次调用,具体取决于我需要填充多少行(来自数据库的查询的结果集)。

无论如何 - 这在 Firefox 中效果很好。但是,它不适用于 IE8、Chrome 或 Safari。 我没有在旧版本的 IE 中测试过这个;但我认为它也不会在那里工作。

Internet Explorer 调试器给我的错误信息是这样的

“itemBalanceHash 未定义”

所以,我的问题: 这是范围界定问题吗?
Firefox 似乎在某处纠正了我的错误,但在哪里?

如有必要,我可以提供更多代码。感谢您的帮助!
非常感谢!

【问题讨论】:

  • 上面的脚本只有那四行吗?它是如何包含的?
  • 您可以使用{} (shorthand for new Object()) 而不是new Array() (has a shorthand []),因为您实际上并不需要数组。
  • 你真的应该使用对象 ({}) 作为哈希值,javascript 数组仅用于数字索引数组。
  • 是的 - 我将其更改为速记版本。它什么也没做。谢谢你的提示。
  • Esailija - 我只是将它直接包含在同一个 JSP 页面中(而不是作为链接)。

标签: javascript arrays internet-explorer scope


【解决方案1】:

所以问题出在 iframe 上! Firefox 为我执行我的 JSP 页面中的所有 JS 代码。 IE、Chrome 和 Safari 需要将事件侦听器附加到页面上,以触发加载事件,然后执行我的 JS 代码(该对象的实例化应该发生的地方)。

非常有趣。我期待微软会这样做,但我很惊讶谷歌和 Safari 的行为方式相似。 FF 是我的默认浏览器的另一个原因。

感谢大家的帮助/回复。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多