2013-04-16 192 views
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的文檔Plugin/Authoring爲我的模板,並開始從那裏piecemealing。理想情況下,它在文檔準備就緒時加載它自己的init(),但它不會將第二行加到最後一行來初始化對象。

映射最初是在init()中使用方法latlng()繪製的。這就是我在第6行得到錯誤的地方,this.latlng(input)Uncaught TypeError:Object [object Object] has no method'latlng'。此後,onclick事件處理程序調用auto()根據它接收到的輸入重繪地圖。

我很抱歉,如果我的解釋和/或代碼是垃圾表演。我一直在努力學習。

+0

@adeneo,OP已經明確表示他對JavaScript不太瞭解。很好;) – Codasaurus

回答

0

在jQuery插件的代碼,this是jQuery對象纏繞在當時被遍歷DOM元素的引用。

就你而言,你已經手動將你的插件附加到document
(你應該這樣做在您的網站的代碼,而不是插件文件內)

在任何情況下,而不是調用this.latlng()你可以this.codeAddress('latlng');引用您的插件。

這是jQuery插件的預期功能,如果以這種方式訪問​​它,它可以保持乾淨。

+0

我也在用這個。這不起作用..? –

0

你需要說的是這樣的:

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

的原因是因爲this值不是你的插件。您應該將this的值記錄到控制檯以獲取更多信息,但實際上您已經在插件中聲明瞭一個名爲methods的對象。 latlng位於該對象的上下文中。爲了調用它,你通過它的鍵(latlng)引用它並調用.apply()方法。

+0

公頃。謝謝。試圖編輯它,但你擊敗了我:) – Brad

+0

太棒了,那讓我在那個障礙。我很確定我明白你的意思。有兩個問題,記錄這個收益的價值是什麼,當我應用它時,我將如何傳遞latlng密鑰的值? – brandonhowlett

+0

'this'的值在JS中可能會變得棘手,因爲它根據上下文而變化。 console.log(this)可以是一個有用的工具,可以找出不同情況下各種事物的價值。至於傳遞值,爲你的args數組添加第二個參數。即.apply(this,[argsArray])檢查了這一點http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply – Brad

0
return methods.init.apply(methods, arguments); 
相關問題