วิธีรองรับแอตทริบิวต์ตัวยึดตำแหน่งใน IE8 และ 9


132

ฉันมีปัญหาเล็กน้อยplaceholderแอตทริบิวต์สำหรับช่องป้อนข้อมูลไม่ได้รับการสนับสนุนใน IE 8-9

วิธีใดเป็นวิธีที่ดีที่สุดในการให้การสนับสนุนในโครงการของฉัน (ASP Net) ฉันใช้ jQuery ฉันต้องการใช้เครื่องมือภายนอกอื่น ๆ หรือไม่?

คือhttp://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.htmlเป็นทางออกที่ดี?


7
มุมของ Pedant: เป็นแอตทริบิวต์ไม่ใช่แท็ก แท็กมีวงเล็บแหลมรอบ ๆ (เช่น<input>); แอตทริบิวต์คือคู่คีย์ - ค่าภายในวงเล็บเหลี่ยม (like placeholder="This is an attribute value") ปล่อยให้คำถามตามที่เป็นอยู่เพื่อให้คนในอนาคตที่ถามคำถามเดียวกันได้ค้นพบ
Paul D. Waite

2
ลิงก์นั้นไม่ทำงานตามที่เป็นอยู่ ฉันลบเครื่องหมายคำพูดพิเศษรอบ ๆ ตัวเลือก $ ("[ตัวยึดตำแหน่ง]") ออกไปและก็เรียบร้อยดี
claptimes

1
โซลูชันในลิงค์นั้นไม่จัดการกล่องรหัสผ่านตามการสนับสนุนดั้งเดิมใน webkit
geedubb

1
ลิงก์ที่คุณให้มานั้นใช้งานได้ดีมาก - นอกเหนือจากรหัสผ่านแล้วยังใช้งานได้ดีและไม่สามารถติดตั้งได้ง่ายกว่านี้
hobailey

1
ลิงก์เป็นการแก้ไขที่ดี
Pixelomo

คำตอบ:


89

คุณสามารถใช้ปลั๊กอิน jQuery นี้: https://github.com/mathiasbynens/jquery-placeholder

แต่ลิงค์ของคุณดูเหมือนจะเป็นทางออกที่ดีเช่นกัน


2
ลิงก์ที่แนะนำในคำถามไม่ได้ผลสำหรับฉัน มีปัญหากับการส่งแบบฟอร์ม วิธีแก้ปัญหาที่คุณแนะนำในคำตอบนี้ดูเหมือนจะมีประสิทธิภาพมากกว่าและใช้ได้ผลดี
Jonny White

อันที่จริงฉันลองอันนี้แล้วและใช้งานได้ดี - แต่ทันทีที่ฉันโหลดไลท์บ็อกซ์ที่มีแบบฟอร์มและฟิลด์รหัสผ่านทุกอย่างใช้งานได้ แต่ไม่ใช่ฟิลด์รหัสผ่านมันก็ว่างเปล่า
Jurik

6
ในตัวยึดรหัสผ่าน IE8 ของฉันเป็นจุด
Mladen Janjetovic

ฉันยังไม่เห็นมันใน IE8 ฉันแก้ไขมันโดยการแสดงข้อความเหนือฟิลด์เมื่ออยู่ใน ie8
jhawes

jQuery-placeholder ทำงานแตกต่างกัน จะลบตัวยึดที่โฟกัสแทนที่จะเป็นเวลาที่ผู้ใช้เริ่มพิมพ์บางอย่างบนฟิลด์เช่นพฤติกรรมปกติใน Firefox สำหรับตัวยึดตำแหน่ง
supertonsky

89

คุณสามารถใช้ polyfills เหล่านี้:

สคริปต์เหล่านี้จะเพิ่มการรองรับplaceholderแอตทริบิวต์ในเบราว์เซอร์ที่ไม่รองรับและไม่ต้องใช้ jQuery!


4
ฉันโหวตสิ่งนี้เพราะฉันชอบแนวคิดของโซลูชันที่ไม่ใช่ jquery แต่ตอนนี้โค้ดนี้มีปัญหาใน IE8 ดังนั้นจึงไม่เหมาะกับฉัน github.com/jamesallardice/Placeholders.js/issues/17
Dan Searle

3
โซลูชันนี้ไม่รองรับกล่องรหัสผ่าน
Jurik

2
@Jurik ฉันได้เพิ่ม polyfill พิเศษ - ฉันหวังว่ามันจะช่วยได้
starbeamrainbowlabs

1
แม้แต่ผู้จัดจำหน่ายปลั๊กอินนี้ยังบอกว่าปลั๊กอินนี้ไม่จัดการฟิลด์รหัสผ่านใน <IE9 github.com/jamesallardice/Placeholders.js/issues/…
Jurik

ฟิลด์รหัสผ่านยังใช้ไม่ได้ใน iE8 ลิงก์คำตอบที่ยอมรับดูเหมือนจะทำงานในฟิลด์ ie8 สำหรับรหัสผ่าน
ซูซี่

24

