2009-10-31 26 views
2

我正在開發一個Facebook應用程序,現在全由我的寂寞。我正在嘗試在onclick事件上進行JavaScript調用。在這個onclick事件中,我正在根據正在鏈接的項目填充一些參數(從php的服務器端)。我插入一些JSON和其他一些有趣的字符。從服務器自動生成JavaScript代碼是不是一個好主意?

Facebook期望錨的所有屬性字段都是嚴格字母數字。沒有引號,感嘆號,0-9a-Z_以外的任何內容。因此,當用戶點擊該鏈接時,它會將參數傳遞給我的javascript函數(如JSON)。

所以我想,爲什麼我不使用我的模板系統只是自動生成的JavaScript?對於我想要生成的每個鏈接,我生成一個唯一的javascript函數(DoItX,其中X是此頁面的唯一整數)。然後,我不會嘗試通過onclick將參數傳遞給我的javascript函數,而是將我的參數作爲DoX的局部變量插入。在鏈接「X」我只是說onclick =「DoX()」。

所以我做到了這一點,中提琴的作品! (這也可以幫助我避免前面引用的地獄逃跑)。但我覺得icky

我的問題是,我瘋了嗎?有沒有更簡單的方法來做到這一點?據我所知,在某種程度上有人能夠改變我的模板局部變量,即影響:

var local = {TEMPLATED FIELD}; 

到的東西用分號,插入任意JavaScript客戶端。 (我試圖編寫代碼來偏執這個)。

什麼時候可以(是否可以)從服務器生成JavaScript?任何我應該注意的/最佳實踐?

回答

5

根據您的應用程序生成JavaScript模板語言可以節省大量的時間,但有一些缺陷需要注意。最嚴重的一個問題是,如果沒有完整的模板堆棧,就很難測試JavaScript。

另外一個主要的缺陷是它試圖將JavaScript邏輯'抽象'到更高層次的類中。通常這是一個跡象表明你將在你的項目中使用shaving yaks。保持JavaScript在JavaScript中的登錄。

從您給出的一點信息來看,您的解決方案似乎是合理的。

0

從服務器生成JS是很好的。只要記住不要從服務器上修改太大的頁面。

2

從服務器生成的JS用於很多領域。以下是從ASP.NET頁面,是由框架生成的JS腳本示例:

<script src="/WebResource.axd?d=9h5pvXGekfRWNS1g8hPVOQ2&amp;t=633794516691875000" type="text/javascript"></script> 

嘗試有不需要再生可重複使用的腳本函數;併爲服務器端生成「擠出」真正動態的。

4

如果您必須生成JavaScript,我建議只生成JSON並且所有函數都是靜態的。

它更乾淨地分離數據,它也使得更容易驗證以防止XSS等。

1

如果您想更好地瞭解它,請確保您的JavaScript大部分位於不會生成的單獨庫文件中,然後在生成代碼時生成對這些庫的調用,而不是生成大量的的JavaScript代碼。

0

一般而言,我儘量避免使用服務器端語言自動生成JavaScript,創建從我的JavaScript將使用的服務器端變量初始化的JavaScript變量。這使得測試和調試更簡單。

在你的情況我可以創建本地變量,如這是很容易測試如下:

<script type='text/javascript' language='javascript'> 
<!-- 
var FUNC_ARG_X = <%= keyX %>; 
var FUNC_ARG_Y = <%= keyY %>; 
var FUNC_ARG_Z = <%= keyZ %>; 
//--> 
</script> 
<script type='text/javascript' language='javascript'> 
<!-- 
function DoCleanCall(arg) { 
    // Whatever logic here. 
} 
//--> 
</script> 
現在

在您的標記使用:

<a href='#' onclick='DoCleanCall(FUNC_ARG_X);'>Test</a> 

現在當然你可能會嵌入在服務器在<a/>標籤上的變量,但有時需要您從JavaScript的其他部分引用這些值。

還要注意生成的內容如何在它自己的<script>標記中,這是故意的,因爲它可以防止解析器失敗,並告訴您對於每個使用它的引用都有無效代碼(就像ASP.NET一樣),它但只會在該部分失敗。

相關問題