1

可能重复:
变量名作为 Javascript 中的字符串

我想要做的是有一个输入字段来编辑一些信息。我正在设置它,以便随着每个字段的更改(文本框和复选框的组合),AJAX 更新信息并在配置文件框中显示更改(服务器负载低,这里不关心效率)。如果用户点击 Escape,我希望文本框中的值恢复为原始值(如果他们正在编辑一个他们改变主意的字段)。对于文本框,我遇到了一个变量问题 - 我知道我可以使用数组或隐藏字段,但现在我想知道如何使这个版本工作:)

我设置了我的变量:

 var first_name = "' || i.instructor_fname || '";

我有我的输入字段:

<input type="text" id="first_name" value="' || i.instructor_fname ||'">

和转义功能:

if (e.keyCode == 27) { 
   if (document.activeElement.id != "" ) {
       $("#" + document.activeElement.id)
                 .val(document.activeElement.id);
   }
}

对于 first_name,输出为 first_name。该值设置正确,因为文本框已正确填充。似乎我没有将 'first_name' 作为变量读取,而是作为字符串读取。我已经尝试了一些将文字加入其中的组合,但仍然没有运气。有什么想法吗?同样,我知道我可以为此使用其他技术,但似乎弄清楚这一点对于其他项目可能会派上用场。

4

4 回答 4

1

我不确定我是否理解,但也许您需要在 document.activeElement.id 上调用 eval()。

于 2012-07-26T20:58:24.797 回答
0

我也不确定我是否理解,但是这有多接近呢?

http://jsfiddle.net/PXcD8/

html:

<input type="text" id="foobar">

js:

$(function()
{
    $(':text').each(function()
    {
        var text = $(this);
        text.keyup(function(event)
        {
            if (event.which == 27)
                reset_textbox();
        });

        reset_textbox();

        function reset_textbox()
        {
                text.val(text.attr('id'));            
        }
    });
});

这会将文本字段的文本设置为与其最初的 id 相同的值,并且当用户按下转义键使其聚焦时。

于 2012-07-26T21:14:20.060 回答
0

更合适的解决方案是创建field_id -> value地图。这可以通过对象轻松完成:

var field_values = {
    first_name: "' || i.instructor_fname || '",
    last_name: "...',
    // ...
};

然后,您可以通过简单地使用括号表示法来获取值:

$("#" + document.activeElement.id)
    .val(field_values[document.activeElement.id]);

假设执行的处理程序绑定到您要修改的元素,代码变得如此简单:

$(this).val(field_values[this.id]);
于 2012-07-26T21:26:48.900 回答
0

如果您正在寻找替代解决方案,为什么不简单地在您的输入中包含一个默认值属性。

<input type="text" id="first_name" value="' || i.instructor_fname ||'"
    default-value="' || i.instructor_fname ||'" />

然后在您的 Escape 键处理程序中

if (e.keyCode == 27) if (document.activeElement.id != "" ) {
    var e = $("#" + document.activeElement.id);
    e.val(e.attr('default-value'));
}

就个人而言,这感觉比让 javascript 变量浮动更优雅/更干净。

此外...

考虑假设默认值始终与输入元素初始匹配的实现,那么您甚至不需要更改服务器为您的页面呈现标记的方式。即仍然呈现您的原始输入元素(减去默认值属性)。

<input type="text" id="first_name" value="' || i.instructor_fname ||'" />​

您只需要以下启动脚本

$(document).ready(function() {
    $('input').each(function() {
        var e = $(this);
        e.attr('default-value', e.val());
    });
})
于 2012-07-26T21:45:09.837 回答