智能文本替换为jQuery

时间:2014-01-07 10:37:57

标签: javascript jquery html

我需要替换部分文字,例如在已经加载的页面上的mustache var {{myvar}}。 示例html:

<html>
   <head>
      <title>{{MYTITLE}}</title>
   </head>
   <body>
      <p><strong><ul><li>text {{TEXT}}</li></ul></strong></p>
      {{ANOTHER}}
   </body>
</html>

有什么问题?使用$(html).html(myrenderscript($(html).html()))

它很丑陋,速度慢,并且有<script>个标签。

你想要什么?

我希望获得与{{}}最接近的标记,而不是渲染和替换。

您的研究?

首先,我尝试了:$('html :contains("{{"))。但它会返回<title>, <p>, <strong> ....但我需要<title><li>

我试图过滤它们:

$('html :contains("{{")').filter(function (i) {
   return $(this).find(':contains("{{")').length === 0
});

...但WONT返回{{ANOTHER}}。那是我死路一条。你的建议?

3 个答案:

答案 0 :(得分:2)

使用http://benalman.com/projects/jquery-replacetext-plugin/,您可以执行以下操作:

$('html *').replaceText(/{{([^}]+)}}/, function(fullMatch, key) {
    return key;
}, true);

请参阅http://jsfiddle.net/4nvNy/

答案 1 :(得分:1)

如果你想做的就是替换那个文本 - 那么以下肯定是有效的(或者我误解了)

用法如下:CONTAINER(正文) - 替换TCxt(搜索术语(我已经在该术语周围建立了始终包含{{}}的函数),(替换 - 这也会删除{{}})< / p>

$('body').replaceText("MYTITLE","WHATEVER YOU WANT IT REPLACING WITH");

$.fn.replaceText = function(search, replace, text_only) {  
return this.each(function(){  
    var v1, v2, rem = [];
    $(this).find("*").andSelf().contents().each(function(){
        if(this.nodeType === 3) {
            v1 = this.nodeValue;
            v2 = v1.replace("{{" + search + "}}", replace );
            if(v1!=v2) {
                if(!text_only && /<.*>/.test(v2)) {  
                    $(this).before( v2 );  
                    rem.push(this);  
                }
                else this.nodeValue = v2;  
            }
        }
    });
    if(rem.length) $(rem).remove();
});
};

答案 2 :(得分:1)

如果你想要这样的话,你可以完全避免使用jQuery:

<body>


<p><strong>
    <ul>
        <li>text {{TEXT}}</li>
    </ul>
</strong></p>
{{ANOTHER}}

<hr/>
<div id="showResult"></div>

<script>


    var body = document.getElementsByTagName('body')[0].innerHTML;
    var startIdx = 0, endIdx = 0, replaceArray = [];
    var scriptPos = body.indexOf('<script');
    while (startIdx != 1) {
        startIdx = body.indexOf('{{', endIdx) + 2;
        if(startIdx > scriptPos){
            break;
        }
        endIdx = body.indexOf('}}', startIdx);
        var keyText = body.substring(startIdx, endIdx);
        replaceArray.push({"keyText": keyText, 'startIdx': startIdx, 'endIdx': endIdx});

    }

    document.getElementById("showResult").innerHTML = JSON.stringify(replaceArray);


</script>

</body>

然后,您可以使用replaceArray执行您想要的操作。