$ .Browser.msieไม่ได้อยู่บน JQuery ล่าสุดอีกต่อไป ... คุณจะต้องใช้$ .support

เช่นด้านล่าง:

 <script>

     (function ($) {
         $.support.placeholder = ('placeholder' in document.createElement('input'));
     })(jQuery);


     //fix for IE7 and IE8
     $(function () {
         if (!$.support.placeholder) {
             $("[placeholder]").focus(function () {
                 if ($(this).val() == $(this).attr("placeholder")) $(this).val("");
             }).blur(function () {
                 if ($(this).val() == "") $(this).val($(this).attr("placeholder"));
             }).blur();

             $("[placeholder]").parents("form").submit(function () {
                 $(this).find('[placeholder]').each(function() {
                     if ($(this).val() == $(this).attr("placeholder")) {
                         $(this).val("");
                     }
                 });
             });
         }
     });
 </script>

2
มันใช้งานได้เหมือนมีเสน่ห์ฉันชอบมันดีกว่าการเพิ่มปลั๊กอินขอบคุณมาก
LemonCool

@vsync ไม่ถ้าคุณอ่านดีๆฉันบอกว่าปลั๊กอินพหูพจน์ตัวเลือกส่วนใหญ่ที่ฉันพบว่าคุณต้องใช้ไฟล์หลายไฟล์มีโค้ดมากมายเทียบกับไม่กี่บรรทัด คุณไม่หยิ่งสักหน่อยและความคิดเห็นนั้นจะช่วยปรับปรุงคำตอบได้อย่างไร
LemonCool

นี่ไม่ควรใช้จริงๆ สิ่งนี้มีไว้สำหรับการใช้งานภายใน jQuery และสามารถลบออกได้ตลอดเวลา api.jquery.com/category/deprecated/deprecated-1.9
จะ

3

ถ้าคุณใช้ jquery คุณสามารถทำได้เช่นนี้ จากไซต์นี้ตัวยึดตำแหน่งกับ Jquery

$('[placeholder]').parents('form').submit(function() {
  $(this).find('[placeholder]').each(function() {
    var input = $(this);
    if (input.val() == input.attr('placeholder')) {
      input.val('');
    }
  })
});

นี่คือลิงค์สำรอง

  1. ไลบรารี jquery ตัวยึดตำแหน่ง
  2. HTML5 polyfills - ไปที่ส่วนตัวยึดตำแหน่ง

3
คำตอบนี้ใช้ได้ แต่คุณต้องไปตามลิงค์เพื่อให้สามารถใช้งานได้อย่างสมบูรณ์ รหัสที่นี่เพียงอย่างเดียวจะไม่ทำงาน
Hawkee

1
ofc มันใช้ไม่ได้นี่คือรหัสเยาะเย้ย! ทำไมคุณผูก "แบบฟอร์ม" เดียวกันซ้ำแล้วซ้ำเล่าสำหรับsubmitเหตุการณ์ เหตุการณ์ที่ส่งเกี่ยวข้องกับอะไรบ้าง
vsync

จะเกิดอะไรขึ้นถ้าฉันพิมพ์ข้อความเดียวกันกับข้อความตัวยึดตำแหน่งใน IE8 ???
Bimal Das

3

ฉันมีปัญหาความเข้ากันได้กับปลั๊กอินหลายตัวที่ฉันลองแล้วดูเหมือนว่าฉันจะเป็นวิธีที่ง่ายที่สุดในการสนับสนุนตัวยึดตำแหน่งบนอินพุตข้อความ:

function placeholders(){
    //On Focus
    $(":text").focus(function(){
        //Check to see if the user has modified the input, if not then remove the placeholder text
        if($(this).val() == $(this).attr("placeholder")){
            $(this).val("");
        }
    });

    //On Blur
    $(":text").blur(function(){
        //Check to see if the use has modified the input, if not then populate the placeholder back into the input
        if( $(this).val() == ""){
            $(this).val($(this).attr("placeholder"));
        }
    });
}

รองรับ IE9 หรือไม่
Viku

2
$(function(){    
    if($.browser.msie && $.browser.version <= 9){
        $("[placeholder]").focus(function(){
            if($(this).val()==$(this).attr("placeholder")) $(this).val("");
        }).blur(function(){
            if($(this).val()=="") $(this).val($(this).attr("placeholder"));
        }).blur();

        $("[placeholder]").parents("form").submit(function() {
            $(this).find('[placeholder]').each(function() {
                if ($(this).val() == $(this).attr("placeholder")) {
                    $(this).val("");
                }
            })
        });
    }
});

ลองดู


1

ฉันใช้อันนี้มันเป็น Javascript เท่านั้น

ฉันแค่มีองค์ประกอบอินพุตที่มีค่าและเมื่อผู้ใช้คลิกที่องค์ประกอบอินพุตมันจะเปลี่ยนเป็นองค์ประกอบอินพุตโดยไม่มีค่า

