Timepicker плагина Jquery не перепривязывается после переключения вкладок jquery и возврата в частичное представление asp.net mvc - PullRequest
1 голос
/ 28 марта 2011

В настоящее время я работаю над отображением различных форм ввода на вкладках в asp.net mvc 3. Каждая вкладка имеет несколько дочерних частичных представлений.[См. Изображение ниже]
1 из частичных представлений содержит форму для создания сеансов, а над ним - еще одно частичное представление со списком созданных сеансов (еще нет). При переключении вкладок вверху и обратно плагин jquery timepicker от Francois Gelinas , известный как jquery.ui.timepicker.js , не может перепривязать / повторно инициализировать после выбора другой вкладки и затем возврата на вкладку РедактироватьСтандартные настройки курса и программы.
Я использую бритвенный движок вместо стандартного веб-движка ...

Мастер-страница / файл _Layout.cshtml

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
  <html>  
  <head>  
   <meta http-equiv="X-UA-Compatible" content="IE=8" />    
   <title>@ViewBag.Title</title>  
   <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"  type="text/javascript">   </script>  
   <script src="@Url.Content("~/Scripts/jquery.ui.core.js")" type="text/javascript">   </script>   
   <script src="@Url.Content("~/Scripts/jquery.livequery.js")" type="text/javascript">  </script>  
   <script src="@Url.Content("~/Scripts/jquery.ui.widget.js")" type="text/javascript"></script>  
   <script src="@Url.Content("~/Scripts/jquery.ui.tabs.js")" type="text/javascript"></script>  
   <script src="@Url.Content("~/Scripts/jquery.ui.timepicker.js")" type="text/javascript"></script>  
   <script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.custom.js")" type="text/javascript"></script>  

   <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />  
   <link href="@Url.Content("~/Content/jquery-ui-1.8.11.custom.css")" type="text/css" rel="stylesheet" />  
   <link href="@Url.Content("~/Content/jquery-ui-timepicker.css")" type="text/css" rel="stylesheet" />  

   <script src="@Url.Content("~/Scripts/MicrosoftAjax.debug.js")" type="text/javascript"></script>
   <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js")" type="text/javascript"></script>  

Index.cshtml << вызывается кнопкой create в главном меню приложения mvc <br>Создает 3 вкладки, которые вы видите на картинке выше.

@using MvcHtmlHelpers;
<link href="@Url.Content("~/Content/BoxBackgrounds.css")" rel="stylesheet" type="text/css" />


@{
    ViewBag.Title = "Index";
 }

<h2>Index</h2>
<div id="tabs">
 <ul>
   <li >@Html.TabLink("Edit Student Defaults", "EditStudentDefaults", "Creation") </li>
   <li>@Html.TabLink("Edit Exam and Certification Defaults", "EditCertAndExamDefaults", "Creation") </li>
  <li>@Html.TabLink("Edit Course and Program Defaults", "EditCourseAndProgramDefaults", "Creation")</li>
 </ul>
</div>

<script type="text/javascript" language="javascript">

$(document).ready(function() {
    $("#tabs").tabs({
    cache: false
   });

 });

EditCourseAndProgramDefaults.cshtml << вкладка частичного представления с частичными представлениями внутри нее. </p>

@model SMS3demo.Controllers.CourseAndProgramDefaultsViewModel
<table width="100%" class="ConfigStudentsGradient" cellspacing="0" border="0" frame="void" style="border-collapse:collapse">
 <tr>
     <td>
        @Html.Partial("ListSessions")
     </td>
     <td>
        @Html.Partial("ListCourses")
     </td>
     <td>
        @Html.Partial("ListPrograms")
    </td>


 </tr>
 <tr>
     <td>
        @Html.Partial("AddSession")
     </td>
     <td>
         @Html.Partial("AddCourse")
     </td>
     <td>
         @Html.Partial("AddProgram")
     </td>

 </tr>

</table>

AddSession.cshtml << частичное представление этогоиспользует таймер </p>

