【问题标题】:Placeholder in IE9IE9 中的占位符
【发布时间】:2011-09-15 23:58:35
【问题描述】:

这似乎是一个众所周知的问题,但我在 Google 上找到的所有解决方案都不适用于我新下载的 IE9。

inputtextarea 标签上启用Placeholder 属性时,您最喜欢哪种方式?

可选:我为此浪费了很多时间,还没有寻找required 属性。您对此也有什么建议吗?显然我可以检查PHP中的值,但是为了帮助用户这个属性非常方便。

【问题讨论】:

  • 4 年后我又回到了 HTML。这意味着我愿意接受任何更换我过时工具的建议。我几乎从零开始。我一直在尝试主要使用 JQuery 和许多来自谷歌结果的复制/过去,我的 lastest try

标签: javascript html internet-explorer-9 placeholder


【解决方案1】:

我想这就是你要找的东西:jquery-html5-placeholder-fix

此解决方案使用特征检测(通过modernizr)来确定是否支持占位符。如果没有,添加支持(通过 jQuery)。

【讨论】:

  • 它可以工作,但它不是最好的代码。在顶部$(this) 应该分配给可以在整个代码中使用的变量。为每个使用 $(this) 的表达式调用 $ 是“不要像这样写 jQuery 101”的禁忌。
  • 您必须小心这段代码,因为如果您提交表单,占位符值将作为表单值提交。应该在提交之前清除它。
  • 很好奇,因为我是 HTML 5 特性之战的新手:是现代化程序导致这是一个糟糕的解决方案还是 jquery-html5-placeholder-fix 本身(或两者)?
  • 更新了链接,修复了上述 cmets kamikazemusic.com/web-development/… 中的问题
  • 注意需要具有 HTML 输入功能的 Modernizer 脚本
【解决方案2】:

如果您想在不使用 jquery 或 modenizer 的情况下执行此操作,可以使用以下代码:

