Internet Explorer의 입력 자리 표시 자


175

HTML5는 요소에 placeholder속성을 도입하여 input회색으로 표시된 기본 텍스트를 표시 할 수 있습니다.

슬프게도 IE 9를 포함한 Internet Explorer는이를 지원하지 않습니다.

자리 표시 자 시뮬레이터 스크립트가 이미 있습니다. 일반적으로 기본 텍스트를 입력 필드에 넣고 회색을 표시하고 입력 필드에 초점을 맞추 자마자 다시 제거하여 작동합니다.

이 방법의 단점은 자리 표시 자 텍스트가 입력 필드에 있다는 것입니다. 그러므로:

  1. 스크립트는 입력 필드가 비어 있는지 쉽게 확인할 수 없습니다
  2. 플레이스 홀더를 데이터베이스에 삽입하지 않으려면 서버 측 처리에서 기본값을 확인해야합니다.

자리 표시 자 텍스트가 입력 자체에없는 솔루션을 원합니다.

답변:


151

"웹 양식 : 입력 자리"보고에서의 섹션 HTML5 크로스 브라우저 Polyfills , 하나의 I 톱이었다 jQuery를 - HTML5-자리 .

IE9로 데모를 시도해 보니 <input>스팬으로 감싸고 자리 표시 자 텍스트로 레이블을 오버레이하는 것처럼 보입니다 .

<label>Text:
  <span style="position: relative;">
    <input id="placeholder1314588474481" name="text" maxLength="6" type="text" placeholder="Hi Mom">
    <label style="font: 0.75em/normal sans-serif; left: 5px; top: 3px; width: 147px; height: 15px; color: rgb(186, 186, 186); position: absolute; overflow-x: hidden; font-size-adjust: none; font-stretch: normal;" for="placeholder1314588474481">Hi Mom</label>
  </span>
</label>

다른 심도 있지만, 나는 그것들을 모두 보지 않았습니다. 그중 하나 인 Placeholders.js 는 자신을 "종속성이 없음 (따라서 대부분의 자리 표시 자 폴리 필 스크립트와 달리 jQuery를 포함 할 필요가 없음")로 광고합니다.

편집 : "어떻게" "어떻게"에 관심이있는 사람들 을 위해, 이것을 수행하는 jQuery 플러그인을 만드는 과정을 안내하는 고급 HTML5 자리 표시 자 폴리 필 을 만드는 방법.

또한 Firefox 및 Chrome과 다른 IE10에서 자리 표시 자 텍스트가 포커스에서 사라지는 방법에 대한 설명 은 IE10에서 자리 표시 자 유지를 참조하십시오 . 이 문제에 대한 해결책이 있는지 확실하지 않습니다.


2
IE7, IE8 및 IE9에서 잘 작동했습니다.
Mark Rummel

2
해당 플러그인은 더 이상 유지 관리되지 않으며 알려진 문제가 많이 있습니다.
Ian Dunn

13
공감? 답변에 다른 심에 대한 링크가 포함되어 있습니다. 비 jQuery를 포함하도록 업데이트되었습니다.
Kevin Hakanson

플러그인의 github 페이지가 더 이상 존재하지 않습니다. 여기 또 다른 것이 있습니다.

1
입력을 수정하는 팬이 너무 크지 않기 때문에 아래의 Nick의 답변을 참조하십시오. 입력 값을 수정하는 대신 투명한 오버레이를 사용합니다
Nathan Tregillus

38

내 경험 중 가장 좋은 것은 https://github.com/mathiasbynens/jquery-placeholder ( html5please.com 권장 )입니다. http://afarkas.github.com/webshim/demos/index.html 은 훨씬 광범위한 폴리 필 라이브러리 중에서도 좋은 솔루션을 제공합니다.


3
jQuery-html5 자리 표시자를 통해 +1합니다. 이것은 훨씬 더 멋지게 보이고 다른 것 (예 : 숨겨진 들판)에 의해 놓친 일부 경우를 처리합니다
andygeers

2
이번에는 StackOverflow가 나쁜 조언을했다고 말할 수 있습니다. IE에서 클릭하면 jQuery 자리 표시자가 입력을 지우지 않습니다.
firedev

12

jQuery 구현을 사용하면 제출할 때 기본값을 쉽게 제거 할 수 있습니다. 아래는 예입니다.

$('#submit').click(function(){
   var text = this.attr('placeholder');
   var inputvalue = this.val();  // you need to collect this anyways
   if (text === inputvalue) inputvalue = "";

   // $.ajax(...  // do your ajax thing here

});

