在本机不支持“占位符”属性的浏览器中模拟“占位符”属性的最准确方法是什么?

2024-01-01

最近我一直在寻找 jquery/javascript 解决方案来模拟placeholder属性,但似乎没有一个是正确的。常见问题有:

  • 首先不使用原生浏览器支持
  • 表单实际上可能会发布占位符文本的值
  • 如果值相同,则无法识别占位符文本和用户输入(嘿,我的电子邮件是[电子邮件受保护] /cdn-cgi/l/email-protection!!为什么不提交?嘿,我想搜索字符串“Search”,但它不允许我搜索!)
  • 难以设计样式或区分常规文本和占位符文本
  • 强制实施(几乎总是如此。我不想为每个输入添加 2 个 div 和一个样式表来执行此操作)
  • 就是行不通。 jQuery 网站上至少有 2 个。

我已经尝试过一些尝试让它正常工作(从我已经看到的一些代码中获取一些提示),但它仍然需要工作。特别地,表格可以发布占位符的值。欢迎对 jsfiddle 发表评论和修改 http://jsfiddle.net/At8cu/. (注:演示必须在不支持占位符的浏览器中查看)我见过的大多数代码都采用的值placeholder并将其填充到输入本身中,这导致了这个问题,我觉得必须有更好的方法。

有没有一个干净的解决方案实际上有效?

编辑:我想强调这一点:它的行为方式应该像您在浏览器中看到的那样,尽可能地原生支持它,并且尽可能un尽可能地引人注目,如我当前的代码所示,除了包含脚本并使用placeholder就像您通常对支持它的浏览器所做的那样。

更新:@DA 当前的解决方案是一些错误修复,距离完美还很远(请参阅评论),希望看到它 100% 地结合在一起,并将所有糟糕的和有错误的代码放到网络上以示羞耻。

更新:使用 DA 代码的几个 mods 可以实现此功能,但它仍然不完美,主要是关于动态添加的输入字段和现有的submit()绑定。感谢您的帮助,我现在决定不值得。我知道有一些人肯定会使用这个。这是一个很好的技巧,但对我来说,表单提交执行不符合预期的操作或错误读取用户输入的可能性甚至不值得 1%。这个小功能根本不值得头疼,IE和朋友们可以处理它,或者如果确实需要的话,比如客户需要的话,可以根据具体情况实现。 @DA 再次感谢,这是我见过的最好的实现。

结论:我认为克服所有这些问题的唯一方法是:

  • 将占位符值复制到新的块级元素
  • 将新元素添加到输入之前
  • 计算输入的高度边框和填充,并将新元素移动到其上,尽可能靠近文本出现的位置
  • 当输入有值或聚焦时,使用标准模糊/更改/焦点事件隐藏元素

这样您就不必在提交时执行任何操作或处理可能发生的任何其他问题。抱歉,还没有演示,我必须回去工作 - 但我会保存最终编辑,以便在完成时使用。


“我见过的大多数代码都采用占位符的值并将其填充到输入本身中,这导致了这个问题”

好吧,这几乎就是占位符文本在幕后所做的事情(尽管它并没有真正更新输入的值)。

一种选择是类似于以下内容:

http://fuelyourcoding.com/scripts/infield/ http://fuelyourcoding.com/scripts/infield/

这里的概念是使用 CSS 移动标签,使其位于字段顶部并且看起来像占位符文本。请注意,标签不一定与占位符文本相同。标签很重要,特别是对于可访问性而言,而占位符文本除了标签之外还可以被视为“帮助文本”。

另一个选项是您一直在做的事情,获取占位符属性的内容并通过 JS 将其移动到输入本身的值中。

您遇到的问题是您在检查虚假占位符文本是否仍然存在之前提交了表单。

为了解决这个问题,您希望将一个事件附加到表单的提交中,在提交表单之前,该事件将首先查看所有输入字段,获取它们的值,将其与其占位符属性进行比较,如果匹配,则设置值为空白。

UPDATE:

要解决您在与占位符文本匹配的用户输入值的注释中提出的问题,您可以执行以下操作:

$('input[placeholder]').each(function(){

 if($(this).val() === $(this).attr('placeholder')){
      // in the odd situation where the field is prepopulated with
      // a value and the value just happens to match the placeholder,
      // then we need to flag it
      $(this).data('skipCompare','true');
  }    

// move the placeholder text into the field for the rest of the blank inputs
   if($(this).val().length===0){
       $(this).val($(this).attr('placeholder'))
   }

// move the placeholder text into the field for the rest of the blank inputs
  if($(this).val().length===0){
      $(this).val() = $(this).attr('placeholder');
  }


  $(this)
     .focus(function(){
           // remove placeholder text on focus
           if($(this).val()==$(this).attr('placeholder')){
               $(this).val('')
           }
     })
     .blur(function(){
         // flag fields that the user edits
         if( $(this).val().length>0 && $(this).val()==$(this).attr('placeholder')){
             $(this).data('skipCompare','true');
         }
         if ( $(this).val().length==0){
             // put the placeholder text back
             $(this).val($(this).attr('placeholder'));
         }
     })


 })

 $('#submitButton').click(function(){
   $('input[placeholder]').each(function(){
     if( !($(this).data('skipCompare')) && $(this).val() == $(this).attr('placeholder')     ){
         $(this).val('');
     };
     alert($(this).val());
   })
})

