如何清除焦点上的文本区域?

Posted

技术标签:

【中文标题】如何清除焦点上的文本区域?【英文标题】:How can I clear a textarea on focus? 【发布时间】:2011-04-13 09:22:11 【问题描述】:

我使用带有 textarea 的简单表单,当用户单击 textarea 时,我希望清除 textarea 的内容。

这可能吗?

【问题讨论】:

您确定不想只删除默认文本吗?以我的经验,这些行为可能真的很侵入性...... 使用帮助文本的值有许多可用性缺陷:用户可能无意中提交它,浏览器可能会覆盖它,用户可能在脚本运行之前开始输入等等。方法是在输入字段上放置标签,这比设置值要复杂一些,但幸运的是有一堆插件(例如labelify)为您完成了困难的部分。 【参考方案1】:
$('textarea#someTextarea').focus(function() 
   $(this).val('');
);

【讨论】:

【参考方案2】:

如果你只想删除默认文本(如果存在的话),试试这个:

$("textarea").focus(function() 

    if( $(this).val() == "Default Text" ) 
        $(this).val("");
    

);

通过测试默认文本,如果用户返回文本区域,您将不会清除用户输入的文本。

如果您想在他们离开后重新插入默认文本(如果他们没有输入任何文本),请执行以下操作:

$("textarea").blur(function() 

    if( $(this).val() == "" ) 
        $(this).val("Default Text");
    

);

当然,以上示例假设您从以下标记开始:

<textarea>Default Text</textarea>

如果你想在语义上使用占位符文本,你可以使用新的 html5 属性:

<textarea placeholder="Default Text"></textarea>

虽然这仅在支持的浏览器中受支持。但它还有一个额外的优势,即在表单提交时不提交占位符文本。

【讨论】:

text() 无法按预期工作,请改用val()(此处的示例不适用于text(),但可以使用val() 谢谢spaus。我已经更新了使用新版本 jQuery 的答案(根据您的建议)。 对于像我这样走得太快的人,第二个 sn-p 必须在第一个之后添加。第一个是“焦点”部分,第二个是“模糊”部分:) 我完全赞成删除默认文本,但由于某种原因,这里的字符串比较器和“最佳答案”对我不起作用。由于某种原因,默认字符串实际上并不等于 $(this).val()。如果你遇到这种情况,试试这个:if($('#textbody').val().indexOf("This is default text.") &gt; -1) $(this).val(''); 【参考方案3】:

我的建议是你只删除第一个焦点上的初始默认内容。在后续关注中,您可能会删除用户内容。要实现这一点,只需.unbind()第一次点击后的焦点处理程序:

$("textarea").focus(function(event) 

      // Erase text from inside textarea
    $(this).text("");

      // Disable text erase
    $(this).unbind(event);
);

jsFiddle example


请注意,由于您使用的 textarea 具有打开和关闭标签,因此您可以使用 $(this).text("");$(this).html("");...而且,由于 textarea 中的文本是它的值,因此您还可以使用 $(this).val("");$(this).attr("value", ""); 甚至 this.value = "";

【讨论】:

我认为这是一个比接受的解决方案更合适的解决方案。谢谢【参考方案4】:

HTML5 为这个问题提供了一个更优雅的解决方案:“占位符”属性。

它将在您的文本区域的背景中创建一个文本,该文本仅在文本区域为空时才会出现。

<textarea placeholder="Enter some text !"></textarea>

【讨论】:

【参考方案5】:

这里有几个问题仅在当前答案中部分解决:

    您需要在用户聚焦字段时清除文本 您只想在用户第一次点击该字段时清除它 您不希望用户能够在默认文本被清除之前提交它 如果用户决定重新输入默认文本,您可能希望允许他们提交默认文本。我不知道他们为什么要这样做,但如果他们坚持重新输入,那么我倾向于让他们去做。

考虑到这些细节,我将在字段中添加一个名为“占位符”的类并使用如下内容:

$("form textarea.placeholder").focus(function(e) 
    $(this).text("");
    $(this).removeClass("placeholder");
    $(this).unbind(e);
);

验证在提交表单时删除了“占位符”类名,以保证用户真的真的想要提交一些愚蠢的占位符文本。

如果您使用的是jQuery Validation Plugin,那么您可以像这样将它们放在一起:

$.validator.addMethod("isCustom", function(value, element) 
    return !$(element).hasClass("placeholder");
);

$(form).validate(
    rules: 
        message: 
            required: true,
            isCustom: true
        
    ,
    messages: 
        message: "Message required, fool!"
    ,
    submitHandler: function(form) 
        $(form).find(":submit").attr("disabled", "disabled");   
        form.submit();
    
);

【讨论】:

【参考方案6】:
jQuery(function($)
    $("textarea").focus(function()
        $(this).val("");
    );
);

【讨论】:

【参考方案7】:

这样的?

$('textarea#myTextarea').focus(function() 
   if ($(this).val() == 'default text') 
      $(this).val('');
   
);

【讨论】:

【参考方案8】:
<textarea type="text" onblur="if ($(this).attr('value') == '') $(this).val('The Default Text');"  onfocus="if ($(this).attr('value') == 'The Default Text') $(this).val('');">The Default Text</textarea>

【讨论】:

【参考方案9】:

我发现很简单

$('#myForm textarea').val(''); 

清除 Chrome 中的表单,但这不适用于 Firefox (6.x)。在 Firebug 中该值为空,但之前的文本仍显示在 textarea 中。为了解决这个问题,我一次选择并重建一个文本区域:

$('#' + formId + ' textarea').each(function(i)
textareaVal = $(this).parent().html();
$(this).parent().html(textareaVal);   
);

这完成了 Firefox 中的工作并且不会破坏 Chrome。它将以一种形式逐一遍历所有文本区域。适用于所有其他浏览器(Opera、Safari 甚至 IE)。

【讨论】:

【参考方案10】:

这是可能的,我认为您正在寻找一种可以为更多文本区域执行此操作的代码... 这是我用于我的网站的内容:Javascript:

<script type='text/javascript'>
function RemoveText(NameEle)

    if ($('#' + NameEle) == 'default')
    
        $('#' + NameEle).val('');
        $('#' + NameEle).text('');
        $('#' + NameEle).html('');
    

function AddText(NameEle)

    if ($('#' + NameEle) == '')
    
        $('#' + NameEle).val('default');
        $('#' + NameEle).text('default');
        $('#' + NameEle).html('default');
    

</script>

HTML:

<textarea cols='50' rows='3' onfocus='RemoveText(this)' onblur='AddText(this)' name='name' id='id'>default</textarea>

【讨论】:

以上是关于如何清除焦点上的文本区域?的主要内容,如果未能解决你的问题,请参考以下文章

清除表单的文本区域和输入

在一页上的文本区域中写入,在另一页中显示文本数据[关闭]

Textarea失去鼠标点击的焦点?

Html 文本区域占位符

Android 应用 (Cordova) 上的文本区域中的字数超出限制

IE10+ 上的 AngularJS,带有占位符的文本区域导致“无效参数”。