1

我正在运行此代码,一旦文档准备好,就会调用脚本方法。此外,如果我放置一个调试器并警告它的值,我可以获得该对象,但它会 "Uncaught TypeError: Cannot read property 'ecommerce' of undefined"在本地运行时抛出一个错误。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var jsonObj = {
        "input": {
            "ecommerce": 
                {
                    "id": 123,
                    "name": "isEcommerce",
                    "type": "boolean",
                    "actionType" : "radioButton",
                    "child": {"yes":["p","q","e","w"],
                                "no":["a","b","c","d"]}
                },
            "bad website": 
            {
                "id": 2324,
                "name": "isBadWebsite",
                "type": "boolean",
                "actionType" : "radioButton",
                "child": {"yes":["erw","sd","sd","sd"],
                            "no":["sd","sd","sd","fd"]}
            }
        }
};
var data = jsonObj;     
$(document).ready(function(data){
    alert("HI!!");
    alert(data);
    alert(data.input);
    alert(data.input.ecommerce);
});

function tackleEvent(obj){
    alert("Clicked " + obj);

}
</script>
</head>
<title>Hello!</title>

<body>
</body>
</html>

错误跟踪:

   Uncaught TypeError: Cannot read property 'ecommerce' of undefined ui:34
    (anonymous function) ui:34
    f.Callbacks.n jquery.min.js:2
    f.Callbacks.o.fireWith jquery.min.js:2
    e.extend.ready jquery.min.js:2
    c.addEventListener.B jquery.min.js:2

为什么它无法获取对象并且在键入相同内容时正在工作?

4

2 回答 2

1

如果您注意到前 2 个警报框,则显示的值为data

function(a,b) { return new e.fn.init(a,b,h) }

这是因为jQuery 命名空间的别名已在以下函数中传递(带有名为 的本地副本data):

function(data){
    alert("HI!!");
    alert(data);
    alert(data.input);
    alert(data.input.ecommerce);
}

并已命名为数据。因此,在上述函数内部;您可以使用:

data.ajax()
data.ready() //another
data.load()
// and all other jQuery functions.

访问全局变量data;你需要使用:window.data

于 2013-10-05T08:54:40.173 回答
0

您正在检查局部变量,而不是全局变量。

当您调用时$(document).ready(function(data){,您可能假设data在该函数中是全局变量data。您实际上在做的是创建一个局部变量,其中包含$(document).ready( ... )放入其中的任何内容。据我所知,被调用的函数中的第一个变量$(document).ready( ... )将包含jQuery.

data您可以通过从该函数调用中删除来修复它。它现在改为使用全局变量。

$(document).ready( function(){
    alert("HI!!");
    alert(data);
    alert(data.input);
    alert(data.input.ecommerce);
});
于 2013-10-05T08:52:58.493 回答