特定の文字を装飾したい2 - カスタムバインディングを使う

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>特定の文字を装飾したい2 - カスタムバインディングを使う</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.koDecoChange = {
  10.     update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
  11.       var value = valueAccessor();  // 今回の場合だと、self.viewTxtが入る。
  12.       var self  = viewModel;      // viewModel()内の関数群
  13.       
  14.       var valueUnwrapped = ko.utils.unwrapObservable(value);  // self.viewTxt()を入れる
  15.       
  16.       var repText = valueUnwrapped;
  17.       if (self.search() == "") {
  18.       }
  19.       else {
  20.         var strSearch = new RegExp("(" + self.search() + ")", "gi");
  21.         var strReplac = '<b style="background:#ffe0ff;">' + "$1" + "</b>";
  22.         repText = valueUnwrapped.replace(strSearch, strReplac);
  23.       }
  24.       
  25.       element.innerHTML = repText;
  26.     }
  27.   };
  28.   
  29.   function viewModel() {
  30.     var self = this;
  31.     
  32.     self.viewTxt = ko.observable("丸ごとシマウマ");
  33.     self.search = ko.observable("シマウマ");
  34.     
  35.   }
  36.   
  37.   $(document).ready(function () {
  38.     ko.applyBindings(new viewModel());
  39.   });
  40. </script>
  41. <style type="text/css">
  42.   .ko001 {
  43.     padding:20px 10px;
  44.   }
  45.   .ko001 h2{
  46.     margin:0;
  47.   }
  48.   .ko001 .ko001A{
  49.     background-color:#f6f6f6;
  50.     border:1px solid #ccc;
  51.     padding:20px 10px;
  52.     margin-top:10px;
  53.   }
  54.   .ko001 p{
  55.     margin:10px 0 0;
  56.   }
  57. </style>
  58. </head>
  59. <body>
  60. <h1>特定の文字を装飾したい2 - カスタムバインディングを使う</h1>
  61. <div class="ko001">
  62.   <h2>「<span data-bind="text: viewTxt"></span>」の「<span data-bind="text: search"></span>」を装飾して表示</h2>
  63.   <div data-bind="koDecoChange: viewTxt" class="ko001A"></div>
  64.   <p>※使用用途としては、検索結果から検索した文字列を強調表示したいとか。</p>
  65. </div>
  66. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  67. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  68. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  69. </div>
  70. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  71. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  72. </div>
  73. </body>
  74. </html>