【问题标题】:Form input onfocus problem表单输入onfocus问题
【发布时间】:2011-08-13 23:15:23
【问题描述】:

我想在我的注册表单中使用 jQuery Masked Input Plugin (http://digitalbush.com/projects/masked-input-plugin/)。我的表格是这样的

...

<input  class="part1" type="text" name="lname"  value="Last Name" onfocus="if(this.value=='Last name') {this.style.color='#aea592';this.style.fontStyle='normal'; this.value=''};" onblur="if(this.value=='')  {this.style.color='#aea592'; this.style.fontStyle='italic'; this.value='Last name'}"  />
<input class="part2" type="text" id="dob" name="dob"  value="Date of Birth" onfocus="if(this.value=='Date of Birth') {this.style.color='#aea592';this.style.fontStyle='normal'; this.value=''};" onblur="if(this.value=='')  {this.style.color='#aea592'; this.style.fontStyle='italic'; this.value='Date of Birth'}" />

...

文件的结尾

<script src="core/code/js/mask.js"></script>
<script type="text/javascript">
jQuery(function($) {
    $('#dob').mask('99.99.9999', {placeholder:' '});
});
</script>

当您打开页面时,姓氏字段显示“姓氏”一词,但出生日期不显示任何内容。 http://prntscr.com/2miaa我如何才能为 onfocus 事件激活遮罩插件?

【问题讨论】:

  • 你真的不应该在整个 HTML 中使用内联 javascript,尤其是不要那么多。
  • 你应该阅读unobtrusive JavaScript

标签: jquery html mask onfocus


【解决方案1】:

Yarr... 好吧,首先不要在你的标记里放这么多的脚本。它很难阅读,而且会更难维护。让我们先尝试分离表单的样式和功能。

编辑:可以在http://jsfiddle.net/ninjascript/RuFHK/2/找到一个工作示例

CSS

input { color: #aea592; }
input.default { font-style: italic; }

HTML

<input class="part1 default" type="text" name="lname" value="Last Name"/>
<input class="part2 default" type="text" id="dob" name="dob" value="Date of Birth"/>

JavaScript

$('input').bind('focus', function() {
    var el = $(this);
    if (el.hasClass('default')) {
        el.removeClass('default').val('');
    }
});

...好吧,这更容易理解。现在您只希望再发生一件事 在焦点上发生,那就是对#dob 元素中包含的值应用掩码。这是编辑后的块:

$('input').bind('focus', function() {
    var el = $(this);
    if (el.hasClass('default')) {
        el.removeClass('default').val('');
    }
    if (el.attr('id') === 'dob') {
        $(this).mask('99.99.9999', {placeholder:' '});
    }
});

现在您的输入应该在获得焦点后被屏蔽。

如果您想确保在提交时返回 一些 值,您始终可以在“模糊”上验证内容。我真的不想为这个表单中的每个字段编写 if 语句,所以我只是要映射每个字段名称及其默认值并引用它:

var defaultValues = {
    'lname': 'Last Name',
    'dob': 'Date of Birth'
};

现在,只要我需要使用我的默认值重新填充该字段,我就可以参考该地图。在 DOB 字段的情况下,看起来输入掩码插件也有一个“取消掩码”选项。不幸的是,因为 mask 中的字符是#dob 字段值的一部分,我们不能只检查空值。相反,我将使用一个正则表达式来检查一个只包含空格和 '.' 的值。字符:

$('input').bind('blur', function() {
    var el = $(this);
    var name = el.attr('name');

    // Really we only want to do anything if the field is *empty*
    if (el.val().match(/^[\s\.]*$/)) {

        // To get our default style back, we'll re-add the classname
        el.addClass('default');

        // Unmask the 'dob' field
        if (name === 'dob') {
            el.unmask();
        }

        // And finally repopulate the field with its default value
        el.val(defaultValues[name]);
    }
});

【讨论】:

  • 感谢您的快速回复。但是,如果没有写入(我的意思是如果字段为空),我如何返回默认值?
  • 我刚刚更新了我的答案——这应该让你非常接近你想要做的事情。
  • Aaand 我刚刚再次更新了我的答案,因为如果你要验证每个“模糊”事件的输入,你真的不想使用 jQuery.one() ^_^
  • 请查看 twitter 注册表单,twitter.com/?ref=joinus 我想得到类似的东西。试着写点东西。然后删除所有写的。将返回默认值。但就我而言,我必须为所有字段编写最后一段代码?
  • 好吧,我放不下。称其为个人问题。我已经为你准备了一个 jsFiddle 项目,它可以工作并且应该做你正在寻找的一切:jsfiddle.net/ninjascript/RuFHK
猜你喜欢
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2011-03-20
  • 2017-10-01
  • 2018-07-03
相关资源
最近更新 更多