已经很晚了,我也累了,所以这一切可能是完全错误的。没有给出任何保证。 ;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在本机不支持“占位符”属性的浏览器中模拟“占位符”属性的最准确方法是什么? 的相关文章

  • 使用 Python Mechanize 与 Flash 交互

    我正在尝试用 Python 创建一个处理 Flash 的自动化程序 现在我正在使用Python Mechanize 它非常适合填写表格 但是当涉及到flash时我不知道该怎么办 有谁知道我如何通过 Python mechanize 或其他一
  • 如何将表格中的td高度设置为0px?

    我有一个包含几行的 HTML 表 这是动态构建的 全部 tr 有一个 td inside If one td 里面没有 HTML 内容 我希望它是不可见的 如何才能做到这一点 并不是说里面的 HTML 是动态渲染的 我不想使用display
  • 仅单击 div 内部

    我正在为一个小网站制作教程 我只想让教程气泡可点击 因此 当我们尝试单击气泡之外的某些内容时 什么也不会发生 换句话说 我希望我的 html 不可点击 而 tutorial bubble 可点击 尝试这个 jQuery function h
  • Jquery,取消绑定鼠标滚轮事件,然后在操作完成后重新绑定它?

    我已经为此苦苦挣扎了一段时间了 我正在使用此代码来监视鼠标滚轮 以便它可以用于使用我拥有的滑块滚动 但是 它有一个问题 即操作排队 因此如果你快速滚动鼠标滚轮 就像任何人通常会做的那样 它们就会堆积并导致错误行为 我知道如何用动画处理此类问
  • 如何向 jquery-file-upload basic-plugin 添加取消上传按钮

    我正在使用 jquery file upload 和 Rails 4 我从https github com tors jquery fileupload rails paperclip example https github com to
  • 如何仅在 css/html 中强制在单词之间换行?

    我只有一段普通的文本 p 标签内的 p div 标签 但只有 Firefox 可以正确显示 Firefox 打破了单词之间的界限 所有其他浏览器都会在单词中间断行 这使得阅读变得困难 这是我的意思的一个例子 火狐浏览器 工作中 This w
  • 如何使用 javascript/jquery/AJAX 调用 Django REST API?

    我想使用 Javascript jQuery AJAX 在前端调用 Django Rest API 请求方法是 POST 但当我看到 API 调用它的调用 OPTIONS 方法时 所以 我开始了解access control allow o
  • Chromium 嵌入式框架支持 HTML5 音频吗?

    我一直在玩 CefSharp 但似乎无法播放任何音频 我可以让音频控件出现 但它们保持冻结状态 这些是我使用的版本 Chromium 21 0 1180 0 CEF r728 CefSharp 0 12 4596 50 我先尝试了 mp3
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • html css 下拉菜单

    这是我第一次在 Stack Overflow 上发帖 我不熟悉论坛发帖规定 所以请让我知道我做错了什么 我在论坛中研究过这个问题 但我所遇到的一切都没有给我明确的答案 我试图从 新闻 元素创建一个下拉菜单 但在运行代码时我从未得到任何可见的
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • 如何打开弹出窗口并用父窗口中的数据填充它?

    如何使用 JavaScript jQuery 使用父页面中 JS 变量的数据填充弹出窗口 在我的示例中 我有一个文件名数组 我在父窗口中最多列出五个 如果还有更多 我想提供一个链接来打开弹出窗口并列出数组中的每个帖子 因此 如果我打开一个包
  • jQuery - 系列之外的 HighCharts 标签(条形图)

    function container highcharts chart type bar backgroundColor null width 360 title text null style display none subtitle
  • 如何限制下拉列表更改而不禁用它

    如何在不禁用下拉列表的情况下限制下拉列表选项更改 意味着我无法更改选项 并且下拉列表不应该是只读的 我的问题是我的服务器没有读取禁用的元素 这是我的出价 http jsfiddle net m3v7y jQuery var lastSel
  • 如何让div与包含td的高度相匹配?

    我沿着桌子的一排布置了三个 面板 一个比另外两个高 我希望所有三个面板都与最高的一个的高度相匹配 我尝试将 div 的样式设置为 height 100 但是即使包含的 tds 增长 短面板仍然很短 我的 HTML 是由 JSF 生成的 因此
  • 如何在表格列标题处垂直旋转文本

    我用过这个数据表 http www datatables net 在我的网页上 这是fiddle http jsfiddle net fxju7 2 链接我放置代码的地方 我想要 第一个数字第二个数字列应该垂直旋转 我已经做到了 但是 问题
  • 将 HTML 表格导出到 Excel

    我在 ASP NET MVC 视图页面上有 HTML 表 现在我必须将该表导出到 Excel 1 我使用部分视图 Inquiries ascx 来显示数据库中的表数据 使用LINQ to Entity 2 我还使用了 UITableFilt
  • HTML 属性 bgcolor 已弃用:用什么代替?

    VStudio ASP NET 给出以下消息 Attribute bgcolor is considered outdated A newer construct is recommended 推荐的结构是什么 bgcolor是在一个 td
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu

随机推荐