(function(){

     "use strict";

     //shim for String's trim function..
     function trim(string){
         return string.trim ? string.trim() : string.replace(/^\s+|\s+$/g, "");
     }

     //returns whether the given element has the given class name..
     function hasClassName(element, className){ 
         //refactoring of Prototype's function..
         var elClassName = element.className;
         if(!elClassName)
             return false;
         var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
         return regex.test(element.className);
     }

     function removeClassName(element, className){
         //refactoring of Prototype's function..
         var elClassName = element.className;
         if(!elClassName)
             return;
         element.className = elClassName.replace(
             new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ');
     }

     function addClassName(element, className){
         var elClassName = element.className;
         if(elClassName)
             element.className += " " + className;
         else
             element.className = className;
     }

     //strings to make event attachment x-browser.. 
     var addEvent = document.addEventListener ?
            'addEventListener' : 'attachEvent';
     var eventPrefix = document.addEventListener ? '' : 'on';

     //the class which is added when the placeholder is being used..
     var placeHolderClassName = 'usingPlaceHolder';

     //allows the given textField to use it's placeholder attribute
     //as if it's functionality is supported natively..
     window.placeHolder = function(textField){

         //don't do anything if you get it for free..
         if('placeholder' in document.createElement('input'))
             return;

         //don't do anything if the place holder attribute is not
         //defined or is blank..
         var placeHolder = textField.getAttribute('placeholder');        
         if(!placeHolder)
             return;

         //if it's just the empty string do nothing..
         placeHolder = trim(placeHolder);
         if(placeHolder === '')
             return;

         //called on blur - sets the value to the place holder if it's empty..
         var onBlur = function(){
             if(textField.value !== '') //a space is a valid input..
                 return;
             textField.value = placeHolder;
             addClassName(textField, placeHolderClassName);
         };

         //the blur event..
         textField[addEvent](eventPrefix + 'blur', onBlur, false);

         //the focus event - removes the place holder if required..
         textField[addEvent](eventPrefix + 'focus', function(){
             if(hasClassName(textField, placeHolderClassName)){
                removeClassName(textField, placeHolderClassName);
                textField.value = "";
             }
         }, false);

         //the submit event on the form to which it's associated - if the
         //placeholder is attached set the value to be empty..
         var form = textField.form;
         if(form){
             form[addEvent](eventPrefix + 'submit', function(){
                 if(hasClassName(textField, placeHolderClassName))
                     textField.value = '';
            }, false);
         }

         onBlur(); //call the onBlur to set it initially..
    };

}());

对于您想要使用的每个文本字段,您需要运行placeHolder(HTMLInputElement),但我想您可以更改它以适应!此外,以这种方式而不是仅在加载时这样做意味着您可以使其在页面加载时适用于不在 DOM 中的输入。

请注意,这是通过将 usingPlaceHolder 类应用于输入元素来实现的,因此您可以使用它来设置样式(例如,添加规则 .usingPlaceHolder { color: #999; font-style: italic; } 使其看起来更好)。

【讨论】:

  • 抱歉——我真的不知道这是否容易——我猜你想要显示实际的文本值,而不是“符号”。我能想到的唯一方法是将其切换为文本输入,除非它具有焦点或值,否则将其显示为密码字段。
  • @StephenPatten 查看my fix 以获取带有密码字段的占位符。我完全按照马克的建议做:)
【解决方案3】:

如果你想输入描述,你可以使用它。这适用于 IE 9 和所有其他浏览器。

<input type="text" onclick="if(this.value=='CVC2: '){this.value='';}" onblur="if(this.value==''){this.value='CVC2: ';}" value="CVC2: "/>

【讨论】:

  • 我自己没有测试过,但是如果您点击该字段而不是单击它,猜测这将无法正常工作。我在很多网站或类似网站上都看到了这个错误。
  • 使用此解决方案,您还需要在表单提交时检查此值。
  • 我很惊讶这得到了任何投票,即使在 2012/2013 年发布也不应该使用
  • 如果您碰巧在输入中写入了占位符('CV2:'),您输入的内容将被删除。
【解决方案4】:

这是一个更好的解决方案。 http://bavotasan.com/2011/html5-placeholder-jquery-fix/ 我已经采用了一点,只适用于 IE10 下的浏览器

<!DOCTYPE html>
<!--[if lt IE 7]><html class="no-js lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]><html class="no-js lt-ie10 lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]><html class="no-js lt-ie10 lt-ie9" lang="en"> <![endif]-->
<!--[if IE 9]><html class="no-js lt-ie10" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--><html class="no-js" lang="en"><!--<![endif]-->

    <script>
    // Placeholder fix for IE
      $('.lt-ie10 [placeholder]').focus(function() {
        var i = $(this);
        if(i.val() == i.attr('placeholder')) {
          i.val('').removeClass('placeholder');
          if(i.hasClass('password')) {
            i.removeClass('password');
            this.type='password';
          }     
        }
      }).blur(function() {
        var i = $(this);  
        if(i.val() == '' || i.val() == i.attr('placeholder')) {
          if(this.type=='password') {
            i.addClass('password');
            this.type='text';
          }
          i.addClass('placeholder').val(i.attr('placeholder'));
        }
      }).blur().parents('form').submit(function() {
        //if($(this).validationEngine('validate')) { // If using validationEngine
          $(this).find('[placeholder]').each(function() {
            var i = $(this);
            if(i.val() == i.attr('placeholder'))
              i.val('');
              i.removeClass('placeholder');

          })
        //}
      });
    </script>
    ...
    </html>

【讨论】:

  • 在 IE8 上不起作用,因为 IE 不允许 jQuery 操作输入类型(请查看 Bill 于 2011 年 12 月 20 日下午 1:48 bavotasan.com/2011/html5-placeholder-jquery-fix 发表的评论)
  • 还假设您正在提交表单。我见过的大多数单页应用程序都不使用表单。只需点击处理程序。
【解决方案5】:

HTML5 占位符 jQuery 插件
- Mathias BynensHTML5 BoilerplatejsPerf 的合作者)

