我要做的是有一个输入字段来编辑一些信息。我正在设置它,以便在每个字段都更改时(文本框和复选框的组合),AJAX更新信息并在配置文件框中显示更改(服务器负载低,不关心效率)。如果用户点击Escape,我希望文本框中的值恢复为原始值(如果他们正在编辑他们改变主意的字段)。对于文本框,我遇到了一个变量问题 - 我知道我可以使用数组或隐藏字段,但现在我想知道如何使这个版本工作:)
我设置我的变量:
var first_name = "' || i.instructor_fname || '";
我有输入字段:
<input type="text" id="first_name" value="' || i.instructor_fname ||'">
和Escape功能:
if (e.keyCode == 27) {
if (document.activeElement.id != "" ) {
$("#" + document.activeElement.id)
.val(document.activeElement.id);
}
}
对于first_name,输出为first_name。正确设置该值,因为文本框已正确填充。似乎我没有将'first_name'作为变量读取,而是作为字符串读取。我尝试了一些加入文字的组合,但仍然没有运气。有什么想法吗?同样,我知道我可以使用其他技术,但似乎想出这个可能会对其他项目派上用场。
答案 0 :(得分:1)
我不确定我理解,但也许你需要在document.activeElement.id上调用eval()。
答案 1 :(得分:0)
我不确定我也明白,但这有多接近?
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最初相同的值,并且当用户按下escape时将其设置为焦点。
答案 2 :(得分: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]);
答案 3 :(得分: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变量漂浮得更优雅/更清洁。
另外......
考虑到实现,假设 default-value 始终与输入元素初始值匹配,那么您甚至不需要更改服务器为您的标记呈现标记的方式页。即仍然渲染原始输入元素(减去默认值属性)。
<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());
});
})