【问题标题】:keep placeholder on focus in IE10在 IE10 中将占位符保持在焦点上
【发布时间】:2013-01-04 22:27:32
【问题描述】:

在 WebKit 和 Firefox 下,inputplaceholder 中的文本会一直停留在 focus 上——直到 input.val 中确实包含某些内容时它才会消失。

有没有强制IE10做同样事情的好方法?

【问题讨论】:

  • @JayBlanchard:有吗?它是什么?我认为他尝试使用 <input type="text" placeholder="text" /> 并且占位符在 IE 10 中消失在焦点上。您建议他尝试什么?我认为没有“不隐藏占位符”选项之类的。
  • @RocketHazmat 我回答了他的问题。他问有没有什么好办法,我回答得恰到好处。它与您不使用 IE10 的答案一样有价值。
  • 这是我通过谷歌搜索发现的:“如果您使用 EW 开发服务器或 IIS 在 IE10 中本地预览使用 HTML5 和 CSS3 功能(占位符文本、圆角等)的站点,您可能会发现这些功能不显示。这是因为IE10中内网站点的默认浏览器模式是“兼容模式”。 ew-resource.co.uk/ie10-be-prepared.aspx
  • 值得一提的是,您可能对此不满意的一个原因是您使用占位符代替标签。请注意,HTML5 规范非常明确地表示不赞成这种用法——请参阅456bereastreet.com/archive/201204/…
  • @Spudley,同意...占位符不能替代标签。但是我有一个 UI 可以从 IE 占位符正常工作中受益!

标签: javascript jquery internet-explorer-10 placeholder


【解决方案1】:

Internet Explorer Developer Center 中的:-ms-input-placeholder pseudo-class 文档似乎暗示这是按设计工作的。

占位符文本以指定的样式显示,直到 字段有焦点,表示该字段可以输入。当。。。的时候 字段有焦点,它返回到输入字段的正常样式并且 占位符文本消失。

编辑:如果我必须模仿这种行为,我会查看适用于旧版本的占位符填充库(设置默认值、在输入框上浮动灰色文本等) IE。它们必须进行修改,因为它们可能具有检测占位符功能并遵从浏览器的功能。此外,这会产生“浏览器检测”代码气味。

更新:在 2014 年 6 月 19 日的 Twitter #AskIE 问题会议期间,"IE placeholder text disappears" question 被问及 @IEDevChat responded “我们有一个针对这种行为的活跃错误。下一个版本将提供修复"

【讨论】:

  • 不幸的是,它让用户盯着一个空的闪烁的字段,没有提示告诉他们他们被要求输入什么。
  • 这不是正确的答案,因为问题是:有没有强制 IE10 做同样事情的好方法?(保持占位符在焦点上可见)
  • @DeborahSpeece:“不幸的是,它让用户盯着一个空的闪烁的字段,没有提示告诉他们他们被要求输入什么。”好吧,您的字段也应该有一个 <label> 元素。 placeholder isn't a replacement for <label><label> 应指明该领域的用途。
  • 如果你有一个标签,占位符通常只是重复它。这增加了用户处理的混乱,并使表单更难使用,而不是更容易使用。对我来说,占位符的全部好处是它们消除了对标签的需要——当它们正常工作时。
  • @dudewad 我非常不同意。如果用户在输入中看到标签,那就是一个标签,而在框外的附加标签是多余的,对用户没有帮助,并且占用了宝贵的屏幕空间。规则和准则会发生变化,当它们没有意义时,它们应该发生变化。
【解决方案2】:

IE 开发人员在推特 IEDevChat 上的 AskIE 会话期间回复说,这是 IE BugList 中的 known bug,他们将在未来版本中修复。

更新:- 不幸的是,IE11 中的占位符行为仍然相同,但似乎在 Edge/Spartan 版本中有效。

【讨论】:

  • 未来的版本没有解决 IE10 中的问题,因此这不是问题的答案。
  • 感谢@m0sa,dudewad 指出。更新了我的答案,以便对其他人有所帮助。
【解决方案3】:

在 IE 10+ 中没有让占位符保持字段焦点的好方法,但如果您尝试用占位符替换标签,那么您应该看看这个。

http://mozmonkey.com/2014/02/css-only-placeholders-field-labels-i-e-float-labels/

这是一种结合占位符和标签来改善用户体验的方式。

【讨论】:

  • 链接的日期,适用于今天偶然发现这里的任何人
【解决方案4】:

我想我会分享我用来解决这个问题的解决方法,因为 IE11 似乎仍然没有修复。

在我的示例中 - IE11 已将我的占位符值添加为文本区域中的实际值。

这是我在模板视图中看到的内容:

<textarea placeholder="Type your message">
</textarea>

以下是 IE11 前端呈现的内容:

<textarea placeholder="Type your message">
    Type your message
</textarea>

所以当用户专注于该字段时 - 他们的光标位于“..message here”字符串的末尾 - 奇怪!