https://github.com/mathiasbynens/jquery-placeholder

演示和示例

http://mathiasbynens.be/demo/placeholder

附言
我用过这个插件很多次了,效果很好。此外,它不会在您提交表单时将占位符文本作为值提交(......我发现其他插件真的很痛苦)。

【讨论】:

  • 我们正在使用自定义 CRM。我按预期添加了此代码和工作,但他们通过 javascript 提交表单。提交按钮有onclick="_IW.FormsRuntime.submit(this.form);"。无论如何我可以更改此 onclick 事件以首先清除占位符,然后运行存在于 onclick 中的此 CRM 代码?
  • 我将 github js 文件复制到我的 src 代码中。仍然没有使用占位符。
  • 这确实是一种享受,但是在单页应用程序上使用起来很痛苦。您需要为动态添加的字段手动触发它。除此之外,效果很好!
  • 谢谢,整洁的插件,但是我遇到的一个问题是 ie9 当文本输入成为焦点时占位符消失了。这与 HTML5 行为不同
  • 它适用于一个大的'但是',当输入为空时,$('input').val() 返回占位符值。因为我正在使用 AJAX 框架,所以占位符被发送到服务器......
【解决方案6】:

我通常对http://cdnjs.com/ 评价很高,他们正在列出:

//cdnjs.cloudflare.com/ajax/libs/placeholder-shiv/0.2/placeholder-shiv.js

不确定是谁的代码,但看起来很简单:

document.observe('dom:loaded', function(){
  var _test = document.createElement('input');
  if( ! ('placeholder' in _test) ){
    //we are in the presence of a less-capable browser
    $$('*[placeholder]').each(function(elm){
      if($F(elm) == ''){
        var originalColor = elm.getStyle('color');
        var hint = elm.readAttribute('placeholder');
        elm.setStyle('color:gray').setValue(hint);
        elm.observe('focus',function(evt){
          if($F(this) == hint){
            this.clear().setStyle({color: originalColor});
          }
        });
        elm.observe('blur', function(evt){
          if($F(this) == ''){
            this.setValue(hint).setStyle('color:gray');
          }
        });
      }
    }).first().up('form').observe('submit', function(evt){
      evt.stop();
      this.select('*[placeholder]').each(function(elm){
        if($F(elm) == elm.readAttribute('placeholder')) elm.clear();
      });
      this.submit();
    });
  }
});

【讨论】:

  • 这个插件也需要原型库
【解决方案7】:

要使其在 IE-9 中工作,请使用下面的 .it 适用于我

JQuery 需要包含:

jQuery(function() {
   jQuery.support.placeholder = false;
   webkit_type = document.createElement('input');
   if('placeholder' in webkit_type) jQuery.support.placeholder = true;});
   $(function() {

     if(!$.support.placeholder) {

       var active = document.activeElement;

       $(':text, textarea, :password').focus(function () {

       if (($(this).attr('placeholder')) && ($(this).attr('placeholder').length > 0) &&         ($(this).attr('placeholder') != '') && $(this).val() == $(this).attr('placeholder')) {
          $(this).val('').removeClass('hasPlaceholder');
        }
      }).blur(function () {
if (($(this).attr('placeholder')) && ($(this).attr('placeholder').length > 0) &&  ($(this).attr('placeholder') != '') && ($(this).val() == '' || $(this).val() ==   $(this).attr('placeholder'))) {
     $(this).val($(this).attr('placeholder')).addClass('hasPlaceholder');
}
});

$(':text, textarea, :password').blur();
$(active).focus();
$('form').submit(function () {
     $(this).find('.hasPlaceholder').each(function() { $(this).val(''); });
});
}
});

CSS 样式需要包含:

