Cách hỗ trợ thuộc tính giữ chỗ trong IE8 và 9


132

Tôi có một vấn đề nhỏ, placeholderthuộc tính cho các hộp đầu vào không được hỗ trợ trong IE 8-9.

Cách tốt nhất để thực hiện hỗ trợ này trong dự án của tôi (ASP Net) là gì. Tôi đang sử dụng jQuery. Tôi cần sử dụng một số công cụ bên ngoài khác cho nó?

http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html là một giải pháp tốt?


7
Góc của Pedant: đó là một thuộc tính, không phải là một thẻ. Một thẻ có dấu ngoặc nhọn xung quanh nó (như <input>); một thuộc tính là một cặp khóa-giá trị bên trong dấu ngoặc nhọn (như placeholder="This is an attribute value"). Để lại câu hỏi như vậy, để những người tương lai hỏi cùng một câu hỏi có thể tìm thấy nó.
Paul D. Chờ

2
Liên kết đó không hoạt động như vốn có. Tôi đã xóa các trích dẫn thêm xung quanh bộ chọn $ ("[giữ chỗ]") và nó vẫn ổn.
claptimes

1
Giải pháp trong liên kết đó cũng không xử lý các hộp mật khẩu theo hỗ trợ riêng trong webkit
geedubb

1
Liên kết mà bạn đã cung cấp thực sự hoạt động rất tốt - ngoài mật khẩu, nó hoạt động một cách xử lý và không thể đơn giản hơn để thiết lập
hobailey

1
liên kết là một sửa chữa tuyệt vời
Pixelomo

Câu trả lời:


89

Bạn có thể sử dụng plugin jQuery này: https://github.com/mathiasbynens/jquery-placeholder

Nhưng liên kết của bạn dường như cũng là một giải pháp tốt.


2
Liên kết được đề xuất trong câu hỏi không hoạt động với tôi; nó có vấn đề với hình thức gửi. Giải pháp bạn đã đề xuất trong câu trả lời này có vẻ mạnh mẽ hơn rất nhiều và đã có tác dụng.
Jonny White

Trên thực tế tôi đã thử cái này và hoạt động tốt - nhưng ngay khi tôi đang tải một hộp đèn với một biểu mẫu và trường mật khẩu, mọi thứ đều hoạt động nhưng không phải là trường mật khẩu - nó chỉ trống.
Jurik

6
trong trình giữ chỗ mật khẩu IE8 của tôi có dấu chấm
Mladen Janjetovic

Tôi cũng không thể nhìn thấy nó trong eg8. Tôi đã làm việc xung quanh nó bằng cách chỉ có một số văn bản hiển thị trên các trường khi trong eg8.
jhawes

jQuery giữ chỗ hành xử khác nhau. Nó loại bỏ trình giữ chỗ trên tiêu điểm thay vì khi người dùng bắt đầu nhập nội dung nào đó trên trường như hành vi thông thường trong Firefox đối với trình giữ chỗ.
supertonsky

89

Bạn có thể sử dụng bất kỳ một trong những polyfill này:

Các tập lệnh này sẽ thêm hỗ trợ cho placeholderthuộc tính trong các trình duyệt không hỗ trợ nó và chúng không yêu cầu jQuery!


4
Tôi ủng hộ điều này bởi vì tôi thích ý tưởng về một giải pháp không phải là jquery, nhưng ngay bây giờ mã này có vấn đề trong IE8 nên nó không phù hợp với tôi. github.com/jamesallardice/Placeholder.js/issues/17
Dan Searle

3
Giải pháp này không xử lý các hộp mật khẩu
Jurik

2
@Jurik Tôi đã thêm một polyfill bổ sung - Tôi hy vọng nó có ích.
starbeamrainbowlabs

1
Ngay cả nhà phân phối của plugin này cũng nói rằng plugin này không xử lý các trường mật khẩu trong <IE9 github.com/jamesallardice/Placeholder.js/issues/,
Jurik

Trường mật khẩu vẫn không hoạt động trong iE8. Liên kết câu trả lời được chấp nhận dường như hoạt động trong eg8 cho trường mật khẩu.
Susie

24

các $ .Browser.msie không nằm trong JQuery mới nhất nữa ... bạn phải sử dụng $ .Hỗ trợ

như dưới đây:

 <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
Điều này hoạt động như một cơ duyên, tôi thích nó hơn là bổ sung, cảm ơn rất nhiều
LemonCool

