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. <style type="text/css">
  9. td, th{
  10.   border:1px solid #ccc;
  11. }
  12. </style>
  13. <script type="text/javascript">
  14.   $(document).ready(function () {
  15.     ko.applyBindings(new ViewModel());
  16.   });
  17.   function ViewModel() {
  18.     var self = this;
  19.     self.jsonTemporary = {};
  20.     self.jsonData = ko.observable();
  21.     self.tempTaste = ko.observable();
  22.     this.viewTaste = ko.computed( function()
  23.     {
  24.       return self.tempTaste();
  25.     }, this);
  26.     // 表示
  27.     self.GotoView = function(json) {
  28.       this.jsonData(json);
  29.     };
  30.     // 指定ボタンが押されたとき
  31.     self.gotoTaste = function() {
  32.       url = "039_passing_value_child.html";
  33.       window.open(url, "window_name", "width=250,height=350,scrollbars=yes,resizable=yes,status=yes");
  34.     };
  35.     // 登録
  36.     self.entryTaste = function(data, event) {
  37.       htmlDom = event.target;
  38.       this.taste = $(htmlDom).parents("tr").find(".span")[0].textContent;
  39.       self.tempTaste(this.taste);
  40.     };
  41.     // 削除
  42.     self.deleteTaste = function(data, event) {
  43.       htmlDom = event.target;
  44.       $(htmlDom).parents("tr").find(".span")[0].textContent = "";
  45.       this.taste = "";
  46.       self.tempTaste(this.taste);
  47.     };
  48.     // デフォルトでの表示:元データを読込んでおく
  49.     $.getJSON("./testdata/testdataA.txt", {}, function(json){
  50.       json["taste"] = "";
  51.       self.jsonTemporary = json; // 何回も読込みされるのがイヤなので保管しておく
  52.       self.GotoView(self.jsonTemporary);
  53.     });
  54.   }
  55. </script>
  56. </head>
  57. <body>
  58. <h1>「knockout.jsで親ウィンドウに値を渡す」の親ウィンドウ側</h1>
  59. <div>
  60.   <table data-bind="visible: jsonData()">
  61.     <thead><tr><th>品名</th><th>金額</th><th>味</th><th>ボタン</th></thead>
  62.     <tbody data-bind="with: jsonData">
  63.       <tr>
  64.         <td data-bind="text: name"></td>
  65.         <td data-bind="text: price"></td>
  66.         <td data-bind="text: $root.viewTaste"></td>
  67.         <td>
  68.           <span class="span"></span>
  69.           <button data-bind="click: $root.gotoTaste">指定</button>
  70.           <button data-bind="click: $root.entryTaste">確定</button>
  71.           <button data-bind="click: $root.deleteTaste">削除</button>
  72.         </td>
  73.       </tr>
  74.     </tbody>
  75.   </table>
  76. </div>
  77. <hr>
  78. ちなみに子ウィンドウのHTMLソースは下記。
  79. <div style="border:1px solid #ccc;margin-top:1em;padding:0.5em;">
  80. <pre style="margin:0;">
  81. &lt;!DOCTYPE html>
  82. &lt;html lang="ja">
  83. &lt;head>
  84. &lt;meta charset="UTF-8">
  85. &lt;title>knockout.jsで親ウィンドウに値を渡す:子ウィンドウ&lt;/title>
  86. &lt;script type="text/javascript" src="jquery-1.5.1.min.js">&lt;/script>
  87. &lt;script type="text/javascript" src="knockout-2.1.0beta.js">&lt;/script>
  88. &lt;script type="text/javascript">
  89.   $(document).ready(function () {
  90.     ko.applyBindings(new ViewModelChild());
  91.   });
  92.   function ViewModelChild() {
  93.     var self = this;
  94.     self.tasteAry = ko.observableArray([
  95.       {tasteData: 'たれ'}, {tasteData: '塩'}, {tasteData: '味噌'}, {tasteData: '芥子'},
  96.     ]);
  97.     // 表示
  98.     self.addTaste = function(data) {
  99.       window.opener.$(".span")[0].textContent = data.tasteData;
  100.     };
  101.   }
  102. &lt;/script>
  103. &lt;/head>
  104. &lt;body>
  105. &lt;h1>「knockout.jsで親ウィンドウに値を渡す」の子ウィンドウ側&lt;/h1>
  106. &lt;div>
  107.   &lt;table data-bind="visible: tasteAry">
  108.     &lt;thead>&lt;tr>&lt;th>味&lt;/th>&lt;th>追加&lt;/th>&lt;/thead>
  109.     &lt;tbody data-bind="foreach: tasteAry">
  110.       &lt;tr>
  111.         &lt;td data-bind="text: tasteData">&lt;/td>
  112.         &lt;td>&lt;button data-bind="click: $root.addTaste">追加A&lt;/buuton>&lt;/td>
  113.       &lt;/tr>
  114.     &lt;/tbody>
  115.   &lt;/table>
  116. &lt;/div>
  117. &lt;/body>
  118. &lt;/html>
  119. </pre>
  120. </div>
  121. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  122. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  123. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  124. </div>
  125. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  126. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  127. </div>
  128. </body>
  129. </html>