2014-01-29 63 views
0

情景的Javascript塊在Chrome和IE瀏覽器不會呈現

我正在開發一種報告生成的。用戶從select中選擇報告並單擊按鈕。具有所需參數的表單是動態創建和呈現的。一些參數呈現爲select s,綁定到db表。

  1. 如何的形式被稱爲:

    var data = { 'ReportId': $('#Reports option:selected').val() }; 
    $.ajax({ 
        type: 'GET', 
        url: '/statistics/ReportBuilder/GetReportParameters', 
        dataType: 'text', 
        data: data, 
        success: function(data){ 
         $('#divReportParameters').html(data); 
        }, 
        complete: function(){ 
         mkNamespace.utils.dom.hideLoader($('#content')); 
        } 
    }); 
    
  2. GetReportParameters.cshtml。的形式是一個簡單的容器由一個視圖:

     @model ReportBuilderModel 
         <div> 
          <h3>@Model.Report.Label</h3> 
         </div> 
         <div> 
          <form id='frmReportParameters' action='@Url.Action("GetReport")' method="post"> 
           @Html.Partial("~/Views/Shared/Controls/_ParametricForm.cshtml", Model.Parameters) 
           <input type = "hidden" id="reportId" name="reportId" value="@Model.Report.Id" /> 
           <input id="btnGetReport" type="button" value="Estrai Report" /> 
          </form> 
         </div> 
    
  3. _ParametricForm.cshtml。實際參數列表使用局部視圖_ParametricForm呈現。該部分由兩部分組成。第一部分呈現<table>,參數集合上的循環,創建一行並將相應的GUI元素放入行中。第二部分使用onchange事件處理程序呈現<script>塊。

    @model FormParameterCollection 
    
        <table class="tableForm parametricForm"> 
        @foreach (FormParameter par in Model) { 
         <tr> 
          <td class="fieldLabel">@par.Label</td> 
          <td class="fieldInput"> 
           @switch(par.Type){ 
            case FormParameterType.Input: 
             <input name="@par.Name" type="text" class="fieldText" /> 
             break; 
            case FormParameterType.Select: 
             <select name="@par.Name" class="fieldSelect"> 
             @if (!string.IsNullOrWhiteSpace(par.DefaultLabel) || !string.IsNullOrWhiteSpace(par.DefaultValue)) 
             { 
              <option value="@par.DefaultValue" data-tag="">@par.DefaultLabel</option> 
             } 
             @foreach (DataSourceItem item in DataSourceManager.Current[par.DataSource]) 
             { 
              <option value="@item.Value" data-tag="@item.Tag">@item.Label</option> 
             } 
             </select> 
             break; 
            case FormParameterType.MultiSelect: 
             <select name="@par.Name" class="fieldSelect" multiple="multiple" size="6"> 
             @if (!string.IsNullOrWhiteSpace(par.DefaultLabel) || !string.IsNullOrWhiteSpace(par.DefaultValue)) 
             { 
              <option value="@par.DefaultValue" data-tag="">@par.DefaultLabel</option> 
             } 
             @foreach (DataSourceItem item in DataSourceManager.Current[par.DataSource]) 
             { 
              <option value="@item.Value" data-tag="@item.Tag">@item.Label</option> 
             } 
             </select> 
             break; 
            case FormParameterType.Date: 
             @Html.JQueryUI().Datepicker(par.Name, DateTime.Now) 
             break; 
            default: 
             <input name="@par.Name" type="text" class="fieldText" /> 
             break; 
           } 
          </td> 
         </tr> 
        } 
        </table> 
        <script type="text/javascript"> 
         //dynamically bind the onchange events of the parametes 
         $(document).ready(function(){ 
          @foreach (FormParameter par in Model) { 
          <text> 
           @if(!String.IsNullOrEmpty(par.ParentParameter)){  //the onchange event is bound for the 'parent related' parameters (e.g. shop & categories) 
            <text> 
            $('.tableForm.parametricForm').on('change', '[name="@par.ParentParameter"]', function (e) { 
             var parentId = e.target.value; 
    
             $('[name="@par.Name"] > option').hide(); 
             $('[name="@par.Name"] > option').filter(function() { 
              var tag = $(this).attr('data-tag'); 
              return (tag == '' ? true : (JSON.parse($(this).attr('data-tag'))['@par.ParentParameter'] == parentId) || (parentId == '')); 
             }).show(); 
            }); 
            </text> 
           } 
          </text> 
          } 
         }); 
    
         //bind jQueryUI functions after the ajax call 
         $('.tableForm').jQueryUIHelpers(); 
        </script> 
    

問題

現在,不介意的所有細節。所有這些東西完美運行在Firefox上。

在Chrome e IE中,_ParametricForm部分中的<script>塊在響應中正確返回(使用調試器進行檢查),但不會執行onchange事件處理程序。

因此,問題不在於部分視圖邏輯,因爲在所有瀏覽器中都正確地創建了響應。但這個問題似乎與瀏覽器引擎有關。

如何解決這個問題?

回答

0

您設置的數據類型爲文本,所以它要把它當作文本和不處理它。設置爲「html」。

0

如果它的表單域那麼keyup/keypress是否合適?如果需要更改,請嘗試focusout比較當前和以前的更改值。

onchange只在控件模糊時觸發。 (source

相關問題