@vsync không nếu bạn đọc tốt Tôi đã nói các plugin, số nhiều, hầu hết các tùy chọn tôi thấy bạn cần sử dụng nhiều tệp, với hàng tấn mã, so với vài dòng. không phải bạn hơi kiêu ngạo, và cách nhận xét đó cải thiện câu trả lời
LemonCool

Điều này thực sự không nên được sử dụng. Đây là để sử dụng nội bộ jQuery và có thể được gỡ bỏ bất cứ lúc nào. api.jquery.com/carget/deprecated/deprecated-1.9
Sẽ

3

nếu bạn sử dụng jquery bạn có thể làm như thế này. từ trang này Placeholder với Jquery

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

đây là những liên kết thay thế

  1. Thư viện jquery giữ chỗ
  2. Các polyfill HTML5 - dành cho phần giữ chỗ

3
Câu trả lời này hoạt động, nhưng bạn cần theo liên kết để có chức năng hoàn chỉnh. Mã ở đây một mình sẽ không hoạt động.
Hawkee

1
Tất nhiên là nó không hoạt động, đây là một mã lố bịch! Tại sao bạn liên kết một lần nữa và cùng một "hình thức" cho submitsự kiện này? sự kiện gửi phải làm gì với bất cứ điều gì
vsync

Điều gì sẽ xảy ra, nếu tôi nhập cùng một văn bản như trong văn bản giữ chỗ trong IE8 ???
Bimal Das

3

Tôi đã gặp sự cố tương thích với một số plugin tôi đã thử, đây dường như là cách đơn giản nhất để hỗ trợ giữ chỗ trên các kiểu nhập văn bản:

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

nó có hỗ trợ cho IE9 không?
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("");
                }
            })
        });
    }
});

thử cái này


1

Tôi sử dụng cái này, nó chỉ là Javascript.

Tôi chỉ đơn giản là có một phần tử đầu vào có giá trị và khi người dùng nhấp vào phần tử đầu vào, nó sẽ thay đổi thành phần tử đầu vào không có giá trị.

Bạn có thể dễ dàng thay đổi màu sắc của văn bản bằng CSS. Màu của trình giữ chỗ là màu trong id #IEinput và màu văn bản bạn nhập sẽ là màu trong id #email. Không sử dụng getElementsByClassName, vì các phiên bản IE không hỗ trợ trình giữ chỗ, cũng không hỗ trợ getElementsByClassName!

Bạn có thể sử dụng trình giữ chỗ trong nhập mật khẩu bằng cách đặt loại nhập mật khẩu gốc thành văn bản.

Tinker: http://tinker.io/4f7c5/1 - Máy chủ JSfiddle ngừng hoạt động!

*Xin lỗi vì tiếng Anh của tôi không tốt

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
Giữ chỗ sẽ quay lại nếu trường trống và mất tiêu điểm
Chris Pratt

1

Đối với những người khác hạ cánh ở đây. Đây là những gì làm việc cho tôi:

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

Chỉ cần thêm nó trong tập tin script.js của bạn. Được phép của http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html


0

Vì hầu hết các giải pháp đều sử dụng jQuery hoặc điều này không thỏa mãn như tôi mong muốn, nên tôi đã viết một đoạn trích cho chính mình cho 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'));
    }

}

Tôi thú nhận rằng nó trông THÊM hơn một chút so với những người khác nhưng nó hoạt động tốt. __placeholder là một lớp ccs để làm cho màu sắc của văn bản giữ chỗ trở nên lạ mắt.

Tôi đã sử dụng fix_placeholder trong window.addEvent (' dom yet ', ... và cho bất kỳ mã được thêm vào như cửa sổ bật lên.

Hy vọng bạn thích nó.

Trân trọng.



0
<input type="text" name="Name" value="Name" onfocus="this.value = ''" onblur=" if(this.value = '') { value = 'Name'}" />

0

Thêm mã dưới đây và nó sẽ được thực hiện.

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

Tải xuống toàn bộ mã và bản demo từ https://code.google.com.vn/p/jquery-placeholder-js/doads/detail?name=jquery.placeholder.1.3.zip


0

Đây là một chức năng javascript sẽ tạo giữ chỗ cho IE 8 trở xuống và nó cũng hoạt động với mật khẩu:

/* 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 không còn được hỗ trợ. Hãy thử sử dụng tính năng phát hiện thay thế.
mời
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.