2011-04-09 127 views
0

我試圖動態創建js對象,這些對象也可以使用Foo.write()將它們自己寫入文檔中。寫入方法只是一堆document.write()調用,它從Foo中抽取變量來填充元素。因此,本質上,write()包含所有Foo的模板。將對象傳遞給document.write()中的onClick方法

This works great。但是,當我想將onClick設置爲其中一個模板元素(anchor)時,我遇到了問題。寫入的鏈接線:

document.write("<a href='javascript:" +this+ "close()'><img src='layout_img/button_close.png' /></a> ");

所謂的情況下,Foo刀片本身Foo.close()應該對具體Foo調用。但是當我點擊鏈接時,我得到一個js錯誤:"missing ] after element list"。在狀態欄中,當我懸停鏈接時,它顯示javascript:[Object object].close(),我認爲這是件好事。

爲什麼不能正常工作?

以下是我的更多幫助代碼。這是我想了如何創建/寫我的對象:

<script type="text/javascript"> 
    new Foo('any_id_i_want', {    
    title: "any_title", 
    icon: "any_image", 
    isMinimized: false, 
    top: 400, 
    left: 500 
    }).write().setContents("Hello <a href='http://google.com'>google</a>"); 
</script> 

write()使用document.write()來創建模板,並使用之類的東西Foo.title自定義對象的外觀。

setContents()document.getElementById(Foo.id)發現編寫的代碼,並使用Element.innerHTML與自定義消息,以填補Foo,在這種情況下的文本和鏈接。

所以我想保持這種創建對象的方法,因爲它非常方便。我只是無法弄清楚如何使用該模板在Foo上撥打電話。

+1

是否有使用了'document.write'是有原因的?這是一種非常困難的做事方式。另外,預期產出是多少? – 2011-04-09 17:55:21

+0

這是一個對象。你需要使用像這樣 文件撰寫(「」); – 2011-04-09 18:00:30

+0

我添加了更多可能有助於描述我想要完成的代碼。我將有多個'Foo's頁面上,每個'Foo'應該能夠調用'close()方法'鏈接被點擊的時候。 – Snailer 2011-04-09 18:06:24

回答

1

當您連接this與其他字符串時,您將獲得對象的字符串表示形式(即this.toString())。對於一個根本沒用的複雜對象。正如你看到的,你得到的文字[Object object],而不是你可以用來訪問該對象的任何東西。

如果你希望能夠用那樣的對象,該對象必須知道,它可以用來訪問本身就是一個變量的名稱。

例子:

// create object 
var x = new Foo(); 
// set variable name 
x.name = 'x'; 

現在你可以使用這個屬性來創建一個訪問對象代碼:

document.write(
    '<a href="javascript:' + this.name + '.close();">' + 
    '<img src="layout_img/button_close.png" />' + 
    '</a>' 
); 

如果改爲將創建元素作爲對象,並追加到一個元素頁面,你可以簡單地把this在一個局部變量和一個匿名函數使用,而不需要一個全局變量名:

var e = document.createElement('a'); 
var t = this; 
e.onclick = function(){ 
    t.close(); 
}; 

(需要加時賽局部變量t是爲了讓你得到它在匿名函數closeure。當onclick事件運行,this並不是指你的對象,但HTML元素)。

+0

雖然有很多有用的答案,我用這個。隨着一些谷歌搜索,我發現了一些我從來不知道的東西:http://snook.ca/archives/javascript/global_variable。所以,我把我的新的'Foo'到全球具有相同的名稱作爲'Foo.id'並且有'write'方法打印出'的javascript:窗口。 「+ this.id +」.close()' – Snailer 2011-04-09 18:41:18

1

this是一個對象。將對象連接到字符串時,會隱式調用對象的toString()。這就是爲什麼你看到[Object object].close()。你期望的輸出是什麼?

0

有許多事情是,這裏不是最佳的:

  1. 要轉換符,這是一個對象,爲String。這要求Foo.toString()返回字符串[Object object]
  2. 您正在通過字符串分配事件偵聽器。你應該創建你的鏈接,並呼籲addEventListener甚至link.onclick = function() { Foo.close() }
  3. this根據上下文更改其值。在write()時,當你調用onclick處理程序時,它會有所不同。一個簡單的解決方案是使用var that = this; that.close()
  4. 使用document.write可能是向您的文檔添加內容的最糟糕方法。使用DOM API創建JavaScript中的內容。

說,這是我會怎樣處理那些:

Foo.write = function() { 
    var link = document.createElement('a'); 
    link.innerHTML = "<img src='layout_img/button_close.png' />"; 
    var that = this; 
    link.onclick = function() { that.close(); }; 
    document.body.appendChild(link); 
} 

在你的情況,也可能是考慮使用templating library一個好主意。