对象[object Object]的属性'$ .fn.toggleHeightAndOpacity'不是函数

时间:2014-01-11 20:32:29

标签: javascript jquery websocket uncaught-typeerror

我正在尝试调用变量函数名称,因为我在使用here中的类似代码之前已经多次使用

<script type="text/javascript">
    $.fn.toggleHeightAndOpacity = function(show) {
        $(this).stop(true,false).animate({
            opacity: (show)?'show':'hide',
            height: (show)?'show':'hide'
        },
        function(){
            $(this).css('display', (show)?'auto':'none')
        })
    };

...

ws.onmessage = function (evt) {
    var data = JSON.parse(evt.data);
    if(evt.data.type = 'function'){
        var parameters;
        try{
            parameters = JSON.parse(data.parameters);
        }
        catch(e)
        {
            parameters = data.parameters;
        }
        $('#'+data.id)[data.function](parameters)
    }
};

但即使从我的WebSocket服务器返回的JSON为Uncaught TypeError: Property '$.fn.toggleHeightAndOpacity' of object [object Object] is not a function,我仍然会收到{"function":"$.fn.toggleHeightAndOpacity","id":"container","parameters":true,"type":"function"}

container存在于我的html中,并加载了jQuery。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

可以使用点或括号表示法访问对象,因此这两个是相同的

object.key

object['key']

由于jQuery选择器和方法是对象,就像javascript中的其他所有东西一样,它们可以以相同的方式访问,所以这两个是相同的

$('#element').fadeIn();

$('#element')['fadeIn']();

这意味着可以使用这两种方法访问插件

$('#'+data.id)['toggleHeightAndOpacity'](parameters);

$('#'+data.id).toggleHeightAndOpacity(parameters);

因此,如果从服务器返回的数据确实是

{"function":"$.fn.toggleHeightAndOpacity", ...

你真的在做

$('#'+data.id)['$.fn.toggleHeightAndOpacity'](parameters)

这看起来不对,应该是

$('#'+data.id)['toggleHeightAndOpacity'](parameters)

所以更改服务器端代码以输出不带$.fn的函数名称 使用function作为键看起来有点暗淡,因为它是javascript中的保留关键字,所以我习惯于不命名键或变量function