IE9 में प्लेसहोल्डर


140

ऐसा लगता है कि यह एक बहुत अच्छी तरह से ज्ञात समस्या है, लेकिन Google पर मुझे मिले सभी समाधान मेरे नए डाउनलोड किए गए IE9 पर काम नहीं करते हैं।

Placeholderसंपत्ति inputऔर textareaटैग को सक्षम करने के लिए आपका पसंदीदा तरीका कौन सा है ?

वैकल्पिक: मैंने उस पर बहुत समय खो दिया और requiredअभी तक संपत्ति की तलाश नहीं की। क्या आपके पास इसके लिए कुछ सलाह भी होगी? जाहिर है मैं PHP में मूल्य की जांच कर सकता हूं, लेकिन उपयोगकर्ता की मदद करने के लिए यह संपत्ति बहुत सुविधाजनक है।


मैं 4yrs के बाद HTML में वापस आ गया हूं। मतलब मैं अपने पुराने उपकरणों को बदलने के लिए किसी भी सलाह के लिए खुला हूं। मैं लगभग शून्य से पुनः आरंभ करता हूं। मैं मुख्य रूप से JQuery और Google परिणामों से कई कॉपी / अतीत के साथ कोशिश कर रहा हूं, मेरी
आखिरी

जवाबों:


185

HTML5 प्लेसहोल्डर jQuery प्लगइन
- माथियास ब्येनेंस ( HTML5 बॉयलरप्लेट और jsPerf पर एक सहयोगी ) द्वारा

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

डेमो और उदाहरण

http://mathiasbynens.be/demo/placeholder

ps
मैंने कई बार इस प्लगइन का उपयोग किया है और यह एक उपचार का काम करता है। इसके अलावा यह नहीं है जब आप अपने प्रपत्र (... एक असली दर्द मैं अन्य प्लग-इन के साथ पाया जाता है) प्रस्तुत एक मूल्य के रूप में प्लेसहोल्डर पाठ सबमिट करें।


हम एक कस्टम CRM के साथ काम कर रहे हैं। मैंने इस कोड और कार्यों को उम्मीद के मुताबिक जोड़ा है, लेकिन वे जावास्क्रिप्ट के माध्यम से अपने फॉर्म जमा करते हैं। सबमिट बटन है onclick="_IW.FormsRuntime.submit(this.form);"। क्या वैसे भी मैं इस ऑनक्लिक ईवेंट को पहले प्लेसहोल्डर्स को साफ़ करने के लिए बदल सकता हूं, और फिर ऑन्कलक में मौजूद इस सीआरएम कोड को चला सकता हूं?
लीश

1
मैं अपने src कोड में github js फ़ाइल की प्रतिलिपि बनाई। फिर भी प्लेसहोल्डर के साथ नहीं जाना है।
फिलो

2
यह वास्तव में एक इलाज का काम करता है, हालांकि यह एकल पृष्ठ अनुप्रयोगों पर उपयोग करने के लिए एक दर्द है। आपको इसे गतिशील रूप से जोड़े गए फ़ील्ड के लिए मैन्युअल रूप से ट्रिगर करने की आवश्यकता है। इसके अलावा, महान काम करता है!
smets.kevin

1
धन्यवाद, साफ-सुथरा प्लगइन, हालांकि एक समस्या जो मुझे आई 9 के साथ है, वह यह है कि प्लेसहोल्डर गायब हो जाता है जब टेक्स्ट इनपुट फोकस पर होता है। यह एचटीएमएल 5 व्यवहार से अलग है
गेरेटन

1
यह एक बड़े 'लेकिन', $ ('इनपुट') के साथ अच्छा काम करता है। वैल () इनपुट खाली होने पर प्लेसहोल्डर मान लौटाता है। क्योंकि मैं AJAX ढांचे के साथ काम कर रहा हूँ, कि प्लेसहोल्डर सर्वर पर भेजे जाते हैं ...
डेन्यूबियन नाविक

21

मुझे लगता है कि यह वही है जो आप ढूंढ रहे हैं: jquery-html5- प्लेसहोल्डर-फिक्स

यह समाधान प्लेसहोल्डर समर्थित है या नहीं यह निर्धारित करने के लिए सुविधा का पता लगाने ( आधुनिकीकरण के माध्यम से ) का उपयोग करता है। यदि नहीं, तो समर्थन जोड़ता है (jQuery के माध्यम से)।


2
यह काम करता है, लेकिन यह सबसे बड़ा कोड नहीं है। शीर्ष $(this)पर एक चर को सौंपा जाना चाहिए जिसे पूरे कोड में उपयोग किया जा सकता है। $प्रत्येक अभिव्यक्ति के लिए कॉलिंग $(this)"नो डिटेल jQuery लाइक दिस 101" से सीधे नंबर-नो है।
सामी संहिता

20
आपको इस कोड से सावधान रहना होगा क्योंकि यदि आप फॉर्म जमा करते हैं, तो प्लेसहोल्डर मान फॉर्म वैल्यू के रूप में सबमिट किया जाएगा। जमा करने से पहले इसे साफ कर लेना चाहिए।
इरीबाई

