IE9のプレースホルダー


140

よく知られている問題のようですが、Googleで見つけたすべての解決策が、新しくダウンロードしたIE9で機能しません。

タグとタグのPlaceholderプロパティを有効にするためのお気に入りの方法はどれですか。inputtextarea

オプション:そのために多くの時間を失い、requiredまだ物件を探していませんでした。これについても何かアドバイスはありますか?当然、PHPで値を確認できますが、ユーザーを助けるためにこのプロパティは非常に便利です。


4年間でHTMLに戻りました。意味私は私の古いツールを置き換えるためのアドバイスを受け入れるつもりです。ほぼゼロから再開します。私は主にJQueryとGoogleの結果からの多くのコピー/
貼り付けで

回答:


185

HTML5プレースホルダjQueryのプラグイン
-によってマティアスBynens(上の協力者HTML5ボイラープレートjsPerf

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

デモと例

http://mathiasbynens.be/demo/placeholder

PS
私はこのプラグインを何度も使用しており、それは御馳走を働かせます。また、フォームを送信するときに、プレースホルダーテキストを値として送信しません(...他のプラグインで見つけた本当の痛み)。


カスタムCRMを使用しています。私はこのコードと作品を期待通りに追加しましたが、JavaScriptを介してフォームを送信します。送信ボタンにはがありonclick="_IW.FormsRuntime.submit(this.form);"ます。とにかく、このonclickイベントを変更して、最初にプレースホルダーをクリアしてから、onclickに存在するこのCRMコードを実行できますか?
リーシュ

1
github jsファイルをsrcコードにコピーしました。それでも、プレースホルダーは必要ありません。
フィロ2013年

2
これは確かにごちそうですが、単一ページのアプリケーションで使用するのは面倒です。動的に追加されたフィールドに対して手動でトリガーする必要があります。それ以外は、うまくいきます!
smets.kevin 2013年

1
ありがとう、きちんとしたプラグインですが、私が抱えている1つの問題は、テキスト入力にフォーカスがあるときにie9プレースホルダーが表示されなくなることです。これはHTML5の動作とは異なります
gerrytan 2014

1
$( 'input')。val()は1つの大きな 'but'でうまく機能し、入力が空の場合にプレースホルダー値を返します。私はAJAXフレームワークを使用しているため、そのプレースホルダーはサーバーに送信されます...
Danubian Sailor

21

これはあなたが探しているものだと思います:jquery-html5-placeholder-fix

このソリューションは、(modernizrによる)機能検出を使用して、プレースホルダーがサポートされているかどうかを判断します。そうでない場合は、(jQueryを介して)サポートを追加します。


2
動作しますが、最高のコードではありません。上部$(this)は、コード全体で使用できる変数に割り当てる必要があります。$を使用するすべての式を呼び出すことは$(this)、「101のようにjQueryを作成しない」から簡単に言えます。
Sami Samhuri、

20
フォームを送信するとプレースホルダー値がフォーム値として送信されるため、このコードには注意する必要があります。送信される前にクリアする必要があります。
ericbae

2
@chriscatfr SOユーザーをより良いソリューションに導くと思うので、私の回答(stackoverflow.com/a/13281620/114140)を受け入れることを検討してください。
Chris Jacob

私はHTML 5機能の戦いに慣れていないので、好奇心が強いです。モダナイザーは、これを悪いソリューションにしたり、jquery-html5-placeholder-fix自体(またはその両方)にしたりしますか?
Snekse

これはシンプルでエレガントで、私のために仕事をしてくれました。
graumanoz 2013

17

jqueryまたはモデナイザーを使用せずにそれを実行したい場合は、以下のコードを使用できます。

(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にない入力に対しても機能させることができます。

これはclass:usingPlaceHolderをinput要素に適用することで機能するため、これを使用してスタイルを設定できます(たとえば、ルール.usingPlaceHolder { color: #999; font-style: italic; }を追加して見栄えを良くするなど)。


1
申し訳ありませんが、それが簡単かどうかは本当にわかりません。「シンボル」ではなく、実際のテキスト値を表示したいと思います。これを行うために考えられる唯一のハックは、フォーカスまたは値がない限り、テキスト入力用に切り替えるか、そうでない場合はパスワードフィールドとして表示することです。
マークロードス

@StephenPatten パスワードフィールドのあるプレースホルダーの修正をご覧ください。私はマークが提案したことを正確に行います:)
Chev

8

これははるかに良い解決策です。 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>

IEはjQueryが入力タイプを操作することを許可していないため、IE8では機能しません(2011年12月20日午後1時48分、bavotasan.com / 2011 / html5
placeholder

また、フォームの送信を想定しています。私が見たほとんどのシングルページアプリはフォームを使用していません。ハンドラをクリックするだけです。
chovy

5

説明を入力したい場合は、これを使用できます。これはIE 9と他のすべてのブラウザーで動作します。

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

1
自分ではテストしませんでしたが、フィールドをクリックするのではなくタブで移動すると、うまくいきません。このバグは、多くのWebサイト、または同様のWebサイトで見られます。
eselk 2013

このソリューションでは、フォーム送信時にこの値を確認する必要もあります。
IgorJerosimić2014

これに投票があったことに驚いています。これは2012/2013に投稿された場​​合でも使用しないでください
LocalPCGuy

偶然入力に書き込んだ場合、プレースホルダー( 'CV2:')は、入力したものが削除されます。
ダニエル

2

プレースホルダーをサポートしていないブラウザーを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')); 
    })
}

2
フォームを送信するとプレースホルダー値がフォーム値として送信されるため、このコードには注意する必要があります。送信する前にクリアする必要があります。
chriscatfr 2015年

3
@chriscatfr:この例では、それをどのように正しく行うのでしょうか?プレースホルダーが「パスワード」で、実際のパスワードが「パスワード」の場合
2016

このようなフィールドには「ダーティ」の概念を使用できます。入力時にフィールドをクリーンとしてフラグを立てます(おそらくdata-dirty = "false"を使用します)。プレースホルダーテキストを変更せずにフォームを送信すると、フィールドがクリーンであることがわかるので、クリアします。プレースホルダーと同じ値に変更しても、ダーティであり、その値を送信します。
oooyaya 2016年

パスワードおよびその他の解決策については、jsfiddle.net
AlexanderPatel /

placeholderプロパティは文字列として標準化されました=>実際にif( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... }はModernizrの必要はありません::::::::::::::::::::::::::::: は、サポートされていない、テスト済みのテストですIE9モードのエミュレーション-動作します。
jave.web 2016年

2

私は遅れていることを知っていますが、頭にタグを挿入する解決策を見つけました:

<meta http-equiv="X-UA-Compatible" content="IE=edge"/> <!--FIX jQuery INTERNET EXPLORER-->


これをIE9でテストしましたか?それ以外の場合、IE10 +はプレースホルダーをサポートします...
jave.web

もちろん、奇妙なことですが、IE9自体がタグをオンにすることをサポートしていないことは、実験的な機能でしたか?これはどこかで参照されていますか?:)
jave.web 2016年

1

IE-9で機能させるには、以下を使用してください。

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;}

1
インデントを追加し、コードから回答を分離するなど、ここでフォーマットを修正する必要があります
ダーレン

1

パーティーには少し遅れましたが、Modernizrを利用した、信頼できるJSを使用しています。コピー/貼り付けして、任意のプロジェクトに適用できます。毎回動作します:

// 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なしのソリューションはありませんか?
Spock

0

私は通常、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();
    });
  }
});

1
このプラグインにはプロトタイプライブラリも必要です
rosswil

0

インターネットで検索したところ、この問題を処理する簡単な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"));
                }
            });
        }
    });

2
プレースホルダーが値になります。送信すると送信されます。正解のplaceholder.jsを使用すると、フィールドは空のままになります
chriscatfr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.