@model SMS3demo.Controllers.CourseAndProgramDefaultsViewModel  
@using (Html.BeginForm()) {
<script type="text/javascript">
 $(document).ready(function () {
     $('#StartTime').timepicker({
         showPeriod: true,
         showLeadingZero: false
     });
 });

@Html.ValidationSummary(true)
<fieldset>
    <legend>Session</legend>
        <table>
<tr>
                <td>
                    <span class="SessionStartTime">@Html.TextBoxFor(model => model.SessionStartTime, new {@id = "StartTime"  }) </span>


                    @Html.ValidationMessageFor(model => model.SessionStartTime)
                </td>

Я исследовал эту тему уже пару дней.Я попробовал следующие идеи / варианты методов ...

  1. с использованием live
  2. с использованием livequery
  3. , пытаясь воссоздать привязку после каждого события onclick для поля ввода
  4. Я пытался увидеть, как другие решили эту проблему, используя другой элемент управления, такой как datepicker, так как этот плагин очень похож на него.

Я знаю, что происходит: средство выбора времени проигрываетего привязка, когда я переключаюсь обратно на вкладку.Я обнаружил, что в Firebug создан скрытый объект Timepicker, и он не умирает, когда вкладки переключаются ... однако я не могу перепривязать или вспомнить оригинальный метод для воссоздания, когда вкладка снова выбрана.Я знаю, что document.ready вызывается только 1x, когда частичное представление загружено 1-ым ...
Я попытался сделать следующее: в

<script type="text/javascript">
    $(document).ready(function() {
        initJQueryWidgets();
    });

    function initJQueryWidgets() {
        $("[ID$=StartTime1]").timepicker({
                showPeriod: true,
                showLeadingZero: false,
                zIndex: 1
            });
    }


</script>

Я также попытался в верхней части страницы в скобках скриптапокажите выше

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() {
         initJQueryWidgets();
    });

Затем я попытался вызвать initJqueryWidgets в обработчике даже onClick для поля ввода

 <span class="SessionStartTime">@Html.TextBoxFor(model => model.SessionStartTime, new {@id = "StartTime", @onClick="initJqueryWidgets"  }) </span>

Постоянно полученные ошибки были $ ("# StartTime"). timepickerне является функцией (?) () 52 (строка 2) anonymous () Создание (строка 29) [Break On This Error] $ ("# StartTime"). timepicker ({showPeriod: true, showLeadingZero: false});

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Timepicker создает экземпляр в DOM один раз и использует этот экземпляр каждый раз, когда он отображается, кроме встроенного отображения, поэтому вы видите его в DOM, это не означает, что он отсоединен от ввода.

Если указатель времени теперь отображается при нажатии, это, вероятно, означает, что возникла проблема с zIndex, или он потерял событие click.

(document).ready(function () {
 $('#StartTime').timepicker({
     showPeriod: true,
     showLeadingZero: false,
     zIndex: 9999
 });

});

Если #StartTime теряет привязку, вы должны удалить класс hasTimePicker, прежде чем связывать его снова.


Сегодня вечером я выясню, как реагирует средство выбора даты в этой ситуации и заставит ли его работать также средство выбора времени, обновится, когда я найду решение.

1 голос
/ 29 марта 2011

Я исправил это, убрав вызовы для загрузки других версий jquery!Проверьте вашу консоль Firebug, когда вы нажимаете на вкладки, и посмотрите, какие команды get обрабатываются.Убедитесь, что вы ссылаетесь только на 1 версию jquery!Уф!Кроме того, я обнаружил, что в частичных представлениях удаляются все ссылки на ссылки на сценарии и вставляются в главную страницу, что облегчает их отслеживание и исправление.

Особая благодарность Франсуа Желинасу за то, что он потратил время на помощь и такжев Black Box Operations за помощь.

0 голосов
/ 28 марта 2011

Вкладки Jquery часто отключают div, содержащий элементы для каждой вкладки, когда она не просматривается.Тем не менее, если Jquery не может найти элемент, то он не может создать средство выбора даты, поэтому вам придется отключить событие при выборе вкладки, чтобы сначала проверить, существует ли элемент, а затем создать средство выбора даты.соответственно.

$('#tabs a#idOfTabContainingStartTime').bind('click', function(){
    if( $("#StartTime").length ){
         $('#StartTime').timepicker({
             showPeriod: true,
             showLeadingZero: false
         });
    }
}

Если это не решит вашу проблему, то это, вероятно, потому, что Jquery получает немного триггера, довольного всей вкладкой / div / скрытием.Когда вы выбираете другую вкладку, вкладка, которую вы просматривали в настоящий момент, скрыта, но Jquery также любит скрывать все внутри вкладки, а также , поэтому вам, возможно, придется создать еще один вызов, который проверяет наличие любых элементов, скрытых в данный момент внутри.вкладку и итеративно покажите их.

$('#tabs a#idOfTabContainingStartTime :hidden').each(function(){
    $(this).show();
});
...