「Knockout.js/htmlバインディング」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
imported>Administrator
 
26行目: 26行目:
 
   <script type="text/javascript">
 
   <script type="text/javascript">
 
     jQuery(function() {
 
     jQuery(function() {
       // モデル
+
       // ビューモデル
 
       var AppViewModel = function() {
 
       var AppViewModel = function() {
 
         this.message = ko.observable("<b>hello</b>, knockout");
 
         this.message = ko.observable("<b>hello</b>, knockout");

2012年4月20日 (金) 08:11時点における最新版

Knockout.jshtmlバインディングとは、パラメーターの値に応じ、関連付けられたDOM要素内のHTMLを書き換える可視バインディングのひとつである。

textバインディングとほぼ同じだが、htmlバインディングは文字列がHTMLエスケープされずに直接書き込まれる。つまり一歩間違えば重大なセキュリティホールとなりうる諸刃の剣である。

パラメーター[編集 | ソースを編集]

Knockout.jsは、関連付られたDOM要素内のHTML(innerHTMLプロパティ)を、パラメーターの値で上書きする。

このパラメーターがobservableオブジェクトの場合は、値を更新するたびにHTMLも更新する。パラメーターがobservableオブジェクトでない場合はバインディング適用時(applyBindings関数実行時)に1回だけ更新されて以降は更新されない。

パラメーターの値のが数値(number型)または文字列(string型)の場合はそのものを、それ以外の場合はtoString()メソッドを実行した結果でテキストを上書きする。

使用例[編集 | ソースを編集]

hello world[編集 | ソースを編集]

htmlバインディングを使用した「hello, world」はこんな感じ。 内容自体はtextバインディングとほぼ同じである。HTMLがエスケープされるか、されないかの違いしかない。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>knockout.js - html bindding sample 1</title>
  <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  <script type="text/javascript" src="knockout-2.0.0.js"></script>

  <script type="text/javascript">
    jQuery(function() {
      // ビューモデル
      var AppViewModel = function() {
        this.message = ko.observable("<b>hello</b>, knockout");
      }
      // バインディング適用
      ko.applyBindings(new AppViewModel());
    });
  </script>
</head>
<body>
 
  <div data-bind="html: message"></div>
 
 </body>
</html>

HTMLエンコーディングについて[編集 | ソースを編集]

htmlバインディングはDOM要素のinnerHTMLプロパティを使用して書き換えを行うため、使い方を誤ればスクリプト・インジェクション攻撃をうけるセキュリティホールとなりうるので、信頼されていないモデルの値は絶対に使用してはいけない。

コンテンツが安全であることを保証できない場合は、textバインディングを使用すること。

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]

外部リンク[編集 | ソースを編集]