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