フォーカスがあたったらボタンを表示して、ボタンが押されるまで表示し続ける:slideDown/slideUp版

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>フォーカスがあたったらボタンを表示して、ボタンが押されるまで表示し続ける:slideDown/slideUp版</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.   ko.bindingHandlers.slideVisible = {
  10.     update: function(element, valueAccessor, allBindingsAccessor)
  11.     {
  12.       // 現状の値と、サブプロパティ一覧の取得
  13.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  14.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  15.       
  16.       // サブプロパティ:slideDurationの値をセット
  17.       // 400ms is default duration unless otherwise specified
  18.       var duration = allBindings.slideDuration || 400;
  19.       
  20.       // DOMをいじる
  21.       if (valueUnwrapped == true)
  22.       {
  23.         $(element).slideDown(duration);
  24.       }
  25.       else
  26.       {
  27.         $(element).slideUp(duration);
  28.       }
  29.     }
  30.   };
  31.   $(document).ready(function () {
  32.     ko.applyBindings(new ViewModel());
  33.   });
  34.   function ViewModel() {
  35.     var self = this;
  36.     self.focusInput = ko.observable(false);
  37.     self.inputData = ko.observable("");
  38.     self.activeDataArea = ko.observable(false);
  39.     self.addDataArea = ko.computed(function() {
  40.       if (self.focusInput() == true)
  41.       {
  42.         // フォーカスがあたったときactiveDataArea()とtrueにしておくフォーカスが外れても問題ないように。
  43.         self.activeDataArea(true);
  44.         return true;
  45.       }
  46.       else if (self.activeDataArea() == true)
  47.       {
  48.         // フォーカスが外れ、activeDataArea()がtrueのとき
  49.         return true;
  50.       }
  51.       return false;
  52.     }, self);
  53.     self.addData1 = function()
  54.     {
  55.       self.inputData("丸ごとしまうま");
  56.       self.activeDataArea(false);
  57.     }
  58.     self.addData2 = function()
  59.     {
  60.       self.inputData("ねぎま");
  61.       self.activeDataArea(false);
  62.     }
  63.   }
  64. </script>
  65. <style type="text/css">
  66. .inData
  67. {
  68.   position:absolute;
  69.   top:0;
  70.   left:20px;
  71.   width:200px;
  72.   padding:10px;
  73.   background:#f0f0f0;
  74.   border:1px solid #ccc;
  75.   cursor:pointer;
  76. }
  77. </style>
  78. </head>
  79. <body>
  80. <h1>フォーカスがあたったらボタンを表示して、ボタンが押されるまで表示し続ける:slideDown/slideUp版</h1>
  81. <input type="text" data-bind="hasfocus: focusInput, value: inputData" /><br />
  82. <!-- div style="position:relative;top:0;left:0;background:red;" data-bind="visible: addDataArea" -->
  83. <div style="position:relative;top:0;left:0;background:red;" data-bind="slideVisible: addDataArea">
  84.   <button data-bind="event: {click: addData1}, clickBubble: false">「丸ごとしまうま」を追加</button>
  85.   <button data-bind="event: {click: addData2}, clickBubble: false">「ねぎま」を追加</button>
  86. </div>
  87. <input type="text" /><br />
  88. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  89. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  90. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  91. </div>
  92. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  93. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  94. </div>
  95. </body>
  96. </html>