คุณสามารถเปลี่ยนสีของข้อความโดยใช้ CSS สีของตัวยึดตำแหน่งคือสีใน id #IEinput และสีของข้อความที่คุณพิมพ์จะเป็นสีใน id #email อย่าใช้ getElementsByClassName เนื่องจาก IE เวอร์ชันที่ไม่รองรับตัวยึดตำแหน่งไม่รองรับ getElementsByClassName ด้วยเช่นกัน!

คุณสามารถใช้ตัวยึดตำแหน่งในการป้อนรหัสผ่านโดยตั้งค่าประเภทของการป้อนรหัสผ่านเดิมเป็นข้อความ

Tinker: http://tinker.io/4f7c5/1 - เซิร์ฟเวอร์ JSfiddle หยุดทำงาน!

* ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน

JAVASCRIPT

function removeValue() {
    document.getElementById('mailcontainer')
        .innerHTML = "<input id=\"email\" type=\"text\" name=\"mail\">";
    document.getElementById('email').focus(); }

HTML

<span id="mailcontainer">
    <input id="IEinput" onfocus="removeValue()" type="text" name="mail" value="mail">
</span>

3
ตัวยึดตำแหน่งควรกลับมาหากช่องว่างเปล่าและโฟกัสหายไป
Chris Pratt

1

สำหรับคนอื่น ๆ ที่มาที่นี่ นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

//jquery polyfill for showing place holders in IE9
$('[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('');
        }
    })
});

เพียงเพิ่มสิ่งนี้ในไฟล์ script.js ของคุณ ได้รับความอนุเคราะห์จากhttp://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html


0

เนื่องจากโซลูชันส่วนใหญ่ใช้ jQuery หรือไม่น่าพอใจเท่าที่ฉันต้องการให้เป็นฉันจึงเขียนตัวอย่างสำหรับตัวเองสำหรับ mootools

function fix_placeholder(container){
    if(container == null) container = document.body;

    if(!('placeholder' in document.createElement('input'))){

        var inputs = container.getElements('input');
        Array.each(inputs, function(input){

            var type = input.get('type');

            if(type == 'text' || type == 'password'){

                var placeholder = input.get('placeholder');
                input.set('value', placeholder);
                input.addClass('__placeholder');

                if(!input.hasEvent('focus', placeholder_focus)){
                    input.addEvent('focus', placeholder_focus);
                }

                if(!input.hasEvent('blur', placeholder_blur)){
                    input.addEvent('blur', placeholder_blur);
                }

            }

        });

    }
}

function placeholder_focus(){

    var input = $(this);    

    if(input.get('class').contains('__placeholder') || input.get('value') == ''){
        input.removeClass('__placeholder');
        input.set('value', '');
    }

}

function placeholder_blur(){

    var input = $(this);    

    if(input.get('value') == ''){
        input.addClass('__placeholder');
        input.set('value', input.get('placeholder'));
    }

}

ฉันยอมรับว่ามันดูมากกว่าคนอื่นเล็กน้อย แต่ก็ใช้ได้ดี __placeholderเป็น ccs-class เพื่อทำให้สีของข้อความตัวยึดเป็นแบบแฟนซี

ฉันใช้fix_placeholderในwindow.addEvent ('domready', ...และสำหรับโค้ดที่เพิ่มเพิ่มเติมเช่นป๊อปอัป

หวังว่าคุณจะชอบมัน.

ขอแสดงความนับถือ.




0

เพิ่มรหัสด้านล่างและจะเสร็จสิ้น

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script src="https://code.google.com/p/jquery-placeholder-js/source/browse/trunk/jquery.placeholder.1.3.min.js?r=6"></script>
    <script type="text/javascript">
        // Mock client code for testing purpose
        $(function(){
            // Client should be able to add another change event to the textfield
            $("input[name='input1']").blur(function(){ alert("Custom event triggered."); });    
            // Client should be able to set the field's styles, without affecting place holder
            $("textarea[name='input4']").css("color", "red");

            // Initialize placeholder
            $.Placeholder.init();

            // or try initialize with parameter
            //$.Placeholder.init({ color : 'rgb(255, 255, 0)' });

            // call this before form submit if you are submitting by JS
            //$.Placeholder.cleanBeforeSubmit();
        });
    </script>

ดาวน์โหลดโค้ดฉบับเต็มและการสาธิตจากhttps://code.google.com/p/jquery-placeholder-js/downloads/detail?name=jquery.placeholder.1.3.zip


0

นี่คือฟังก์ชั่น javascript ที่จะสร้างตัวยึดสำหรับ IE 8 และต่ำกว่าและใช้งานได้กับรหัสผ่านด้วย:

/* 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>


-1
    <script>
        if ($.browser.msie) {
            $('input[placeholder]').each(function() {

                var input = $(this);

                $(input).val(input.attr('placeholder'));

                $(input).focus(function() {
                    if (input.val() == input.attr('placeholder')) {
                        input.val('');
                    }
                });

                $(input).blur(function() {
                    if (input.val() == '' || input.val() == input.attr('placeholder')) {
                        input.val(input.attr('placeholder'));
                    }
                });
            });
        }
        ;
    </script>

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