나는 당신이 오버레이를 찾고 있다는 것을 알고 있지만, 당신은이 경로의 용이성을 선호 할 것입니다 (이제 위에서 쓴 것을 알고 있습니다). 그렇다면 내 프로젝트를 위해 이것을 작성했으며 실제로 훌륭하게 작동하며 (jQuery 필요) 전체 사이트에 구현하는 데 몇 분 정도 걸립니다. 처음에는 회색 텍스트, 초점이 맞으면 밝은 회색, 입력 할 때 검은 색을 제공합니다. 또한 입력 필드가 비어있을 때마다 자리 표시 자 텍스트를 제공합니다.

먼저 양식을 설정하고 입력 태그에 자리 표시 자 속성을 포함시킵니다.

<input placeholder="enter your email here">

이 코드를 복사하여 placeholder.js로 저장하십시오.

(function( $ ){

   $.fn.placeHolder = function() {  
      var input = this;
      var text = input.attr('placeholder');  // make sure you have your placeholder attributes completed for each input field
      if (text) input.val(text).css({ color:'grey' });
      input.focus(function(){  
         if (input.val() === text) input.css({ color:'lightGrey' }).selectRange(0,0).one('keydown', function(){     
            input.val("").css({ color:'black' });  
         });
      });
      input.blur(function(){ 
         if (input.val() == "" || input.val() === text) input.val(text).css({ color:'grey' }); 
      }); 
      input.keyup(function(){ 
        if (input.val() == "") input.val(text).css({ color:'lightGrey' }).selectRange(0,0).one('keydown', function(){
            input.val("").css({ color:'black' });
        });               
      });
      input.mouseup(function(){
        if (input.val() === text) input.selectRange(0,0); 
      });   
   };

   $.fn.selectRange = function(start, end) {
      return this.each(function() {
        if (this.setSelectionRange) { this.setSelectionRange(start, end);
        } else if (this.createTextRange) {
            var range = this.createTextRange();
            range.collapse(true); 
            range.moveEnd('character', end); 
            range.moveStart('character', start); 
            range.select(); 
        }
      });
   };

})( jQuery );

하나의 입력에만 사용하려면

$('#myinput').placeHolder();  // just one

브라우저가 HTML5 자리 표시 자 속성을 지원하지 않는 경우 사이트의 모든 입력 필드에 구현하는 것이 좋습니다.

var placeholder = 'placeholder' in document.createElement('input');  
if (!placeholder) {      
  $.getScript("../js/placeholder.js", function() {   
      $(":input").each(function(){   // this will work for all input fields
        $(this).placeHolder();
      });
  });
} 

위의 내용에 대한 바이올린 / 데모를 작성해 주시고 앞으로 시청자에게도 도움이 되겠습니까?
user2086641

비밀번호 필드를 지원합니까?
user2681579

6

IE에서 몇 가지 제안을 시도하고 문제를 본 후에는 다음과 같이 작동합니다.

https://github.com/parndt/jquery-html5-placeholder-shim/

내가 좋아하는 것-당신은 단지 js 파일을 포함합니다. 시작할 필요가 없습니다.


이 자리 표시자를 사용한 후 제대로 작동하지만 양식 오류가있는 경우 양식 오류를 표시하는 동안 자리 표시 자 텍스트가 입력 필드에서 잘못 정렬되어 해결하려고했지만 해결할 수 없었습니다. .
user2681579

나는 값을 수정하는 버전보다 이것을 더 좋아합니다. 자리 표시 자의 html5 버전도 이와 같이 작동하기를 바랍니다. (예 : 일부 텍스트를 입력 할 때까지 자리를 떠나는 것이 아니라 초점 값을 잃어버린)
나단 Tregillus

4
  • IE9 +에서만 작동

다음 솔루션은 자리 표시 자 속성을 사용하여 입력 텍스트 요소에 바인딩합니다. IE에 대해서만 자리 표시 자 동작을 에뮬레이트하고 제출되지 않은 경우 제출시 입력 값 필드를 지 웁니다.

