2014-01-24 44 views
2

我使用struts2-jQuery插件的Struts 2.3。struts2,ajax和注入jquery標籤

我必須動態加載一個動作的結果ajax。
在JSP中有一些正常的HTML和jQuery的標籤

<sj:datepicker cssClass="dataScadenzaDiv" id="dataScadenzaDiv" 
     name="dataScadenza" maxDate="-1d" label="data scadenza" theme="xhtml"/> 

所有工程確定和代碼與AJAX注入的是:

<!-- lotto dpi --> 
<tr> 
<td class="tdLabel"><label for="lotto" class="label">Lotto:</label></td> 
<td><input type="text" name="txtLotto" size="15" value="" id="lotto"/></td> 
</tr> 

<!-- tGestDataScadenza --> 
<div id="dataScadenzaAjax"></div> 
<input type="text" name="dataScadenza" value="" id="dataScadenzaDiv"  class="dataScadenzaDiv" theme="xhtml"/><script type='text/javascript'> 
jQuery(document).ready(function() { 
jQuery.struts2_jquery_ui.initDatepicker(false); 
}); 
jQuery(document).ready(function() { 
var options_dataScadenzaDiv = {}; 
options_dataScadenzaDiv.showOn = "both"; 
options_dataScadenzaDiv.buttonImage = "/RadioFrequenza2/struts  /js/calendar.gif"; 
options_dataScadenzaDiv.maxDate = "-1d"; 
options_dataScadenzaDiv.jqueryaction = "datepicker"; 
options_dataScadenzaDiv.id = "dataScadenzaDiv"; 
options_dataScadenzaDiv.name = "dataScadenza"; jQuery.struts2_jquery_ui.bind(jQuery('#dataScadenzaDiv'),options_dataScadenzaDiv ); 

}); 
</script> 

但現在<input type="text" name="dataScadenza">呈現爲普通文本 和點作爲日期選擇器。
我認爲注入的javascript沒有執行...

我該怎麼辦?

+0

您是否已將標記插入頭部?在您的JavaScript控制檯中是否有任何日誌消息? – Johannes

回答

1

的問題是,Struts2的,jQuery的插件生成一個腳本,將運行後的DOM準備就緒:呈現頁面時jQuery(document).ready(function() { ...

後,準備好事件。但是在AJAX調用之後,事實並非如此。

那麼有兩種解決方案:

  1. 避免使用Struts2的,jQuery的插件,是由AJAX返回的JSP代碼片段;使用,而不是普通的jQuery,並避免使用jQuery(document).ready(function() {
    (但我想它不會完全可靠);

  2. 使用技巧來覆蓋默認的jQuery就緒事件as described in this great answer,以使ready函數成爲可觸發的。
    然後觸發它,你的JSP作爲最後一行代碼片段通過AJAX

    <sj:datepicker cssClass="dataScadenzaDiv" id="dataScadenzaDiv" 
           name="dataScadenza"  maxDate="-1d" 
           label="data scadenza"  theme="xhtml"/> 
    <script> 
        $.triggerReady(); 
    </script> 
    

我做了展示的伎倆小提琴返回,並測試它的jQuery 1.10.1:

Running demo

HTML

<input type = "button" 
     value = "trigger ready event" 
    onclick = "$.triggerReady();" /> 

JAVASCRIPT

// Overrides jQuery-ready and makes it triggerable with $.triggerReady 
// This script needs to be included before other scripts using the jQuery-ready. 
// Tested with jQuery 1.10.1 
(function(){ 
var readyList = []; 

// Store a reference to the original ready method. 
var originalReadyMethod = jQuery.fn.ready; 

// Override jQuery.fn.ready 
jQuery.fn.ready = function(){ 
if(arguments.length && arguments.length > 0 && typeof arguments[0] === 'function') { 
    readyList.push(arguments[0]); 
} 

// Execute the original method. 
originalReadyMethod.apply(this, arguments); 
}; 

// Used to trigger all ready events 
$.triggerReady = function() { 
    $(readyList).each(function(){this();}); 
}; 
})(); 


/* This part is for demo only and should be removed */ 
$(document).ready(function(){ 
    alert('document.ready is fired!'); 
}); 

記住,也是其他處理程序最初在準備事件中運行將再次觸發,需謹慎使用此。