ตัวยึดใน IE9


140

ดูเหมือนว่ามันจะเป็นปัญหาที่รู้จักกันดี แต่การแก้ปัญหาทั้งหมดที่ฉันพบใน Google ไม่ทำงานบน IE9 ที่เพิ่งดาวน์โหลดมา

วิธีใดที่คุณชอบเพื่อเปิดใช้งานPlaceholderคุณสมบัติบนinputและtextareaแท็ก

ทางเลือก: ฉันเสียเวลาไปมากและไม่ได้มองหาrequiredที่พัก คุณจะมีคำแนะนำสำหรับสิ่งนี้หรือไม่? เห็นได้ชัดว่าฉันสามารถตรวจสอบค่าใน PHP แต่เพื่อช่วยให้ผู้ใช้คุณสมบัตินี้มีความสะดวกมาก


ฉันกลับมาที่ HTML หลังจาก 4 ปี ความหมายฉันเปิดให้คำแนะนำใด ๆ เพื่อแทนที่เครื่องมือที่ล้าสมัยของฉัน ฉันรีสตาร์ทเกือบเป็นศูนย์ ฉันได้ลองเป็นหลักกับ JQuery และคัดลอก / อดีตจากผลลัพธ์ของ Google ลองครั้งล่าสุด
chriscatfr

คำตอบ:


185

HTML5 Placeholder jQuery Plugin
- โดยMathias Bynens (ผู้ทำงานร่วมกันในHTML5 BoilerplateและjsPerf )

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

การสาธิต & ตัวอย่าง

http://mathiasbynens.be/demo/placeholder

ป.ล.
ฉันใช้ปลั๊กอินนี้หลายครั้งและใช้งานได้ดี และจะไม่ส่งข้อความตัวยึดตำแหน่งเป็นค่าเมื่อคุณส่งแบบฟอร์ม (... ความเจ็บปวดที่แท้จริงที่ฉันพบกับปลั๊กอินอื่น ๆ )


เรากำลังทำงานกับ CRM ที่กำหนดเอง ฉันเพิ่มรหัสนี้และงานตามที่คาดไว้ แต่พวกเขาส่งแบบฟอร์มของพวกเขาผ่านทางจาวาสคริปต์ onclick="_IW.FormsRuntime.submit(this.form);"ปุ่มส่งมี มีอยู่ฉันสามารถเปลี่ยนเหตุการณ์ onclick นี้เพื่อล้างตัวยึดตำแหน่งก่อนจากนั้นเรียกใช้รหัส CRM นี้ที่มีอยู่ใน onclick
Leeish

1
ฉันคัดลอกไฟล์ github js ไปยังโค้ด src ของฉัน ยังไม่ไปกับตัวยึดตำแหน่ง
Philo

2
วิธีนี้ใช้งานได้จริง แต่เป็นความเจ็บปวดที่จะใช้กับแอปพลิเคชันหน้าเดียว คุณต้องทริกเกอร์ด้วยตนเองเพื่อเพิ่มฟิลด์แบบไดนามิก นอกจากนั้นใช้งานได้ดี!
smets.kevin

1
ขอบคุณปลั๊กอินที่เรียบร้อย แต่ปัญหาหนึ่งที่ฉันมีคือ ie9 ตัวยึดจะหายไปเมื่อมีการป้อนข้อความ สิ่งนี้แตกต่างจากพฤติกรรม HTML5
gerrytan

1
มันใช้งานได้ดีกับหนึ่งใหญ่ 'แต่', $ ('อินพุต'). val () คืนค่าตัวยึดตำแหน่งเมื่ออินพุตว่าง เพราะผมทำงานกับกรอบ AJAX, ตัวยึดที่ถูกส่งไปยังเซิร์ฟเวอร์ ...
Danubian เซเลอร์

21

ฉันคิดว่านี่คือสิ่งที่คุณกำลังมองหา: jquery-html5-placeholder-fix

โซลูชันนี้ใช้การตรวจจับคุณสมบัติ (ผ่านmodernizr ) เพื่อตรวจสอบว่าตัวยึดตำแหน่งได้รับการสนับสนุนหรือไม่ ถ้าไม่เพิ่มการสนับสนุน (ผ่าน jQuery)