.hasPlaceholder {color: #aaa;}

【讨论】:

  • 你应该在这里修正你的格式,比如添加缩进并将你的答案与你的代码分开
【解决方案8】:

我在互联网上搜索并找到了一个简单的 jquery 代码来处理这个问题。在我这边,它已解决并在 ie 9 上运行。

$("input[placeholder]").each(function () {
        var $this = $(this);
        if($this.val() == ""){
            $this.val($this.attr("placeholder")).focus(function(){
                if($this.val() == $this.attr("placeholder")) {
                    $this.val("");
                }
            }).blur(function(){
                if($this.val() == "") {
                    $this.val($this.attr("placeholder"));
                }
            });
        }
    });

【讨论】:

  • 您的占位符成为价值。如果您提交,它们将被发送。使用正确答案的 placeholder.js,字段保持为空
【解决方案9】:

聚会有点晚了,但我使用了我久经考验且值得信赖的 JS,它利用了Modernizr。可以复制/粘贴并应用于任何项目。每次都有效:

// Placeholder fallback
if(!Modernizr.input.placeholder){

    $('[placeholder]').focus(function() {
      var input = $(this);
      if (input.val() == input.attr('placeholder')) {
        input.val('');
        input.removeClass('placeholder');
      }
    }).blur(function() {
      var input = $(this);
      if (input.val() == '' || input.val() == input.attr('placeholder')) {
        input.addClass('placeholder');
        input.val(input.attr('placeholder'));
      }
    }).blur();
    $('[placeholder]').parents('form').submit(function() {
      $(this).find('[placeholder]').each(function() {
        var input = $(this);
        if (input.val() == input.attr('placeholder')) {
          input.val('');
        }
      })
    });

}

【讨论】:

  • 所有这些使用jQuery的解决方案..没有臃肿的jQuery就没有解决方案吗?
【解决方案10】:

使用mordernizr 来检测不支持占位符的浏览器,我创建了这个短代码来修复它们。

//If placeholder is not supported
if (!Modernizr.input.placeholder){ 

    //Loops on inputs and place the placeholder attribute
    //in the textbox.
    $("input[type=text]").each( function() { 
       $(this).val($(this).attr('placeholder')); 
    })
}

【讨论】:

  • 您必须小心这段代码,因为如果您提交表单,占位符值将作为表单值提交。您应该在提交之前清除它。
  • @chriscatfr:在这个例子中如何正确地做到这一点?如果我的占位符是“密码”而我的密码实际上是“密码”?
  • 您可以对这样的字段使用“脏”的概念。输入时将该字段标记为干净(可能使用 data-dirty="false")。如果他们提交表单而不更改占位符文本,您会看到该字段是干净的,因此请清除它。如果他们确实更改了它,甚至与占位符的值相同,那么它就是脏的,你确实提交了那个值。
  • 密码等解决方法请看jsfiddle.net/AlexanderPatel/1pv2174c/3
  • placeholder 属性被标准化为字符串 => 实际上不需要 Modernizr:::::::::::::::::::::::::: :: if( typeof $('&lt;input type="text"&gt;').get(0).placeholder == "undefined" ){ ... } 是不支持的足够测试,在 IE9 模式仿真中测试 - 有效。
【解决方案11】:

我知道我迟到了,但我找到了在头部插入标签的解决方案:

&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"/&gt; &lt;!--FIX jQuery INTERNET EXPLORER--&gt;

【讨论】:

  • 你在 IE9 中测试过这个吗?因为否则 IE10+ 支持占位符...
  • 当然,奇怪的是,IE9 本身不支持标签会打开它——当时它是一个实验性功能吗?这是在某处引用的吗? :)
猜你喜欢
  • 2012-12-30
  • 2016-01-11
  • 2014-03-19
  • 2016-03-20
  • 2013-09-28
  • 2013-07-15
  • 2015-12-09
相关资源
最近更新 更多