formでEnterキーで送信

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>formでEnterキーで送信</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.   $(document).ready(function () {
  10.     ko.applyBindings(new ViewModel());
  11.   });
  12.   function ViewModel() {
  13.     var self = this;
  14.     // 品名データ
  15.     self.itemData = ko.observableArray([
  16.       {"name": "ねぎ間",         "price": "168"},
  17.       {"name": "ハツ",           "price": "136"},
  18.       {"name": "レバー",         "price": "136"},
  19.       {"name": "ぼんちり",       "price": "136"},
  20.       {"name": "はらみ",         "price": "136"},
  21.       {"name": "うずら玉子",     "price": "136"},
  22.       {"name": "なんこつ",       "price": "136"},
  23.       {"name": "手羽先",         "price": "168"},
  24.       {"name": "せせり",         "price": "136"},
  25.       {"name": "白レバー",       "price": "168"},
  26.       {"name": "丸ごとシマウマ", "price": "290"}
  27.     ]);
  28.     // 品名の初期値
  29.     self.selected = ko.observable(self.itemData()[10]);
  30.     // 注文内容
  31.     self.Order = ko.observable();
  32.     self.Item  = ko.computed(function() { return self.selected().name; }, self);
  33.     self.Price = ko.computed(function() { return self.selected().price; }, self);
  34.     // オーダーボタンが押されたとき
  35.     self.gotoOrder = function(formData)
  36.     {
  37.       msg = "";
  38.       msg += "注文者:" + "\n";
  39.       msg += "this.Order():" + this.Order() + "\n";
  40.       // ▼firefoxだととれないっぽい
  41.       //msg += 'formData.elements["order"].value:' + formData.elements["order"].value + "\n";
  42.       
  43.       msg += "商品名:" + "\n";
  44.       msg += 'this.Item():' + this.Item() + "\n";
  45.       // ▼firefoxだととれないっぽい
  46.       //msg += 'formData.elements["item"].selectedOptions[0].text:' + formData.elements["item"].selectedOptions[0].text + "\n";
  47.       
  48.       msg += "単価:" + "\n";
  49.       msg += 'this.Price():' + this.Price() + "\n";
  50.       alert(msg);
  51.     }
  52.   }
  53. </script>
  54. <style>
  55.   table
  56.   {
  57.     border-collapse:collapse;
  58.     margin:0;
  59.   }
  60.   th, td
  61.   {
  62.     text-align:left;
  63.     vertical-align:top;
  64.     padding:8px;
  65.     font-weight:normal;
  66.     border:1px solid #ccc;
  67.   }
  68.   th
  69.   {
  70.     background:#f3f3f3;
  71.   }
  72. </style>
  73. </head>
  74. <body>
  75. <h1>formでEnterキーで送信</h1>
  76. <form data-bind="submit: gotoOrder">
  77. <table>
  78. <tr><th>注文者</th><td><input type="text" name="order" data-bind="value: Order, valueUpdate: 'afterkeydown'" /></td></tr>
  79. <tr><th>商品</th><td><select name="item" data-bind="options: itemData, optionsText: 'name', value: selected"></select></td></tr>
  80. </table>
  81. <div style="margin-top:6px;"><input type="submit" value="注文" /></div>
  82. </form>
  83. ko.computed()やafterkeydownなどしておかないと先に送信イベントが走って値が取れない。引数を渡して無理矢理取得するってのもアリだけど、knockout.jsを使ってるんでそういうのはヤメたほうが良いと思う。ブラウザによっては取得できないこともあるしね。
  84. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  85. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  86. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  87. </div>
  88. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  89. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  90. </div>
  91. </body>
  92. </html>