IE9의 자리 표시 자


140

잘 알려진 문제인 것 같지만 Google에서 찾은 모든 솔루션이 새로 다운로드 한 IE9에서 작동하지 않습니다.

및 태그 에서 Placeholder속성 을 사용하기 위해 가장 좋아하는 방법은 무엇입니까?inputtextarea

선택 사항 : 나는 그것에 많은 시간을 잃어 버렸고 required아직 그 부동산을 찾지 않았다. 이것에 대한 조언이 있습니까? 분명히 PHP에서 값을 확인할 수 있지만 사용자를 돕기 위해이 속성은 매우 편리합니다.


4 년 후에 HTML로 돌아 왔습니다. 오래된 도구를 교체하라는 조언을 구할 수 있습니다. 나는 거의 0에서 다시 시작합니다. 나는 주로 JQuery와 구글 결과에서 많은 복사 / 과거를 시도해
왔으며, 마지막

답변:


185

HTML5 자리 표시 자 jQuery를 플러그인
-에 의해 마티아스 Bynens (공동 작업자 HTML5 상용구jsPerf )

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

데모 및 예

http://mathiasbynens.be/demo/placeholder

추신 :
나는이 플러그인을 여러 번 사용하고 치료를 작동합니다. 또한 양식을 제출할 때 자리 표시 자 텍스트를 값으로 제출 하지 않습니다 (다른 플러그인에서 찾은 실제 고통).


우리는 맞춤형 CRM과 협력하고 있습니다. 이 코드와 작품을 예상대로 추가했지만 자바 스크립트를 통해 양식을 제출합니다. 제출 버튼에는가 있습니다 onclick="_IW.FormsRuntime.submit(this.form);". 어쨌든이 onclick 이벤트를 변경하여 먼저 자리 표시자를 지우고 onclick에 존재하는 CRM 코드를 실행할 수 있습니까?
Leeish

1
github js 파일을 내 src 코드에 복사했습니다. 여전히 자리 표시 자와 함께 가지 않습니다.
Philo

2
이것은 실제로 치료법으로 작동하지만 단일 페이지 응용 프로그램에서 사용하기가 어렵습니다. 동적으로 추가 된 필드에 대해 수동으로 트리거해야합니다. 그 외에는 훌륭하게 작동합니다!
smets.kevin

1
고마워, 깔끔한 플러그인이지만 텍스트 입력에 초점이 맞춰지면 자리 표시자가 사라지는 ie9의 한 가지 문제가 있습니다. 이것은 HTML5 동작과 다릅니다
gerrytan

1
하나의 큰 'but'로 잘 작동합니다. $ ( 'input'). val ()은 입력이 비어있을 때 자리 표시 자 값을 반환합니다. 내가 AJAX 프레임 워크와 함께 일하고 있기 때문에, 그 자리는 ... 서버로 전송됩니다
다뉴브 선원에게

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

17

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에없는 입력에 대해 작동하도록 할 수 있습니다.

이것은 class : usingPlaceHolder를 입력 요소 에 적용하여 작동 하므로 스타일을 지정하는 데 사용할 수 있습니다 (예 : 규칙 .usingPlaceHolder { color: #999; font-style: italic; }을 추가하여 더보기 좋게 표시).


1
죄송합니다. 쉽게 할 수 있는지 잘 모르겠습니다. "기호"대신 실제 텍스트 값을 표시하고 싶을 것 같습니다. 내가 생각할 수있는 유일한 해킹은 포커스 또는 값이 없으면 텍스트 입력으로 전환하고 암호 필드로 표시하는 것입니다.
Mark Rhodes

@StephenPatten 암호 필드가있는 자리 표시 자에 대한 수정 사항 을 살펴보십시오 . 나는 :) 마크 제안 정확히 무엇
체브

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 이후 IE8에서 작업 jQuery를 입력 유형을 조작 (에 오후 1시 48분 12 월 20 일에 빌에서 코멘트를 체크 아웃하는 것을 허용하지 않습니다하지 않습니다 bavotasan.com/2011/html5-placeholder-jquery-fix )
forste

또한 귀하가 양식을 제출한다고 가정합니다. 내가 본 대부분의 단일 페이지 앱은 양식을 사용하지 않습니다. 핸들러를 클릭하면됩니다.
chovy

5

설명을 입력하려면 이것을 사용할 수 있습니다. 이것은 IE 9 및 다른 모든 브라우저에서 작동합니다.

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

1
직접 테스트하지는 않았지만 클릭하지 않고 필드를 탭하면 추측이 잘되지 않습니다. 많은 웹 사이트 또는 이와 유사한 웹 사이트 에서이 버그를 봅니다.
eselk

이 솔루션을 사용하면 양식 제출시이 값을 확인해야합니다.
Igor Jerosimić

나는 이것이 어떤 표를 얻었
는지 놀랐

입력 내용에 쓰면 입력 한 자리 표시 자 ( 'CV2 :')가 삭제됩니다.
Daniel

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

3
@ chriscatfr :이 예제에서 어떻게 올바르게 수행 할 수 있습니까? 내 자리 표시자가 '비밀번호'이고 내 비밀번호가 실제로 '비밀번호'인 경우?
Lain

이와 같은 필드에는 "더러운"개념을 사용할 수 있습니다. 입력시 필드를 깨끗한 것으로 표시하십시오 (data-dirty = "false"일 수 있음). 자리 표시 자 텍스트를 변경하지 않고 양식을 제출하면 필드가 깨끗하다는 것을 알 수 있습니다. 자리 표시 자와 동일한 값으로 변경 한 경우 더러워지고 해당 값을 제출합니다.
oooyaya

암호 및 기타 솔루션에 대해 살펴주십시오 jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish 파텔

placeholder속성이 문자열로 표준화 된 => 모더 나이저가 필요 실제로 ::::::::::::::::::::::::::::: if( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... },지지하지 않는 enaugh 테스트로 테스트입니다 IE9 모드 에뮬레이션-작동합니다.
jave.web

2

나는 늦었다는 것을 알고 있지만 머리에 태그를 삽입하는 해결책을 찾았습니다.

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


IE9에서 이것을 테스트 했습니까? 그렇지 않으면 IE10 + 지원하는 자리 때문에 ...
jave.web

물론 IE9가 태그를 켤 수 있다고 자체 지원하지 않는 것은 이상합니다. 실험적인 기능 이었습니까? 이것은 어딘가에 참조됩니까? :)
jave.web 12

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를 사용하는 이러한 모든 솔루션 .bloated 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 코드를 찾았습니다. 내 입장에서, 그것은 해결되었고 즉 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.