ページ「Knockout/text」と「Knockout.js/htmlバインディング」の間の差分

提供: MonoBook
< Knockout(ページ間の差分)
ナビゲーションに移動 検索に移動
imported>Administrator
 
imported>Administrator
 
1行目: 1行目:
#転送 [[Knockout/textバインディング]]
+
[[Knockout]]の'''htmlバインディング'''とは、パラメーターの値に応じ、関連付けられた[[DOM]]要素内のHTMLを書き換える[[Knockout/可視バインディング|可視バインディング]]のひとつである。
 +
 
 +
[[Knockout/textバインディング|textバインディング]]とほぼ同じだが、htmlバインディングは文字列がHTMLエスケープされずに直接書き込まれる。つまり一歩間違えば重大な[[セキュリティホール]]となりうる諸刃の剣である。
 +
 
 +
== パラメーター ==
 +
[[Knockout]]は、関連付られたDOM要素内のHTML(innerHTMLプロパティ)を、パラメーターの値で上書きする。
 +
 
 +
このパラメーターが[[Knockout/observable]]の場合は、値を更新するたびにHTMLも更新する。パラメーターがobservableでない場合はバインディング適用時([[Knockout/applyBindings]]実行時)に1回だけ更新されて以降は更新されない。
 +
 
 +
パラメーターの値の[[型]]が数値(number型)または文字列(string型)の場合はそのものを、それ以外の場合はtoString()メソッドを実行した結果でテキストを上書きする。
 +
 
 +
== 使用例 ==
 +
=== hello world ===
 +
「[[hello, world]]」はこんな感じ。
 +
内容自体は[[Knockout/textバインディング|textバインディング]]とほぼ同じである。HTMLがエスケープされるか、されないかの違いしかない。
 +
 
 +
<source lang="html5">
 +
<!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>
 +
</source>
 +
 
 +
=== HTMLエンコーディングについて ===
 +
htmlバインディングはDOM要素のinnerHTMLプロパティを使用して書き換えを行うため、使い方を誤れば[[スクリプト・インジェクション]]攻撃をうける[[セキュリティホール]]となりうるので、信頼されていないモデルの値は絶対に使用してはいけない。
 +
 
 +
コンテンツが安全であることを保証できない場合は、[[Knockout/textバインディング|textバインディング]]を使用すること。
 +
 
 +
== 関連項目 ==
 +
* [[Knockout]]
 +
** [[Knockout/可視バインディング|可視バインディング]]
 +
 
 +
== 参考文献 ==
 +
<references/>
 +
== 外部リンク ==
 +
 
 +
{{stub}}

2012年4月11日 (水) 08:34時点における版

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

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

パラメーター

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

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

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

使用例

hello world

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バインディングを使用すること。

関連項目

参考文献

外部リンク