knockout.jsでモーダルウィンドウ

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>knockout.jsでモーダルウィンドウ</title>
  6. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  7. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  8. <script type="text/javascript">
  9.   // モーダルウィンドウのマスク
  10.   ko.bindingHandlers.koModalMask = {
  11.     update: function(element, valueAccessor, allBindingsAccessor)
  12.     {
  13.       // 現状の値と、サブプロパティ一覧の取得
  14.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  15.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  16.       
  17.       // サブプロパティ:maskBgColorの値をセット
  18.       var maskBgColor = allBindings.maskBgColor || "#000";
  19.       
  20.       // DOMをいじる
  21.       if (valueUnwrapped == false)
  22.       {
  23.         $(element).hide();
  24.       }
  25.       else
  26.       {
  27.         $(element).css({'width':$(window).width(), 'height':$(document).height()});
  28.         $(element).css({'backgroundColor': maskBgColor});
  29.         $(element).css({'position': 'absolute', 'left': '0', 'top': '0'});
  30.         $(element).css({'z-index': '9000'});
  31.         $(element).fadeIn(600);
  32.         $(element).fadeTo("slow", 0.8);
  33.       }
  34.     }
  35.   };
  36.   
  37.   // モーダルウィンドウ
  38.   ko.bindingHandlers.koModalWindow = {
  39.     update: function(element, valueAccessor, allBindingsAccessor)
  40.     {
  41.       // 現状の値と、サブプロパティ一覧の取得
  42.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  43.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  44.       
  45.       // サブプロパティ:modalBgColorの値をセット
  46.       var modalBgColor = allBindings.modalBgColor || "#fff";
  47.       
  48.       // DOMをいじる
  49.       if (valueUnwrapped == false)
  50.       {
  51.         $(element).hide();
  52.       }
  53.       else
  54.       {
  55.         $(element).css({'backgroundColor': modalBgColor});
  56.         $(element).css({'z-index': '9999'});
  57.         $(element).fadeIn(1000);
  58.       }
  59.     }
  60.   };
  61.   $(document).ready(function () {
  62.     ko.applyBindings(new ViewModel());
  63.   });
  64.   function ViewModel() {
  65.     var self = this;
  66.     self.maskModal = ko.observable(false);
  67.     self.windowModal = ko.observable(false);
  68.     
  69.     // 開く
  70.     self.openModal = function()
  71.     {
  72.       self.maskModal(true);
  73.       self.windowModal(true);
  74.     }
  75.     
  76.     // 閉じる
  77.     self.closeModal = function()
  78.     {
  79.       self.maskModal(false);
  80.       self.windowModal(false);
  81.     }
  82.   }
  83. </script>
  84. <style type="text/css">
  85. .windowModal
  86. {
  87.   position:absolute;
  88.   left:0; top:0;
  89.   z-index:9999;
  90.   background:#fff;
  91. }
  92. </style>
  93. </head>
  94. <body>
  95. <div data-bind="koModalMask: maskModal, click: closeModal"></div>
  96. <h1>knockout.jsでモーダルウィンドウ</h1>
  97. <button data-bind="click: openModal">モーダル</button>
  98. <div style="position:absolute;left:0; top:30px;" data-bind="koModalWindow: windowModal">
  99. テスト
  100. <button data-bind="click: closeModal">閉じる</button>
  101. </div>
  102. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  103. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  104. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  105. </div>
  106. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  107. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  108. </div>
  109. </body>
  110. </html>