1

诚然,我对 javascript、jquery 或 oop 知之甚少,但我知道的足够多,可以把东西拼凑起来,有时还能让它们工作。然而,这超出了我的想象,尽管我用谷歌搜索,但我无法对正在发生的事情做出正面或反面。这是我的代码的要点:

jQuery(document).ready(function($) {

    var methods = {
        init : function( options ) { 
            if (somthing) {
                this.latlng(input);//  <--- ERROR: Object has no method
            }
        },
        auto : function( ) {
            if (something) {
                this.latlng(input);
            } else {
                this.location(input);
            }
        },
        location : function ( input ) {
            // draw map
        },
        latlng : function ( input, l ) {
            // draw map
        }
    }

    $.fn.codeAddress = function( method ) {
        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
        }  
    };

    var geo = new $(document).codeAddress(); // Initialize the object   
});

我依赖 jQuery Docs Plugin/Authoring作为我的模板,并从那里开始零敲碎打。理想情况下,它会在文档准备好时自行加载 init(),但不会,所以我添加了倒数第二行来初始化对象。

地图最初是在 init() 中使用方法 latlng() 来绘制的。这就是我在第 6 行得到错误的地方,this.latlng(input) Uncaught TypeError: Object [object Object] has no method 'latlng'。此后,onclick 事件处理程序调用 auto() 以根据其接收到的输入重绘地图。

如果我的解释和/或代码是垃圾节目,我深表歉意。我正在努力学习。

4

3 回答 3

0

你需要这样说:

methods['latlng'].apply(this);

原因是因为 的值this不是你的插件。您实际上应该将 的值记录this到控制台以获得更多洞察力,但实际上,您已经在插件中声明了一个名为方法的对象。latlng 在该对象的上下文中。为了调用它,您可以通过它的键 (latlng) 引用它并调用 .apply() 方法。

于 2013-04-16T22:04:51.583 回答
0
return methods.init.apply( methods, arguments );
于 2013-04-16T22:06:24.453 回答
0

在 jQuery 插件的代码中,this是对包装当时被迭代的 DOM 元素的 jQuery 对象的引用。

在您的情况下,您已手动将插件附加到document.
(您应该在您网站的代码中执行此操作,而不是在插件文件中)

在任何情况下,this.latlng()您都可以使用 引用您的插件,而不是调用this.codeAddress( 'latlng' );

这是 jQuery 插件的预期功能,如果您以这种方式访问​​它们,它会保持干净。

于 2013-04-16T22:09:52.407 回答