ป้อนตัวยึดตำแหน่งสำหรับ Internet Explorer


175

HTML5 แนะนำplaceholderคุณสมบัติในinputองค์ประกอบซึ่งช่วยให้สามารถแสดงข้อความเริ่มต้นเป็นสีเทา

น่าเศร้าที่ Internet Explorer รวมถึง IE 9 ไม่รองรับ

มีสคริปต์ตัวยึดตำแหน่งบางตัวอยู่แล้ว พวกเขามักจะทำงานโดยการใส่ข้อความเริ่มต้นในช่องใส่ให้เป็นสีเทาและลบมันอีกครั้งทันทีที่คุณมุ่งเน้นช่องใส่

ข้อเสียเปรียบของวิธีนี้คือข้อความตัวยึดอยู่ในช่องใส่ ดังนั้น:

  1. สคริปต์ไม่สามารถตรวจสอบได้ง่ายว่าฟิลด์อินพุตว่างหรือไม่
  2. การประมวลผลด้านเซิร์ฟเวอร์ต้องตรวจสอบกับค่าเริ่มต้นเพื่อไม่ให้แทรกตัวยึดตำแหน่งลงในฐานข้อมูล

ฉันต้องการโซลูชันที่ข้อความตัวยึดไม่ได้อยู่ในอินพุต

คำตอบ:


151

ในการมองที่ "เว็บฟอร์มการใส่ตัวยึด" ส่วนของHTML5 ข้าม Polyfills เบราว์เซอร์ , หนึ่งที่ผมเห็นก็คือ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>

ยังมี shims อื่น ๆ ที่นั่น แต่ฉันไม่ได้ดูพวกเขาทั้งหมด หนึ่งในนั้นคือPlaceholder.jsประกาศตัวเองว่า "ไม่ต้องพึ่งพา (จึงไม่จำเป็นต้องรวม jQuery ซึ่งแตกต่างจากสคริปต์ polyfill ตัวยึดตำแหน่งส่วนใหญ่")

แก้ไข:สำหรับผู้ที่สนใจใน "how" that "what", วิธีสร้าง polyfill ตัวยึดตำแหน่ง HTML5 ขั้นสูงซึ่งจะดำเนินการผ่านขั้นตอนการสร้างปลั๊กอิน jQuery

นอกจากนี้โปรดดูที่ให้ความสำคัญกับตัวยึดตำแหน่งใน IE10สำหรับความคิดเห็นเกี่ยวกับวิธีที่ข้อความตัวยึดตำแหน่งหายไปจากการโฟกัสด้วย IE10 ซึ่งแตกต่างจาก Firefox และ Chrome ไม่แน่ใจว่ามีวิธีแก้ไขปัญหานี้หรือไม่


2
ทำงานได้ดีสำหรับฉันใน IE7, IE8 และ IE9
Mark Rummel

2
ปลั๊กอินนั้นไม่ได้รับการดูแลรักษาอีกต่อไปและมีปัญหาที่ทราบมากมาย
Ian Dunn

13
downvote? คำตอบมีลิงค์ไปยัง shims อื่น ๆ อัปเดตเพื่อรวมรายการที่ไม่ใช่ 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
+1 ถึงสิ่งนี้ทาง jQuery-html5-placeholder นี่ดูดีกว่าและจัดการกับกรณีขอบบางอย่างที่คนอื่นพลาด (เช่นเขตข้อมูลที่ซ่อนอยู่)
andygeers

2
ต้องบอกว่าคราวนี้ StackOverflow ให้คำแนะนำที่ไม่ดี jQuery Placeholder ไม่ล้างอินพุตเมื่อคุณคลิกใน IE
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">

เพียงแค่คัดลอกรหัสนี้และบันทึกเป็นตัวยึด

