Использование меток, таких как заполнитель HTML5


Я пытаюсь использовать элементы <label> в моей контактной форме html, такие как атрибут-заполнитель HTML5 для ввода. Я написал следующий JavaScript, чтобы действовать как многоразовая функция, которая обеспечит следующие функции.

  1. Найдите вход по имени.
  2. Получите значение ввода.
  3. Найдите метку, принадлежащую входу.
  4. Измените стиль метки в зависимости от состояния ввода.
  5. Измените стиль метки в зависимости от значения ввода.

Однако он не работает, и я не знаю, почему в консоли не появляются ошибки. Что я делаю не так? вот JS Fiddle с кодом

function placeholder(field_name) {

    // Get the input box with field_name 
    // Then get input value
    var box = document.getElementsByName(field_name);
    var i;
    for (i = 0; i < box.length; i++) {
        var value = document.getElementById(box[i].value);
    }

    // Get the labels belonging to each box using the HTML for attribute
    var labels = document.getElementsByTagName('LABEL');
    for (i = 0; i < labels.length; i++) {
        if (labels[i].htmlFor !== '') {
            var elem = document.getElementById(labels[i].htmlFor);
            if (elem) {
                box.label = labels[i];
            }
        }
    }

    // Colors
    var focusColor = "#D5D5D5";
    var blurColor = "#B3B3B3";

    // If no text is in the box then show the label grey color
    box.onblur = function () { 
        box.label.style.color = blurColor; 
    };

    // If input focuses change label color to light grey
    box.onfocus = function () { 
        box.label.style.color = focusColor; 
    };

    // If there is text in the box then hide the label
    if (box.value !== "") {
        // Quick do something, hide!
        box.label.style.color = "transparent";
    }
}

// Call the function passing field names as parameters
placeholder(document.getElementsByName("email"));
placeholder(document.getElementsByName("firstName"));
placeholder(document.getElementsByName("lastName"));

person Aron    schedule 26.02.2013    source источник
comment
Теперь, как вы сравниваете label и placeholders?   -  person Mr. Alien    schedule 26.02.2013
comment
var box = document.getElementsByName(field_name); - box - это NodeList. if (elem) box.label = labels[i]; Установка нового свойства label в NodeList. Кроме того, var внутри циклов меня огорчает.   -  person Paul S.    schedule 26.02.2013
comment
@ПолС. Что именно он здесь делает? он извлекает значения заполнителей, но для чего? placeholder(document.getElementsByName("email"));   -  person Mr. Alien    schedule 26.02.2013
comment
вы вставляете массивы в простые переменные, как вы ожидаете, что это будет работать?   -  person Toping    schedule 26.02.2013
comment
@Mr.Alien Похоже, он хочет навсегда изменить <label> на visibility: hidden;, если значение элемента, на который ссылается его for, не равно "" при вызове placeholder.   -  person Paul S.    schedule 26.02.2013
comment
@ПолС. бог его знает, а он не отвечает   -  person Mr. Alien    schedule 26.02.2013
comment
@Mr.Alien извините за поздний ответ, новичок в этом :)   -  person Aron    schedule 26.02.2013
comment
Если не понятно что я пытаюсь сделать вот список: 1. Найдите вход по имени. 2. Получите значение ввода. 3. Найдите метку, принадлежащую входу. 4. Измените стиль метки в зависимости от состояния входа. 5. Измените стиль метки в зависимости от значения ввода.   -  person Aron    schedule 26.02.2013


Ответы (2)


Это может показаться немного излишним для количества прослушивателей, которые я использовал, не стесняйтесь удалять все, что вы считаете ненужным, но я пытался использовать вашу HTML-структуру в том виде, в каком она у вас есть, и дать вам все желаемые эффекты. Он должен работать либо для <label>s for, совпадающего с <input>s id, либо для его <name> (при отсутствии совпадений id). Я всегда говорю, что лучше использовать идентификатор, чем имя. Я считаю, что этот JavaScript также должен работать во всех браузерах, кроме addEventListener, для которого вам понадобится прокладка для старых версий IE (дайте мне знать, если это не так в одном из сообщений об ошибке) .

Демо

var focusColor = "#D5D5D5", blurColor = "#B3B3B3";
function placeholder(fieldName) {
    var named = document.getElementsByName(fieldName), i;
    for (i = 0; i < named.length; ++i) { // loop over all elements with this name
        (function (n) { // catch in scope
            var labels = [], tmp, j, fn, focus, blur;
            if ('labels' in n && n.labels.length > 0) labels = n.labels; // if labels provided by browser use it
            else { // get labels from form, filter to ones we want
                tmp = n.form.getElementsByTagName('label');
                for (j = 0;j < tmp.length; ++j) {
                    if (tmp[j].htmlFor === fieldName) {
                        labels.push(tmp[j]);
                    }
                }
            }
            for (j = 0; j < labels.length; ++j) { // loop over each label
                (function (label) { // catch label in scope
                    fn = function () {
                        if (this.value === '') {
                            label.style.visibility = 'visible';
                        } else {
                            label.style.visibility = 'hidden';
                        }
                    };
                    focus = function () {
                        label.style.color = focusColor;
                    };
                    blur = function () {
                        label.style.color = blurColor;
                    };
                }(labels[j]));
                n.addEventListener('click', fn); // add to relevant listeners
                n.addEventListener('keydown', fn);
                n.addEventListener('keypress', fn);
                n.addEventListener('keyup', fn);
                n.addEventListener('focus', fn);
                n.addEventListener('focus', focus);
                n.addEventListener('blur', fn);
                n.addEventListener('blur', blur);
            }
        }(named[i]));
    }
};
placeholder("email"); // just pass the name attribute
placeholder("firstName");
placeholder("lastName");
person Paul S.    schedule 26.02.2013
comment
Это круто! Я пытался решить эту проблему в течение последней недели. Он работает во всех браузерах, которые мне нужны, и в IE9. Спасибо за вашу работу. - person Aron; 26.02.2013
comment
Просто имейте в виду, что этот метод создает 3 функции на <label> на <input> с этим именем, поэтому, если у вас много форм, в которых есть <input> с совпадающим именем, каждая с метками и т. д., вы можете получить множество различных функций. - person Paul S.; 26.02.2013

http://jsfiddle.net/cCxjk/5/

var inputs = document.getElementsByTagName('input');
var old_ele = '';
var old_label ='';
function hide_label(ele){
    var id_of_input = ele.target.id;
    var label = document.getElementById(id_of_input + '-placeholder');

    if(ele.target == document.activeElement){
        label.style.display = 'none';    
    }
    if (old_ele.value == '' && old_ele != document.activeElement){
        old_label.style.display = 'inline';
    }
    old_ele = ele.target;
    old_label = label;
    }

for(var i = 0; i < inputs.length; i++){
    inputs[i].addEventListener('click', hide_label);
}

Я укажу на пару вещей, вам нужно будет выяснить тот факт, что label находится внутри input, поэтому пользователи теперь не могут щелкнуть половину input и фактически получить input усиление focus.

Также я предполагаю, что вы хотите сделать это в IE (в противном случае я настоятельно рекомендую использовать заполнитель html5!), что означает, что вам нужно будет изменить ele.target на ele.srcElement.

person Ryan    schedule 26.02.2013
comment
О, спасибо, @ryan, это отличный способ получить ярлык. Блестящий. Я не осознавал, что уже установил идентификатор ярлыков таким образом. :) - person Aron; 26.02.2013