单击时删除输入文本的默认值

IT技术 javascript html input default-value
2021-03-10 18:21:45

我有一个输入文本:

<input name="Email" type="text" id="Email" value="email@abc.com" />

我想设置一个默认值,比如“你的编程问题是什么?具体点。” 在 StackOverFlow 中,当用户点击它时,默认值消失。

6个回答

为了将来参考,我必须包含 HTML5 方法来执行此操作。

<input name="Email" type="text" id="Email" value="email@abc.com" placeholder="What's your programming question ? be specific." />

如果您有 HTML5 文档类型和符合 HTML5 的浏览器,这将起作用。但是,目前许多浏览器不支持此功能,因此至少 Internet Explorer 用户将无法看到您的占位符。然而,看到http://www.kamikazemusic.com/quick-tips/jquery-html5-placeholder-fix/archive.org版)的解决方案。使用它,您将非常现代且符合标准,同时还为大多数用户提供功能。

此外,提供的链接是一个经过充分测试和完善的解决方案,它应该是开箱即用的。

value="" 似乎覆盖了占位符,并且在它们都存在的情况下不起作用。
2021-04-25 18:21:45
很好的答案,现在非常相关。效果<textarea placeholder="Write something..."></textarea>很好
2021-05-05 18:21:45
@Brian:这个链接对我有用,但我在我写这个答案的时候添加了一个指向 archive.org 页面版本的链接。请记住,那是在 2010 年 - 现在所有现代浏览器都支持占位符属性,因此您不需要 - 并且可能不应该使用 - 增强兼容性的脚本。
2021-05-18 18:21:45

编辑:虽然此解决方案有效,但我建议您尝试下面的 MvanGeest 解决方案,解决方案使用placeholder-attribute 和 javascript 回退,用于尚不支持它的浏览器。

如果您在 MvanGeest 的回复中寻找相当于 JQuery 回退的 Mootools,这里是一个.

——

您可能应该使用onfocusonblur事件来支持通过表单进行选项卡的键盘用户。

下面是一个例子:

<input type="text" value="email@abc.com" name="Email" id="Email"
 onblur="if (this.value == '') {this.value = 'email@abc.com';}"
 onfocus="if (this.value == 'email@abc.com') {this.value = '';}" />
@roosteronacid - 您将干净的源代码干净的 DOM混淆,这是两个非常不同的概念。这是附加处理程序另一种方式,DOM 将看到这与一种不显眼的方法之间的区别很小。标记不是 DOM,而是初始化 DOM 的结构。
2021-04-20 18:21:45
借调。-1 对于 DOM 污染,有更多语义解决方案(更不用说更干净、更短等)
2021-04-29 18:21:45
@尼克:你说得对。污染源头是我的意思。
2021-05-04 18:21:45
恕我直言,使用 HTML 属性没有任何问题。最重要的是它不会“污染 DOM”。这是设置立即工作的事件侦听器的最佳和最可靠的方法,无需等待 on-DOM-ready/onload。唯一可以做的改进是将内联代码提取到函数中。
2021-05-09 18:21:45
我以为提问者只是想要一个简单的解决方案,所以我没有多想就给了他最简单的解决方案。但是,我认为理想的解决方案(如您所指出的)是将 -placeholder属性与 Javascript 回退一起用于尚不支持它的浏览器。
2021-05-13 18:21:45

我认为这更干净一些。请注意输入的“defaultValue”属性的用法:

<script>
function onBlur(el) {
    if (el.value == '') {
        el.value = el.defaultValue;
    }
}
function onFocus(el) {
    if (el.value == el.defaultValue) {
        el.value = '';
    }
}
</script>
<form>
<input type="text" value="[some default value]" onblur="onBlur(this)" onfocus="onFocus(this)" />
</form>

使用 jQuery,您可以执行以下操作:

$("input:text").each(function ()
{
    // store default value
    var v = this.value;

    $(this).blur(function ()
    {
        // if input is empty, reset value to default 
        if (this.value.length == 0) this.value = v;
    }).focus(function ()
    {
        // when input is focused, clear its contents
        this.value = "";
    }); 
});

你可以把所有这些都塞进一个自定义插件中,像这样:

jQuery.fn.hideObtrusiveText = function ()
{
    return this.each(function ()
    {
        var v = this.value;

        $(this).blur(function ()
        {
            if (this.value.length == 0) this.value = v;
        }).focus(function ()
        {
            this.value = "";
        }); 
    });
};

以下是您将如何使用该插件:

$("input:text").hideObtrusiveText();

使用此代码的优点是:

  • 不显眼,不污染DOM
  • 代码重用:它适用于多个领域
  • 它自己计算输入的默认值



非 jQuery 方法:

function hideObtrusiveText(id)
{
    var e = document.getElementById(id);

    var v = e.value;

    e.onfocus = function ()
    {
        e.value = "";
    };

    e.onblur = function ()
    {
        if (e.value.length == 0) e.value = v;
    };
}
这里有 3 条评论:1)if (this.value == v) this.value = v;应该是if (this.value === "") this.value = v;,2) 您正在清除焦点上的值,即使它是有效的非默认值,并且 3) 不要假设他们正在使用 jQuery。
2021-04-29 18:21:45
@NickCraver,我们真的需要===在这种情况下使用吗?我认为我们总是可以假设文本输入的值是一个字符串,但""只会评估?
2021-04-30 18:21:45
如果我输入任何内容并重新聚焦元素,您的解决方案仍然会清除元素,这不是理想的行为。
2021-05-02 18:21:45
是的。我发现了错误并改正了它。谢谢你尼克:)
2021-05-17 18:21:45

标签中输入以下内容,只需添加 onFocus="value=''" 以便您的最终代码如下所示:

<input type="email" id="Email" onFocus="value=''"> 

这利用了 javascript onFocus() 事件持有者。