5

我需要帮助。我在 IE9 中收到以下错误。该代码在 FireFox 中运行:

SCRIPT438: Object doesn't support property or method 'on' 

这是在以下代码中提出的:

$(function() {
    $(document).on('change', '#dropdownval select', function(event) {
        //logic function
    });
});
4

2 回答 2

10

适用于 Firefox,而不是 IE?

我会确保两个浏览器都加载相同的源。老实说,.on在使用 jQuery 1.6 时,Firefox 有点无法使用,因为该方法不存在。

在您的控制台(IE 中的 F12 开发人员工具和 Firefox 中的 Firebug)中键入以下内容:

jQuery.fn.jquery

这应该返回该特定页面上加载的当前版本的 jQuery。例如,截至今天,在 StackOverflow 上运行该命令会导致"1.7.1". 其次,要测试.on方法是否存在,您可以在不使用括号的情况下访问它,使用双重否定将其转换为真正的布尔值:

!!jQuery.fn.on // True if .on is present, False otherwise

对于 jQuery 1.6,使用 .delegate 而不是 .on

由于您使用的是 jQuery 1.6,因此您无法访问.onjQuery 1.7 中引入的方法。适当的后备方法是改用该.delegate方法,或者您可以升级到最新版本的 jQuery(Microsoft CDNGoogle CDNjQuery CDN)。

for 的语法非常接近.delegate.on

$("#dropdownval").delegate("select", "change", function(event){
    alert( $(this).val() );
});

小提琴:http: //jsfiddle.net/jonathansampson/rMBn4/

如果您决定升级...

您已经接近您的.on代码,但您不想将事件绑定到document对象的下方 - 这意味着事件在被处理之前可能需要传播很长的距离。相反,正如我们对示例所做的那样.delegate,我们将绑定到更接近 select 元素的东西:

$("#dropdownval").on("change", "select", function(event){
    alert( $(this).val() );
});

小提琴:http: //jsfiddle.net/jonathansampson/rMBn4/1/

您会注意到,两者之间的主要区别在于链式方法的前两个参数的顺序。使用.delegate,选择器在事件之前。随着.on,顺序颠倒。

于 2012-06-06T16:42:43.750 回答
7

正在发生两件事之一:

  1. $is not jQuery,而是在别处定义的函数;或者,

  2. $不是 jQuery 的正确版本。on在 1.7 中引入。


对于 jQuery 1.6 如下on

$(document).on('change', '#dropdownval select', ...)

可以使用delegate(自 1.4 起,弃用 1.7)编写:

$(document).delegate('#dropdownval select', 'change', ...)

可以使用live(从 1.3 开始,已弃用)编写:

$('#dropdownval select').live('change', ...) 

有关更多选项和注意事项,请参阅文档。

使用delegate 可以附加在身体“下方”(如on),live一如既往地附加在身体水平。因此,上述内容可能会更有效地编写,具体取决于目标所在的位置。

快乐编码。

于 2012-06-05T06:19:19.883 回答