2
@chriscatfr कृपया मेरे उत्तर ( stackoverflow.com/a/13281620/114140 ) को स्वीकार करने पर विचार करें क्योंकि मुझे लगता है कि यह SO उपयोगकर्ताओं को बहुत बेहतर समाधान की ओर निर्देशित करेगा।
क्रिस जैकब

जब से मैं HTML 5 में नई नई लड़ाई के लिए उत्सुक हूं: क्या यह आधुनिक है कि यह एक बुरा समाधान या jquery-html5-प्लेसहोल्डर-फिक्स (या दोनों) का कारण बनता है?
स्नेक डेस

यह सरल और सुरुचिपूर्ण है और मेरे लिए काम किया है।
कब्रिस्तान

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
क्षमा करें - मैं वास्तव में नहीं जानता कि क्या करना आसान है - मुझे लगता है कि आप "प्रतीकों" के बजाय वास्तविक पाठ मान प्रदर्शित करना चाहेंगे। केवल हैक मैं ऐसा करने के लिए सोच सकता हूं यह एक पाठ इनपुट के लिए स्विच करना होगा जब तक कि इसमें फोकस या मूल्य न हो, अन्यथा इसे पासवर्ड फ़ील्ड के रूप में प्रदर्शित करें।
मार्क रोड्स

@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 पर काम jQuery इनपुट प्रकार हेरफेर करने के लिए (पर 1:48 पर 20 दिसंबर, 2011 को विधेयक से टिप्पणी की जाँच की अनुमति नहीं है नहीं है bavotasan.com/2011/html5-placeholder-jquery-fix )
forste

यह भी मानता है कि आप एक फॉर्म जमा कर रहे हैं। मैंने देखा है कि अधिकांश सिंगल पेज एप्स फॉर्म का उपयोग नहीं करते हैं। बस हैंडलर पर क्लिक करें।
चॉवी

5

यदि आप एक विवरण इनपुट करना चाहते हैं तो आप इसका उपयोग कर सकते हैं। यह IE 9 और अन्य सभी ब्राउज़रों पर काम करता है।

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

1
स्वयं इसका परीक्षण नहीं किया, लेकिन यह अनुमान लगाने पर कि यदि आप इसे क्लिक करने के बजाय फ़ील्ड में टैब करते हैं तो यह अच्छी तरह से काम नहीं करता है। मैं इस बग को बहुत सारी वेबसाइटों में देखता हूं, या इसे पसंद करता हूं।
२०:१३

इस समाधान के साथ आपको फॉर्म सबमिट पर इस मूल्य के लिए भी जांच करनी होगी।
इगोर जेरोसमिक

मुझे आश्चर्य है कि इसे कोई भी वोट मिला, 2012-2013 में पोस्ट किए जाने पर भी इसका इस्तेमाल नहीं किया जाना चाहिए
लोकलपीसीगयू

यदि आप इनपुट में लिखते हैं कि प्लेसहोल्डर क्या होना चाहिए ('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
आपको इस कोड से सावधान रहना होगा क्योंकि यदि आप फॉर्म जमा करते हैं, तो प्लेसहोल्डर मान फॉर्म वैल्यू के रूप में सबमिट किया जाएगा। जमा करने से पहले आपको इसे साफ कर देना चाहिए।
क्रिस्चट्रो

3
@chriscatfr: कोई इस उदाहरण में ठीक से कैसे करेगा? यदि मेरा प्लेसहोल्डर 'पासवर्ड' है और मेरा पासवर्ड वास्तव में 'पासवर्ड' है?
लीन

आप इस तरह के क्षेत्रों के लिए "गंदे" की अवधारणा का उपयोग कर सकते हैं। प्रविष्टि के रूप में फ़ील्ड को साफ़ करें (शायद डेटा-गंदे = "गलत" का उपयोग करें)। यदि वे प्लेसहोल्डर टेक्स्ट को बदले बिना फॉर्म जमा करते हैं, तो आप देखेंगे कि फ़ील्ड साफ है, इसलिए इसे साफ़ करें। यदि उन्होंने इसे बदल दिया, यहां तक ​​कि प्लेसहोल्डर के समान मूल्य पर, तो यह गंदा है और आप उस मूल्य को जमा करते हैं।
ooyoyaya

पासवर्ड और अन्य समाधान के लिए कृपया jsfiddle.net/AlexanderPatel/1pv2174c/3 देखें
शिरीष पटेल

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

सीएसएस स्टाइल को शामिल करने की आवश्यकता है:

.hasPlaceholder {color: #aaa;}

1
आपको यहां अपना फ़ॉर्मेटिंग ठीक करना चाहिए, जैसे इंडेंटेशन जोड़ें और अपने उत्तर को अपने कोड से अलग करें
darren

1

एक पार्टी के लिए देर से काटा लेकिन मैं अपने की कोशिश की का उपयोग करें और जे एस कि का लाभ लेता है पर भरोसा किया 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..is फूला हुआ 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
इस प्लगइन को प्रोटोटाइप लाइब्रेरी की भी आवश्यकता है
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
आपका प्लेसहोल्डर मान बन जाता है। यदि आप जमा करते हैं तो उन्हें भेजा जाएगा। सही उत्तर के प्लेसहोल्डर के साथ। खेतों को खाली रखा जाता है
chriscatfr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.