1

我试图简单地从带有 id 的标签中获取一个值。我有 jQuery 经验,但无法弄清楚为什么我在脚本的第一行不断收到“Uncaught TypeError: object is not a function”错误。

有任何想法吗?

<!DOCTYPE html>
<html>
<head>
    <meta charset='UTF-8' />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
    <div>
        <label id="test">Value</label>
    </div>
    <script>
        jQuery(window).load(function ($) {
            var label = $('#test');
            var prev = label.text();
        });
    </script>
</body>
</html>

提前致谢。

4

2 回答 2

2

.load的回调接收到的第一个参数是一个事件对象:

jQuery(window).load(function ($) {
//                            ^ receives a jQuery event object

您可能会将它与作为第一个参数接收的DOM Ready 处理程序混淆:jQuery

//both of these would have $ as an alias for jQuery:
jQuery(document).ready(function($){});
jQuery(function($){});

回到这个问题,有三种方法可以解决它。

首先,如果在全局范围内,您可以通过从回调中删除/重命名遮蔽全局的参数$来轻松解决问题。$.load$

否则,如果 jQuery 处于noConflict模式,您可以使用IIFE包装器手动别名$

(function($) { //aliases jQuery to $ inside this scope
    $(window).load(function() {
        //$ references jQuery in inner scopes too as long as you don't shadow it
        var label = $('#test');
        var prev = label.text();
    });
}(jQuery));

作为第三种选择,如果您不需要等待window'sload事件,只需使用 DOM Ready 处理程序即可。处理程序更早触发(ready一旦 DOM 结构准备好),而window's.load必须等待所有资源首先加载(包括图像)。

大多数时间.ready()就足够了,不会让用户等到最后一张图片加载完毕后再与您的页面交互。现在,如果您正在处理图像的尺寸或类似的东西,$(window).load()可能会更有趣。实验看看。

于 2013-04-29T21:34:00.770 回答
0

无需$作为参数传递给您的函数。这样做将创建一个局部变量“$”,它将“隐藏”外部作用域中的 jQuery 对象。

所以$将扮演一个事件(local $)的角色并且不再是一个函数(outer $),因此你的错误。

只需function()不带参数调用,就可以了。

于 2013-04-29T21:36:57.953 回答