2012-06-27 87 views
2

我組建了一個JavaScript對象稱爲ListBox這需要一個二維數組,並輸出與固定的列標題,滾動內容的表,是排序通過單擊列標題。爲了使HTML包括事件處理程序,其調用該對象的自己的方法,對象需要知道自己的實例變量名,比如....對象的構造函數 - 獲取實例變量的名字

var MyList = new ListBox(); 

設置列&內容的適當方法後生成HTML ...

... 
<td class="ListBox_ColumnTitle" onclick="MyList.SortByColumn(1)">...</td> 
... 

通過搜索在這裏計算器,我發現下面的代碼,並適應它稍微所以它找到對象的正確實例:

for (var v in window) { 
    try { 
     if (window[v] instanceof ListBox) { InstanceName = v; break; } 
     } 
    catch (e) { } 
    } 

但是這在構造函數內部不起作用 - 它根本找不到實例。它後來工作正常,但我想能夠在構造函數中做到這一點,使使用ListBox的代碼更簡單 - 這可能嗎?

此外,我意識到這將是簡單得多,只是傳遞變量名稱作爲構造函數的參數,但我想,如果我能避免這種情況。

+3

真正的問題是糟糕的設計。代碼應該對調用代碼一無所知。這是調用代碼的工作。 –

回答

2

您可以通過綁定在腳本中的事件,而不是outputing onclick屬性完全避免這個問題。

function ListBox() { 
    var that = this; 

    // do your existing stuff 

    var element = ...; // whatever you're currently doing to create the html 
    element.onclick = function() { 
     that.SortByColumn(1); 
    }; 
} 
+0

爲什麼你需要'var that = this'?在設置onclick函數時,使用「this」會不會起作用? – Iain

+0

@Iain不,在onclick函數中'this'會引用被點擊的元素。這就是爲什麼我們需要'that'來引用ListBox對象。 – bhamlin

0

不要這樣做。永遠不要嘗試get the name of a variable

相反,你應該使用對象和對它們的引用。您不應該生成HTML(字符串),而是生成DOM元素(對象)。您可以輕鬆地將函數分配給事件偵聽器,只有您可以在範圍內訪問這些事件偵聽器。

相關問題