2012-05-04 6 views
0

jQueryダイアログの問題があります。人がcalDayContentEntry divをクリックすると、ajaxを利用してダイアログウィンドウ内のカレンダーコンテンツをレンダリングしたいと考えています。次のコードは、最初のクリックで動作しますが、ダイアログを閉じた後、そのエントリを再び表示するダイアログが表示されなくなりました。他のエントリも最初に動作しますが、セカンダリクリックはダイアログを再び開きません。jQueryダイアログで最初に表示されるのは

ここで問題が発生している関連コード(すべて同じasp.net mvc 3カミソリビュー内)です。誰にもこの問題を修正できる調整がいくつかありますか?

  ... 
      <div class="calDayContent"> 
      @foreach (var content in day.Contents) 
      { 
       <div class="calDayContentEntry"> 
        <input type="hidden" value="@content.Entry.Id" class="hiddenId" /> 
        <div class="@content.DisplayClass">@content.Entry.Hours.ToString() hrs</div> 
       </div> 
       <div class="leaveRequestPopup"></div> 
      } 
      </div> 
      ... 

<script type="text/javascript"> 
    $().ready(function() { 
     $('.calDayContentEntry').click(function() { 
      getAndShowDialogContents(this); 
     }); 

     // Register close event for dialog if overlay is clicked 
     $('.ui-widget-overlay').live("click", function() { 
      //Close the dialog 

      $currentDialog.dialog("close"); 
     }); 
    }); 

    function getAndShowDialogContents(entryDiv) { 

     var entryId = $(entryDiv).find('input[type="hidden"]').val(); 
     var contentdiv = $(entryDiv).next('.leaveRequestPopup'); 
     var x = $(entryDiv).position().left + jQuery(entryDiv).outerWidth(); 
     var y = $(entryDiv).position().top - jQuery(document).scrollTop(); 

     $.ajax(
     { 
      type: 'POST', 
      url: 'Request/GetCalendarDetails', 
      data: { id: entryId }, 
      success: function (result) { 

       $(contentdiv).html(result); 

       $(contentdiv).dialog({ 
        autoOpen: false, 
        modal: true, 
        title: 'Details', 
        width: 400, 
        height: 300, 
        draggable: false 
       }); 

       $(contentdiv).dialog("option", "position", [x, y]); 
       $currentDialog = $(contentdiv).dialog('open'); 
      } 
     }); 
    } 
</script> 

答えて

0
現在のjQueryオブジェクトを渡すために

getAndShowDialogContents($(this)); 

私は週末にこの問題について新たな視点を加えたと思います。動作するコードは以下の通りです。基本的には、すべてのエントリにポップアップdivを使用する代わりに、ページの最後にdivを1つだけ使用しました。そのdivはすべてのダイアログに再利用されます。誰かがダイアログを閉じてそれを閉じるときに参照できるように、グローバル変数を使用します。これが誰かを助けることを願っています。

  ... 
      <div class="calDayContent"> 
      @foreach (var content in day.Contents) 
      { 
       <div class="calDayContentEntry"> 
        <input type="hidden" value="@content.Entry.Id" class="hiddenId" /> 

         <div class="@content.DisplayClass">@content.Entry.Hours.ToString() hrs</div> 
       </div> 
      } 
      </div> 
      ... 
      <div class="leaveRequestPopup"></div> 
      ... 


<script type="text/javascript"> 
    $().ready(function() { 
     $('.calDayContentEntry').click(function() { 
      getAndShowDialogContents(this); 
     }); 

     // Register close event for dialog if overlay is clicked 
     $('.ui-widget-overlay').live("click", function() { 
      //Close the dialog 

      $currentDialog.dialog("close"); 
     }); 

     $currentDialog = $('.leaveRequestPopup').dialog({ 
      autoOpen: false, 
      modal: true, 
      title: 'Details', 
      width: 400, 
      height: 300, 
      draggable: false 
     }); 
    }); 

    function getAndShowDialogContents(entryDiv) { 

     var entryId = $(entryDiv).find('input[type="hidden"]').val(); 
     var x = $(entryDiv).position().left + jQuery(entryDiv).outerWidth(); 
     var y = $(entryDiv).position().top - jQuery(document).scrollTop(); 

     $.ajax(
     { 
      type: 'POST', 
      url: 'Request/GetCalendarDetails', 
      data: { id: entryId }, 
      success: function (result) { 

       $currentDialog.html(result); 

       $currentDialog.dialog("option", "position", [x, y]); 
       $currentDialog.dialog('open'); 
      } 
     }); 
    } 
</script> 
0

これは有効な記述ですか?

$currentDialog.dialog("close"); 

この時点では範囲外です。たぶん

あなたが$(前に外にそれを定義した場合)。

var $currentDialog; 
$().ready(function() { 
    ... 
+0

このケースではグローバルなvarなので、範囲に入ります。まだやっていることは良いことではありません。 –

+0

jQueryで使用する正しいsintaxを説明しました –

+0

グローバル変数を使用するので、ユーザーがページをどこでもクリックしてダイアログを閉じることができるオーバーレイがクリックされたときにダイアログにアクセスできます。これを行うより良い方法がある場合は、私に知らせてください。私はこの問題に私の解決策を掲載しました。もしあなたがその解決策でグローバル変数の使用法を修正できれば、それは高く評価されるでしょう、私は方法を知らないだけです。 –

0

準備ができてあなたは、ダイアログをリセットする必要があります。

contentdiv.dialog("destroy").dialog(.... 

注:

var contentdiv = $(entryDiv).next('.leaveRequestPopup'); 

をすれば、その後contentdivが既にjQueryオブジェクトであるあなたが何か言うので:

contentdiv.click(function(){ 
    //code here 
}); 

をあなたは$を(それをラップする必要はありません。もう一度。この関数を呼び出す

getAndShowDialogContents(this); 

それは引数として生のドキュメントオブジェクトではなく、jQueryの1、使用渡します:

+2

二重の期間で構文エラーがあると思います。 – earlonrails

+0

ありがとう、とにかく、タイプミスに気づくのをもっと助けて、(タイプミスなしで)コードのスニペットに投票したものを –

+0

答えてくれてありがとうございます。ダイアログを作成する前に、私のAjax成功関数で破棄しますか? –

関連する問題