이 스크립트를 추가하면 IE는 HTML5 자리 표시자를 지원하는 것 같습니다.

  $(function() {
  //Run this script only for IE
  if (navigator.appName === "Microsoft Internet Explorer") {
    $("input[type=text]").each(function() {
      var p;
     // Run this script only for input field with placeholder attribute
      if (p = $(this).attr('placeholder')) {
      // Input field's value attribute gets the placeholder value.
        $(this).val(p);
        $(this).css('color', 'gray');
        // On selecting the field, if value is the same as placeholder, it should become blank
        $(this).focus(function() {
          if (p === $(this).val()) {
            return $(this).val('');
          }
        });
         // On exiting field, if value is blank, it should be assigned the value of placeholder
        $(this).blur(function() {
          if ($(this).val() === '') {
            return $(this).val(p);
          }
        });
      }
    });
    $("input[type=password]").each(function() {
      var e_id, p;
      if (p = $(this).attr('placeholder')) {
        e_id = $(this).attr('id');
        // change input type so that the text is displayed
        document.getElementById(e_id).type = 'text';
        $(this).val(p);
        $(this).focus(function() {
          // change input type so that password is not displayed
          document.getElementById(e_id).type = 'password';
          if (p === $(this).val()) {
            return $(this).val('');
          }
        });
        $(this).blur(function() {
          if ($(this).val() === '') {
            document.getElementById(e_id).type = 'text';
            $(this).val(p);
          }
        });
      }
    });
    $('form').submit(function() {
      //Interrupt submission to blank out input fields with placeholder values
      $("input[type=text]").each(function() {
        if ($(this).val() === $(this).attr('placeholder')) {
          $(this).val('');
        }
      });
     $("input[type=password]").each(function() {
        if ($(this).val() === $(this).attr('placeholder')) {
           $(this).val('');
        }
      });
    });
  }
});

1
많은 사용자가 여전히 IE8을 사용하고 일부는 IE7을 사용하기도합니다.
rzr

4

간단한 기능을 제안합니다.

function bindInOut(element,value)
{
    element.focus(function()
    {
        if(element.val() == value) element.val('');         
    }).
    blur(function()
    {
        if(element.val() == '') element.val(value);
    });

    element.blur();
}

그것을 사용하려면 다음과 같이 호출하십시오.

bindInOut($('#input'),'Here your value :)');


2

당신이 사용할 수있는 :

var placeholder = 'search  here';

$('#search').focus(function(){
    if ($.trim($(this).val()) ===  placeholder){
        this.value ='';
    }
}).blur(function(){
    if ($.trim($(this).val()) ===  ''){
        this.value = placeholder;
    }
}).val(placeholder);

2

이처럼 간단합니다.

