2013-09-16 47 views
2

我一直在嘗試寫使用Domina library在cljs以下等效:如何處理的onsubmit與多米納

HTML:

<form id="my-form"> 
    <input type="text /> 
    <input type="submit" /> 
</form> 

的Javascript(jQuery的):

$("#my-form").submit(function() { 
    console.log("submit suppressed"); 
    return false; 
}); 

解決方案不令我滿意(沒有Domina庫非常詳細):

(set! (.-onsubmit (.getElementById js/document "my-form")) #(do 
                   (.log js/console "submit suppressed") 
                   false)) 

我已經嘗試了許多解決方案,都失敗了 - 所有有點類似:

(listen! (by-id "my-form") :submit #(do 
             (log "submit suppressed") 
             false)) 

這是故意的,我不使用click事件,因爲我也想當執行的功能該表單由代碼或鍵盤提交。

回答

3

當您從jQuery事件處理程序中返回false,磁帶庫會自動調用e.preventDefaulte.stopPropagation(更多信息請參見here)。調用此功能是控制event行爲的正確方法。

Domina在ClojureScript理解的東西中包裝js/Event。因此,您可以直接撥打preventDefaultstopPropagation,而無需使用Javascript互操作。你可以閱讀更多關於這個巧妙的技巧:https://github.com/levand/domina#event-objects

這個技巧可能是導致返回false根本不工作的原因。這個技巧的實現方式(看代碼here)是用另一個總是返回true的函數包裝你的函數。

所以,你的代碼應該是更多這樣的:

(listen! (by-id "my-form") :submit 
     (fn [e] 
      (do 
      (log "submit suppressed") 
      (prevent-default e) 
      (stop-propagation e)))) 
+0

我把警報在調用事件之間。只要第一個事件調用完成 - 無論是preventDefault還是stopPropagation,都忽略之後的所有內容(沒有更多的警報可見並且表單已提交)。也許多米納包裝與東西混合 – Jacob

+0

也許你是對的,我會看看,並試圖找到一種方法來解決它。 –

+0

問題在於Domina包裝了'Event'。我更新了我的答案,抱歉發佈了錯誤的答案(我無法在發佈前測試代碼)。 –