情景的Javascript塊在Chrome和IE瀏覽器不會呈現
我正在開發一種報告生成的。用戶從select
中選擇報告並單擊按鈕。具有所需參數的表單是動態創建和呈現的。一些參數呈現爲select
s,綁定到db表。
如何的形式被稱爲:
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')); } });
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>
_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事件處理程序。
因此,問題不在於部分視圖邏輯,因爲在所有瀏覽器中都正確地創建了響應。但這個問題似乎與瀏覽器引擎有關。
如何解決這個問題?