【问题标题】:Select all instance of a word in a rendered webpage在呈现的网页中选择一个单词的所有实例
【发布时间】:2013-08-14 19:26:55
【问题描述】:

我有一个 d3 词云,当点击其中一个词云时会启动一个警告框。我不想启动警报框,而是想在相应的 div 元素 el 中突出显示单击单词的任何匹配实例。

处理程序位于 AngularJs 指令中,因此我在立即关闭中拥有元素的上下文。

.on("click",function(v,i,l){
    console.log(
        el // [div.content ng-scope, ...
        v  // Object {text: "demo", ...
    );
    alert(v.text) // demo
})

我以前在构建搜索框时做过这个,但我丢失了代码并且完全忘记了我是如何做到的。

【问题讨论】:

  • 如果我不立即回复,我就要出门带孩子去看儿童电影了。应该在几个小时后回来......这真的是关于查找/选择文本。我现在感觉脑死了。这应该很简单。

标签: javascript jquery angularjs d3.js


【解决方案1】:

或者,如果你想使用 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

注意使用 ng-bind-html-unsafe 以返回未从过滤器中转义的 html。您也可以使用指令来完成此操作。

编辑:

如果你想在文本块中突出显示一个单词,方法非常相似:

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

【讨论】:

  • 我正在尝试从段落中选择一个单词,如果我将每个单词都包装在 span 中,这将起作用。由于生成了内容,也许我可以将其添加到整个段落并替换过滤器功能中的单词。让我看看我是否能让你的解决方案奏效。
  • +1 作为答案,这是一个好方法。我仍在尝试弄清楚我是否可以使用它。我正在搜索一个巨大的模板,所以我不想认为我必须将过滤器添加到所有这些 div 中。
  • 我正在寻找这样的东西。仍然需要对其进行角度化。 jsfiddle.net/PwcGh
  • 您可以创建一个指令,该指令也必须添加到所有 div 中...或者您可以使用指令覆盖 div 元素类型,这可能会产生意想不到的后果。
  • 这个函数实际上存在于我的“tag-cloud”指令中。它是我简历上 d3 词云的一部分。我让它在整个模板上工作,但基本上当您单击一个单词时,它会突出显示相应公司部分中的单词。我不喜欢它解析 DOM 而不是模型这一事实,尽管我确信有更好的方法来做到这一点,但它足够干净和快速,我可以继续前进。
猜你喜欢
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2012-10-08
  • 2013-07-15
  • 2013-12-12
  • 2013-04-07
相关资源
最近更新 更多