【问题标题】:How can I replace text variables on a live preview?如何在实时预览中替换文本变量?
【发布时间】:2013-06-07 19:21:25
【问题描述】:

我有一个包含相关变量及其值的定义列表。 (也见fiddle

<dl id="myVars">
    <dt class="var-name">%name%</dt>
    <dd class="var-name">Joe Sample</dd>
    <dt class="var-phone">%phone%</dt>
    <dd class="var-phone">555-1212</dd>
</dl>

我还有一个文本区域,可以在其文本中使用上述任何变量。例如:

<textarea>Hello %name%, is this still the right phone number: %phone%?</textarea>

最后有一个预览 div,可以在其中看到替换变量后的解释文本。像这样:

<div id="preview"></div>

你能帮我想出一个有效的方法来使用 jQuery 来显示实时预览,同时它用它们的值替换变量吗?

如果你愿意帮忙,这里有一个方便的小提琴:http://jsfiddle.net/XAzZr/

【问题讨论】:

  • 我希望它在变量完全完成之前不会替换任何内容,因此在您输入结束 % 符号之前,预览可能会显示“Hello %name”。然后预览会显示“Hello Joe Sample”。当然 textarea 将保持不变。

标签: javascript jquery replace preview


【解决方案1】:

http://jsfiddle.net/NFtVc/

var subst = {}, // store substitutions in an object to eliminate DOM lookups
    substRegex = /(.*)%(\S*)%(.*)$/i;

function defineSubst(){
    $("#myVars dd").each(function(){
        var cls = this.className.split(' '),
            l = cls.length;
        while (l--){
            if (cls[l].indexOf('var-') == 0)   
               subst[cls[l].replace(/var-/, "")] = this.innerHTML;   
        } 
    });
}

function getSubst(key){
    if (typeof subst[key] == "undefined")
        return "[INVALID CODE]";
    else
        return subst[key];        
}

function updatePreview(){
     var txt = $('textarea').val().split(' '),
        newTxts = [],
        regex = /(.*)%(\S*)%(.*)$/i;

    $.each(txt, function(){
        var m = substRegex.exec(this);
        if (m)
            newTxts.push(m[1] + getSubst(m[2]) + m[3]);
        else
            newTxts.push(this);
    });

    $("#preview").text(newTxts.join(' '));  
}

$('document').ready(defineSubst);
$('textarea').keyup(updatePreview);

【讨论】:

  • 美丽。这真的很接近,但它在几个关键地方中断了。例如:%name%'s phone number is (%phone%)。你能给我指出正确的方向,让我越过终点线吗?
  • 已更新。第一次空间分割可能有点过头了,但它确实允许像“Hi %name%,你是目标 A 的 20% 和目标 B 的 30%”这样的字符串,而不会对正则表达式感到疯狂。
  • 令人印象深刻的测试用例,完美执行。谢谢。
【解决方案2】:
$('textarea').on('keyup', function() {
    var message = this.value.replace(/%(.*?)\S+/g, function(val) {
        var elem = $('dt').filter(function() {
            return $(this).text() == val;
        });
        return elem.length ? elem.next('dd').text() : '';
    });

    $('#preview').text(message);
});

FIDDLE

【讨论】:

  • 美丽。即使字符串没有被空格包围,你能帮我完成这项工作吗?例如:%name%'s phone number is (%phone%)
  • 是的,这更好,但仍然失败,例如:Hi %name%, you are 20% of goal A and 30% of goal B。但是马尔克没有太多麻烦就完成了。感谢您的帮助。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2017-12-20
  • 2012-12-18
  • 2018-10-05
  • 2018-07-09
相关资源
最近更新 更多