$(function() {
    ...

    var element = $("#selecter")
    if(element.val() === element.attr("placeholder"){

        element.text("").select().blur();
    }

    ...
});


1

사용자 정의 색상을 허용하고 초점을 맞출 때 입력을 지우는 다른 동작을 사용하는 간단한 자리 표시 자 JQuery 스크립트를 생각해 냈습니다. Firefox 및 Chrome의 기본 자리 표시자를 대체하고 IE8에 대한 지원을 추가합니다.

// placeholder script IE8, Chrome, Firefox
// usage: <input type="text" placeholder="some str" />
$(function () { 
    var textColor = '#777777'; //custom color

    $('[placeholder]').each(function() {
        (this).attr('tooltip', $(this).attr('placeholder')); //buffer

        if ($(this).val() === '' || $(this).val() === $(this).attr('placeholder')) {
            $(this).css('color', textColor).css('font-style','italic');
            $(this).val($(this).attr('placeholder')); //IE8 compatibility
        }

        $(this).attr('placeholder',''); //disable default behavior

        $(this).on('focus', function() {
            if ($(this).val() === $(this).attr('tooltip')) {
                $(this).val('');
            }
        });

        $(this).on('keydown', function() {
            $(this).css('font-style','normal').css('color','#000');
        });

        $(this).on('blur', function() {
            if ($(this).val()  === '') {
                $(this).val($(this).attr('tooltip')).css('color', textColor).css('font-style','italic');
            }
        });
    });
});

완벽한 salution이지만 오류가 있습니다. (this) .attr ( 'tooltip', $ (this) .attr ( 'placeholder')); // 버퍼를이 줄을 $ (this) .attr ( 'tooltip', $ (this) .attr ( 'placeholder')); // buffer
angel.bonev

0

자리 표시 자 는 내가 작성한 초경량 드롭 인 플레이스 홀더 jQuery polyfill입니다. 1KB 미만으로 축소되었습니다.

이 라이브러리가 두 가지 우려 사항을 모두 해결하도록했습니다.

  1. Placeholdr 는 Placeholdr의 결과로 텍스트가 입력 필드에있을 때 예기치 않은 리턴 값을 방지하기 위해 jQuery $ .fn.val () 함수 를 확장합니다 . 따라서 필드 값에 액세스하기 위해 jQuery API를 고수하면 항목을 변경할 필요가 없습니다.

  2. 플레이스 홀더는 양식 제출을 청취하고 필드에서 플레이스 홀더 텍스트를 제거하여 서버가 단순히 빈 값을 볼 수 있도록합니다.

또한 Placeholdr의 목표는 자리 표시 자 문제에 간단한 드롭 인 솔루션을 제공하는 것입니다. 플레이스 홀더 지원에 관심이 있으시면 Github에 알려주십시오.


0

플러그인을 삽입하고 즉, 완벽하게 작동하는지 확인하려면 jquery.placeholder.js

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="jquery.placeholder.js"></script>
    <script>
        // To test the @id toggling on password inputs in browsers that don’t support changing an input’s @type dynamically (e.g. Firefox 3.6 or IE), uncomment this:
        // $.fn.hide = function() { return this; }
        // Then uncomment the last rule in the <style> element (in the <head>).
        $(function() {
            // Invoke the plugin
            $('input, textarea').placeholder({customClass:'my-placeholder'});
            // That’s it, really.
            // Now display a message if the browser supports placeholder natively
            var html;
            if ($.fn.placeholder.input && $.fn.placeholder.textarea) {
                html = '<strong>Your current browser natively supports <code>placeholder</code> for <code>input</code> and <code>textarea</code> elements.</strong> The plugin won’t run in this case, since it’s not needed. If you want to test the plugin, use an older browser ;)';
            } else if ($.fn.placeholder.input) {
                html = '<strong>Your current browser natively supports <code>placeholder</code> for <code>input</code> elements, but not for <code>textarea</code> elements.</strong> The plugin will only do its thang on the <code>textarea</code>s.';
            }
            if (html) {
                $('<p class="note">' + html + '</p>').insertAfter('form');
            }
        });
    </script>

0

다음은 IE 8 이하의 자리 표시자를 만드는 순수한 자바 스크립트 함수 (jquery 필요 없음)이며 암호에서도 작동합니다. HTML5 자리 표시 자 특성을 읽고 양식 요소 뒤에 span 요소를 만들고 양식 요소 배경을 투명하게 만듭니다.

/* Function to add placeholders to form elements on IE 8 and below */
function add_placeholders(fm) {	
	for (var e = 0; e < document.fm.elements.length; e++) {
		if (fm.elements[e].placeholder != undefined &&
		document.createElement("input").placeholder == undefined) { // IE 8 and below					
			fm.elements[e].style.background = "transparent";
			var el = document.createElement("span");
			el.innerHTML = fm.elements[e].placeholder;
			el.style.position = "absolute";
			el.style.padding = "2px;";
			el.style.zIndex = "-1";
			el.style.color = "#999999";
			fm.elements[e].parentNode.insertBefore(el, fm.elements[e]);
			fm.elements[e].onfocus = function() {
					this.style.background = "yellow";	
			}
			fm.elements[e].onblur = function() {
				if (this.value == "") this.style.background = "transparent";
				else this.style.background = "white";	
			}		
		} 
	}
}

add_placeholders(document.getElementById('fm'))
<form id="fm">
  <input type="text" name="email" placeholder="Email">
  <input type="password" name="password" placeholder="Password">
  <textarea name="description" placeholder="Description"></textarea>
</form>


0

참고 :이 polyfill의 저자는 그것이 상상할 수있는 거의 모든 브라우저에서 작동한다고 주장하지만 IE11에는 해당되지 않는 의견에 따르면 IE11은 대부분의 최신 브라우저와 마찬가지로 기본 지원을 제공합니다

Placeholders.js 는 내가 본 최고의 자리 표시 자 폴리 필입니다.


1
@Niclas IE9 이상은 플레이스 홀더에 대한 고유 한 지원을 가지고 있습니다.
Hexodus

자리 표시 자에 대한 caniuse 링크와 함께이 답변에 메모를 추가했습니다.
Dave Everitt

-1

jquery.placeholderlabels 사용 합니다 . 이를 기반으로 여기에서 데모 할 수 있습니다 .

ie7, ie8, ie9에서 작동합니다.

동작은 현재 파이어 폭스 및 크롬 동작을 모방합니다. "자리 표시 자"텍스트는 초점에 계속 표시되고 필드에 무언가를 입력 한 후에 만 ​​사라집니다.


-1

기존 shim이 자리 표시 자에 포커스를 두지 않아 사용자 경험이 저하되고 Firefox, Chrome 및 Safari가 처리하는 방식과 일치하지 않는다는 좌절감을 느끼고 나만의 jQuery 플러그인을 만들었습니다. 페이지 나 팝업이 처음로드 될 때 입력에 초점을 맞추고 텍스트가 입력 될 때까지 자리 표시자를 계속 표시하려는 경우 특히 그렇습니다.

https://github.com/nspady/jquery-placeholder-labels/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.