または、AngularJS を使用する場合は、フィルターとバインディングを使用できます。
Click:
<div style="border: red thin solid; width: 100px; padding: 10px;">
<div ng-repeat="word in words">
<a ng-click="$parent.selectedWord = word">{{word}}</a>
</div>
</div>
Selected:
<div style="border: red thin solid; width: 100px; padding: 10px;">
<div ng-repeat="word in words">
<span ng-bind-html-unsafe ="word | highlightWord : selectedWord"></span>
</div>
</div>
Selected Word: {{selectedWord}}
と:
app.controller('MainCtrl', function($scope) {
$scope.words = [
"beer",
"wine",
"whiskey",
"vodka",
"gin",
"rum"
];
$scope.selectedWord = '';
});
app.filter('highlightWord', function() {
return function(word, selectedWord) {
if(word === selectedWord) {
return '<strong>' + word + '</strong>';
} else {
return word
}
};
});
http://plnkr.co/edit/v4ueqx?p=preview
フィルターからエスケープされていない html を返すために ng-bind-html-unsafe を使用することに注意してください。ディレクティブを使用してこれを実現することもできます。
編集:
また、テキスト ブロック内の単語を強調表示する場合、アプローチは非常に似ています。
Click:
<div style="border: red thin solid; width: 100px; padding: 10px;">
<div ng-repeat="word in words">
<a ng-click="$parent.selectedWord = word">{{word}}</a>
</div>
</div>
Selected:
<div style="border: red thin solid; width: 100px; padding: 10px;" ng-bind-html-unsafe ="text | highlightWord : selectedWord"></div>
Selected Word: {{selectedWord}}
と:
app.controller('MainCtrl', function($scope) {
$scope.words = [
"beer",
"wine",
"whiskey",
"vodka",
"gin",
"rum"
];
$scope.selectedWord = '';
$scope.text = "blah blah beer blah blah blah wine blah blah blah whiskey blah blah blah vodka blah blah blah blah blah gin blah blah blah blah blah rum blah blah blah blah beer blah blah blah blah vodka blah blah blah vodka blah blah blah blah blah blah vodka blah blah blah blah";
});
app.filter('highlightWord', function() {
return function(text, selectedWord) {
if(selectedWord) {
var pattern = new RegExp(selectedWord, "g");
return text.replace(pattern, '<span class="highlighted">' + selectedWord + '</span>');
} else {
return text
}
};
});
http://plnkr.co/edit/wtxZme?p=preview