对我来说,解决方法是在加载时向元素添加一个初始类。然后是一个基本的“焦点”绑定事件来检查类是否存在 - 如果存在,它会删除 val 然后也删除该类。因此,只要用户关注该字段 - 该值就会重置为空字符串。

这里是绑定事件(这个特殊的例子是在一个动态加载的模式 - 你可以简化这个):

$(document).on( "focus", '.textarea', function () {
    if ($(this).hasClass('placeholder-val-present')) {
        $(this).val("").removeClass('placeholder-val-present');
    }
});

这很好用,因为当用户跳出该字段时 - 占位符被重新添加,它在 IE11 和所有其他浏览器中正常工作。

我确信这是一个非常小众的例子 - 但它可能会对其他人派上用场!

【讨论】:

    【解决方案5】:

    诀窍是在输入元素上同时调用 focus() 和 select()。

    $("#elementId" ).focus();
    $("#elementId" ).select();
    

    【讨论】:

      【解决方案6】:

      最佳解决方案!适用于所有浏览器

      http://jsfiddle.net/q05ngura/3/

      document.onkeydown =  function(e) {
      	if(!e)e=event;
      	var checkVal = Number(this.value.length);
      	if((e.keyCode < 112 || e.keyCode > 123) &&  // F1 - F12
      	   e.keyCode != 9 &&  // Tab
      	   e.keyCode != 20 && // Caps lock
      	   e.keyCode != 16 && // Shift
      	   e.keyCode != 17 && // Ctrl
      	   e.keyCode != 18 && // alt
      	   e.keyCode != 91 && // Left window key
      	   e.keyCode != 92 && // Right window key
      	   e.keyCode != 27 && // Esc
      	   e.keyCode != 37 && // Left arrow
      	   e.keyCode != 38 && // Up arrow
      	   e.keyCode != 39 && // Right arrow
      	   e.keyCode != 40 && // Down arrow
      	   e.keyCode != 13 && // Enter
      	   e.keyCode != 45){ // Insert
      	   
      	   checkVal = Number(this.value.length) + 1;
      	   }
      	   
      	
      	if(e.keyCode == '8'||e.keyCode == '46'){// backspace || delete
      	checkVal = Number(this.value.length) - 1;
      	}
      	if(checkVal > 0){
      		this.parentNode.getElementsByTagName('label')[0].style.zIndex = '-1';
      	}else{
      		this.parentNode.getElementsByTagName('label')[0].style.zIndex = '0';
      	}
      });
      body{
          padding:0;
      	margin:0;
          background-color:#ccc;
      }
      }
      ::-ms-reveal {
          display: none;
      }
      input::-ms-clear {
          display: none;
      }
      label{
      	position: absolute;
          right: 60px;
      	margin-top: 10px;
          font-size: 13px;
          font-family: sans-serif;
          color: #A9A9A9;
          z-index:0;
      	pointer-events: none;
      }
      @media screen and (-webkit-min-device-pixel-ratio:0) { 
      label{
      	margin-top: -25px;
      	right: 57px;
      }
      }
      @-moz-document url-prefix() {
          label{
      	right: 69px;
      }
      }
      
      
      
      #login-box{
      	position:relative;
      	margin:0 auto;
      	top:100px;
      	background-color:#fff;
      	width:270px;
      	height:270px;
      	border-radius:40px;
      }
      
      #login{
      	position:relative;
      	margin:0 auto;
      	text-align:center;
      	top:70px;
      }
      #login input[type="text"],#login input[type="password"]{
      	border:none;
      	border-bottom:1px solid #CCC;
      	padding:9px;
      	direction:rtl;
      }
      
      *:focus{
      	outline:none;
      }
      <div id="login-box">
                  <div id="login">
                          <table align="center" cellpadding="0">
                              <tr>
                                  <td>
                                      <input type="text" autocomplete="off" name="username" />
                                      <label for="username">שם משתמש</label>
                                  </td>
                              </tr>
                              <tr>
                                  <td>
                                      <input type="password" name="password" />
                                      <label for="password">סיסמא</label>
                                  </td>
                              </tr>
                          </table>
                  </div><!-- end login -->
              </div><!-- end login box -->

      【讨论】:

      • 不适用于最新的 Chrome:输入时占位符一直显示
      【解决方案7】:

      我在 Google 上搜索了一下,发现有一些 CSS 伪元素和伪类可用于设置占位符的样式。

      input:-ms-input-placeholder:focus{
          color: #999;
      }
      

      有关更多信息,请参阅此答案:https://stackoverflow.com/a/2610741

      【讨论】:

      • 他没有问如何设置占位符的样式
      • 为什么要为占位符着色?
      • @akagr:我忘记了,但我认为这是为了表明您可以设置焦点占位符的样式。也许是你给它上色,它不会消失?我忘了。我没有 IE 10。
      猜你喜欢
      • 2014-09-06
      • 2023-03-10
      • 2012-09-14
      • 2013-08-27
      • 2011-10-25
      • 2016-07-20
      • 2015-08-15
      • 2021-02-15
      相关资源
      最近更新 更多