2012-03-26 43 views
5

我想在我所有的Javascript源文件上運行JSHint,但其中一些有一些嵌入式Django模板標記。 JSHint在這個標記上拋出了大量的錯誤。如何在其中使用Django模板標記的文件運行JSHint?

有沒有辦法要麼...

  1. 告訴JSHint忽略此標記
  2. 運行Djnago模板與一些虛擬數據解析器產生渲染的js文件的所有排列,然後運行JSHint在那?

我想我可以寫一堆代碼來做#2,但我想知道是否有更簡單的方法。

回答

3

根據標記,您可以用JavaScript註釋「隱藏」Django標記。我們這樣做,例如:

// {% if cond %} 
someJavaScriptCode(); 
// {% else %} 
somethingElse(); 
// {% endif %} 

// {% include "script.js" %} 

的唯一的事情是,你必須與開始的script.js一個空行,否則//會吃的JavaScript代碼的第一行正當你在那裏。我寫了一個簡單的助手{% includejs %}自動爲我做。

+0

所以,這得到我過去95%的問題,是一個很好的簡單的解決方案,但現在我擔心錯誤或更適當地錯過錯誤,因爲我正在對IF的兩個分支進行測試。你有沒有發現這在實踐中是一個問題? – 2012-03-28 23:05:54

+1

是的,我確實有這個問題。但最終避免了它,因爲我使用Django模板僅用於獲取動態數據的方式重構我們的應用程序。其他一切都是CDN上的原始JavaScript。不確定它是否有幫助,對不起。 : - \ – 2012-03-31 04:21:43

+0

謝謝,這確實有幫助 – 2012-04-02 15:38:45

1

你也可以使用這個醜陋的解決方案。 jslint認爲「stuff =」是評論的一部分。

var stuff; 
/* {{ '*' + '/' }} 
stuff = {{ variable_containing_json_object_or_list }};      
// */ 
0

就個人而言,我路過Django的JavaScript的模板時,通過JSLint的工具,遇到3個問題:

控制結構

他們可以很容易隱藏在JavaScript註釋,正如安東·科韋爾利弗建議:

// {{ if some_flag }} 
console.log("Conditional log"); 
// {{ endif }} 

字符串變量

顯而易見的解決方案是將django標籤用雙引號引起來。然而值得記住的是,生成的代碼可能是無效的,如果變量的內容不正確地轉義:

var javascript_var = "{{ context_var|escapejs }}"; 

序列化JSON

Edwin的伎倆複雜結構工程:

var javascript_var; 
/* {{ '*' + '/' }} 
javascript_var = {{ context_json_string_var }};      
// */ 

如果您在html模板中包含javascript源模板,您可以在那裏聲明一個「getter」函數並從javascript腳本訪問它:

<script type="text/javascript">function getIt() { return {{ context_var }}; };</script> 
<script type="text/javascript">{% include 'script.js' %}</script> 

在這種情況下,JavaScript源看起來很接受:

/*global getIt*/ 
var haveIt = getIt(); 
1

我發現,使用--extract標誌往往工作。它也擺脫了你在模板中可能有的任何html代碼。

jshint --extract=always your_template_file.html 
2

居然還有從JSHint隱藏Django的標記規範的方式(或任何其他內容):

/* jshint ignore:start */ 
javascript_var = {{ context_json_string_var }}; 
/* jshint ignore:end */ 

同爲JSLint的是:

/*ignore jslint start*/ 
javascript_var = {{ context_json_string_var }}; 
/*ignore jslint end*/ 
相關問題