обнаруживать ввод данных при нажатии и размытии, а также передавать значения в функцию с использованием ненавязчивого JavaScript - PullRequest
0 голосов
/ 24 декабря 2010

У меня проблема с проверкой того, какие входы были нажаты с использованием необструктивного JavaScript.Я знаю способ передачи значения из функции, непосредственно записав его во входной тег, но я хотел бы знать, как мы можем передать значение из файла javascript.На данный момент добавление события к объекту является только вызовом функции, но не может отправить любое значение

Ниже приведен html

    <input id="searchfield" name="searchfield" type="text" value="Your e-mail address" />
<br />
<input id="searchfield2" name="searchfield2" type="text" value="Your password" />

и js-код для того же, я надеюсь, что вы мне поможете.

// JavaScript Document
    function removeTextWhenClicked(chk)
    {
        if(chk == 1)
        {
            document.getElementById("searchfield").value = "";
        }
        else if(chk == 2)
        {
            document.getElementById("searchfield2").value = "";
        }
    }
    function removeTextWhenBlur(chk)
    {

        if(chk == 1)
        {
            if(document.getElementById("searchfield").value == "")
            {
                document.getElementById("searchfield").value = "please enter username";
            }
            else
            {
                document.getElementById("searchfield").style.color = "#333333";
            }
        }
        else if(chk == 2)
        {
            if(document.getElementById("searchfield2").value == "")
            {
                document.getElementById("searchfield2").value = "please enter password";
            }
            else
            {
                document.getElementById("searchfield2").style.color = "#333333";
            }
        }
    }
    window.onload = function(){

    document.getElementById("searchfield").onclick = removeTextWhenClicked;
    document.getElementById("searchfield").onblur = removeTextWhenBlur;
    document.getElementById("searchfield2").onclick = removeTextWhenClicked;
    document.getElementById("searchfield2").onblur = removeTextWhenBlur;
    }

Спасибо и С уважением, Сагар

Ответы [ 3 ]

2 голосов
/ 24 декабря 2010

Ответ на вопрос, который вы фактически задали, заключается в том, что вы можете сделать это, встроив данные в замыкание, а затем использовать замыкание в качестве своего обработчика:

document.getElementById("searchfield").onclick = buildHandler(removeTextWhenClicked, 1);
document.getElementById("searchfield2").onclick = buildHandler(removeTextWhenClicked, 2);

... где buildHandler выглядит так:

function buildHandler(callback, arg) {
    return function() {
        return callback(arg);
    };
}

Подробнее о замыканиях здесь , это очень мощный и полезный инструмент в JavaScript.

Однако в вашем конкретном случае вам не нужно этого делать, потому что единственная информация, которую вы передавали в функцию, была средством определения того, с каким элементом вы имеете дело, и у вас это уже есть: this. В обработчике событий this будет указывать на элемент, для которого вы устанавливаете обработчик. Так, например, removeTextWhenClicked может быть:

function removeTextWhenClicked()
{
    this.value = "";
}

... и, поскольку вам не нужно было привязывать к этому какие-либо данные, вы все равно можете использовать их напрямую, как и изначально.

Ваши обработчики blur отличаются друг от друга, поэтому вам может потребоваться привязать к ним данные. Кроме того, вы можете сделать все это на основе разметки:

<input id="searchfield" name="searchfield" type="text" data-msg="please enter username" value="Your e-mail address" />
<br />
<input id="searchfield2" name="searchfield2" type="text" data-msg="please enter password" value="Your password" />

Обратите внимание на новые атрибуты data-img. Теперь ваш removeTextWhenBlur становится:

function removeTextWhenBlur()
{
    if (this.value == "")
    {
        this.value = this.getAttribute("data-msg");
    }
    else
    {
        this.style.color = "#333333";
    }
}

Настраиваемые атрибуты, такие как data-msg, являются недействительными в HTML4 и более ранних версиях (хотя я никогда не видел браузер, который их запрещал), поэтому разметка не будет проверяться с помощью инструментов проверки . Начиная с HTML5, пользовательские атрибуты, начинающиеся с data-, являются действительными. Таким образом, вы можете пойти дальше и использовать их сейчас, если вы не используете валидацию как часть процесса разработки [валидация - это хорошо (tm)] или если вы используете тип документа HTML5.

Теперь, атрибуты могут быть вам не подходящими. Они могут быть очень полезны в больших командах, где люди, делающие разметку, отличаются от людей, делающих код, и поэтому важно сохранять четкое разделение вещей. Другой подход, однако, будет отображать сообщения на элементы по их идентификатору. Используя исходную разметку, эти функции могут работать следующим образом:

var placeholders = {
    "searchfield":  "please enter username",
    "searchfield2": "please enter password"
};

function removeTextWhenClicked()
{
    this.value = "";
}
function removeTextWhenBlur()
{
    if (this.value == "")
    {
        this.value = placeholders[this.id];
    }
    else
    {
        this.style.color = "#333333";
    }
}

Не по теме # 1 :

Я бы, наверное, изменил removeTextWhenClicked на:

function removeTextWhenClicked()
{
    if (this.value == placeholders[this.id])
    {
        this.value = "";
    }
    this.style.color = ''; // In case we colored it earlier
}

Не по теме # 2 :

Стоит использовать библиотеку JavaScript, такую ​​как jQuery , Прототип , YUI , Закрытие или любой из нескольких другие . Они сглаживают различия между реализациями браузера, предоставляют полезные служебные функции и, как правило, экономят вам больше времени, чем они потребляют.

Не по теме # 3 :

Используемый вами метод присвоения обработчика, присваивания свойству onclick и так далее, называется методом "DOM0". Это довольно старомодно и ограничительно. Стоит взглянуть на более новый «DOM2» способ сделать это, который addEventListener, хотя к сожалению это attachEvent в IE. (Любая библиотека JavaScript предоставит оболочку для решения этой проблемы.) Одним из преимуществ обработчиков DOM2 является то, что для одного и того же события в одном и том же элементе может быть установлено более одного обработчика, тогда как с помощью механизма DOM0 назначается новый обработчик дубинок (удаляется ) любой предыдущий.

0 голосов
/ 24 декабря 2010

Вы можете обернуть вызовы функции в анонимную функцию, как указано ниже:

window.onload = function(){

    document.getElementById("searchfield").onclick = function(){removeTextWhenClicked(1);};
    document.getElementById("searchfield").onblur =  function(){removeTextWhenBlur(1);};
    document.getElementById("searchfield2").onclick =  function(){removeTextWhenClicked(2);};
    document.getElementById("searchfield2").onblur =  function(){removeTextWhenBlur(2);};
    }
0 голосов
/ 24 декабря 2010

Объект, связанный с вызываемой функцией, будет присвоен ключевому слову this.Попробуйте:

function removeTextWhenBlur(chk)
{
    alert(this.id);
...

С Рождеством!

...