(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

ฉันพบวิธีแก้ปัญหาที่ค่อนข้างง่ายโดยใช้วิธีนี้:

http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html

มันเป็นแฮ็ค jquery และทำงานได้อย่างสมบูรณ์แบบในโครงการของฉัน


อันนี้แทนที่สำหรับทุกคนดังนั้นมันจะทำงานสำหรับเบราว์เซอร์ทั้งหมดโดยไม่คำนึงถึง IE, WebKit หรือ Opera
pankajdoharey

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 เพื่อแก้ปัญหานี้ .. มันฟรี ..

ไดเรกทอรี JQuery:

http://plugins.jquery.com/project/kegles-jquery-placeholder

เว็บไซต์: www.kegles.com.br/jquery-placeholder/


ดูเหมือนว่าจะทำงานได้ดีและเรียบง่ายมาก ... ทำไมถึงมีเพียงสอง upvotes เท่านั้น
Yevgeny Simkin

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

คำเตือนสมบูรณ์แบบ แต่คุณมีข้อผิดพลาด (นี่) .attr ('tooltip', $ (นี้) .attr ('ตัวยึด')); // buffer เปลี่ยนบรรทัดนี้เป็น $ (นี้) .attr ('tooltip', $ (นี้) .attr ('ตัวยึด')); // buffer
angel.bonev

0

ตัวยึดเป็นตัวยึดแบบดรอปดาวน์ jQuery polyfill ที่มีน้ำหนักเบามากที่ฉันเขียน มันน้อยกว่า 1 KB ที่ย่อเล็กสุด

ฉันทำให้แน่ใจว่าห้องสมุดนี้ตอบข้อกังวลของคุณทั้งสอง:

  1. Placeholdr ขยายฟังก์ชัน jQuery $ .fn.val ()เพื่อป้องกันค่าส่งคืนที่ไม่คาดคิดเมื่อมีข้อความในช่องป้อนข้อมูลอันเป็นผลมาจาก Placeholdr ดังนั้นหากคุณใช้ jQuery API สำหรับเข้าถึงค่าฟิลด์ของคุณคุณไม่จำเป็นต้องเปลี่ยนอะไรเลย

  2. ตัวยึดตำแหน่งรับฟังการส่งแบบฟอร์มและจะลบข้อความตัวยึดตำแหน่งออกจากฟิลด์เพื่อให้เซิร์ฟเวอร์เห็นค่าว่างเปล่า

อีกครั้งเป้าหมายของฉันกับ Placeholdr คือการมอบโซลูชันแบบดรอปดาวน์อย่างง่ายให้กับปัญหาของตัวยึดตำแหน่ง แจ้งให้เราทราบเกี่ยวกับ Github หากมีสิ่งอื่นอีกที่คุณอยากให้มีการสนับสนุน Placeholdr


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

นี่คือฟังก์ชั่นจาวาสคริปต์ที่บริสุทธิ์ (ไม่จำเป็นต้องมี jQuery) ที่จะสร้างตัวยึดสำหรับ IE 8 และด้านล่างและใช้งานได้กับรหัสผ่านเช่นกัน มันอ่านแอตทริบิวต์ตัวยึด HTML5 และสร้างองค์ประกอบแบบขยายด้านหลังองค์ประกอบแบบฟอร์มและทำให้พื้นหลังองค์ประกอบแบบฟอร์มโปร่งใส:

/* 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เป็นตัวยึดตำแหน่งที่ดีที่สุดที่ฉันเคยเห็นมีน้ำหนักเบาไม่ได้ขึ้นอยู่กับ JQuery ครอบคลุมเบราว์เซอร์รุ่นเก่าอื่น ๆ (ไม่ใช่แค่ IE) และมีตัวเลือกสำหรับตัวยึดตำแหน่งแบบซ่อนและป้อนข้อมูล


1
@Niclas IE9 ขึ้นไปมีการรองรับเจ้าของพื้นที่เอง
Hexodus

ฉันได้เพิ่มบันทึกคำตอบนี้พร้อมลิงก์ไปยัง caniuse สำหรับตัวยึดตำแหน่ง
Dave Everitt

-1

ใช้ i jquery.placeholderlabels ก็ขึ้นอยู่กับนี้และสามารถ demoed ที่นี่

ทำงานใน ie7, ie8, ie9

behavior เลียนแบบ firefox ปัจจุบันและพฤติกรรม chrome - โดยที่ข้อความ "placeholder" ยังคงปรากฏให้เห็นบนโฟกัสและจะหายไปเมื่อมีสิ่งที่พิมพ์ในฟิลด์


-1

ฉันสร้างปลั๊กอิน jQuery ของตัวเองหลังจากรู้สึกหงุดหงิดที่ shims ที่มีอยู่จะซ่อนตัวยึดตำแหน่งไว้ซึ่งจะสร้างประสบการณ์ผู้ใช้ที่ด้อยกว่าและไม่ตรงกับที่ Firefox, Chrome และ Safari จัดการ โดยเฉพาะอย่างยิ่งกรณีนี้หากคุณต้องการให้อินพุตมุ่งเน้นเมื่อเพจหรือป๊อปอัปโหลดขึ้นครั้งแรกในขณะที่ยังคงแสดงตัวยึดตำแหน่งจนกว่าจะมีการป้อนข้อความ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.