2
มันใช้งานได้ แต่มันไม่ใช่รหัสที่ยิ่งใหญ่ที่สุด ที่ด้านบน$(this)ควรกำหนดให้กับตัวแปรที่สามารถใช้ได้ตลอดทั้งรหัส การเรียก$ใช้นิพจน์ทุกครั้งที่ใช้$(this)นั้นไม่ใช่ "ไม่เขียน jQuery Like This 101"
Sami Samhuri

20
คุณต้องระมัดระวังด้วยรหัสนี้เนื่องจากถ้าคุณส่งแบบฟอร์มค่าตัวยึดตำแหน่งจะถูกส่งเป็นค่าแบบฟอร์ม ควรล้างก่อนส่ง
ericbae

2
@chriscatfr โปรดพิจารณายอมรับคำตอบของฉัน ( 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 เมื่อโหลดหน้าเว็บ

โปรดทราบว่าสิ่งนี้ใช้ได้โดยใช้คลาส: usingPlaceHolderกับองค์ประกอบอินพุตดังนั้นคุณสามารถใช้สิ่งนี้เพื่อจัดสไตล์ (เช่นเพิ่มกฎ.usingPlaceHolder { color: #999; font-style: italic; }เพื่อให้ดูดีขึ้น)


1
ขออภัย - ฉันไม่รู้จริง ๆ ว่าเป็นเรื่องง่าย - ฉันเดาว่าคุณต้องการแสดงค่าข้อความจริงแทนที่จะเป็น "สัญลักษณ์" แฮ็คเดียวที่ฉันคิดได้ว่าทำเช่นนี้คือเปลี่ยนเป็นข้อความหากไม่มีการโฟกัสหรือค่ามิฉะนั้นจะแสดงเป็นฟิลด์รหัสผ่าน
Mark Rhodes

@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>

ไม่ได้ทำงานใน IE8 ตั้งแต่ IE ไม่อนุญาตให้ jQuery ในการจัดการรูปแบบการใส่ (ตรวจสอบความคิดเห็นจากบิลวันที่ 20 ธันวาคม 2011 เวลา 13:48 ในbavotasan.com/2011/html5-placeholder-jquery-fix )
første

ยังถือว่าคุณกำลังส่งแบบฟอร์ม แอปหน้าเดียวส่วนใหญ่ที่ฉันเห็นไม่ใช้แบบฟอร์ม เพียงคลิกตัวจัดการ
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ć

ฉันประหลาดใจที่มีการลงคะแนนใด ๆ สิ่งนี้ไม่ควรใช้แม้จะโพสต์เมื่อ 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

3
@chriscatfr: วิธีการอย่างใดอย่างหนึ่งจะทำอย่างถูกต้องในตัวอย่างนี้? หากตัวยึดตำแหน่งของฉันคือ 'รหัสผ่าน' และรหัสผ่านของฉันคือ 'รหัสผ่าน' จริงหรือไม่
นอน

คุณสามารถใช้แนวคิด "สกปรก" สำหรับฟิลด์เช่นนี้ ตั้งค่าสถานะฟิลด์ว่าสะอาดเมื่อเข้า (อาจใช้ data-dirty = "false") หากพวกเขาส่งแบบฟอร์มโดยไม่เปลี่ยนข้อความตัวยึดตำแหน่งคุณจะเห็นว่าช่องนั้นสะอาดโปรดลบออก หากพวกเขาทำการเปลี่ยนแปลงแม้จะเป็นค่าเดียวกันกับตัวยึดแล้วก็สกปรกและคุณจะส่งค่านั้น
oooyaya

สำหรับรหัสผ่านและวิธีแก้ปัญหาอื่น ๆ โปรดดูที่jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish Patel

placeholderสถานที่ให้บริการที่ได้มาตรฐานเป็นสตริง => ไม่จำเป็นต้อง Modernizr จริง ๆ ::::::::::::::::::::::::::: 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

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 Style จำเป็นต้องมี:

.hasPlaceholder {color: #aaa;}

1
คุณควรแก้ไขการจัดรูปแบบของคุณที่นี่เช่นเพิ่มการเยื้องและแยกคำตอบของคุณออกจากรหัสของคุณ
darren

1

บิตปลายไปงานเลี้ยง แต่ฉันจะใช้ความพยายามของฉันและเชื่อถือได้ 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 ที่ป่อง
สป็อค

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
ปลั๊กอินนี้ต้องการ
ไลบรารี่

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.