我需要替换部分文字,例如在已经加载的页面上的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}}
。那是我死路一条。你的建议?
答案 0 :(得分:2)
使用http://benalman.com/projects/jquery-replacetext-plugin/,您可以执行以下操作:
$('html *').replaceText(/{{([^}]+)}}/, function(fullMatch, key) {
return key;
}, true);
答案 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执行您想要的操作。