Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с FireFox'ом, при обращении к HTMLInputElement.value 
:(
    Опции темы
Bikutoru
Дата 24.12.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Здраствуйте. У меня возникла необходимось реализовать "стирание" начального значения поля ввода при получении им фокуса и восстановлении начального значения при потере фокуса (при условии, что значение не было изменено). Реализацию этой задачи я сделал, вот только возникла проблема с FireFox'ом, в котором этот код категорически не хочет работать. Каждый раз возникает следующая ошибка:
Цитата

Error: [Exception... "'Permission denied to get property XULElement.selectedIndex' when calling method: [nsIAutoCompletePopup::selectedIndex]"  nsresult: "0x8057001e (NS_ERROR_XPC_JS_THREW_STRING)"  location: "JS frame :: file:///e:/SHTTP/home-site/public_html/scale/src.html :: inputFocus :: line 44"  data: no]
Source File: file:///e:/SHTTP/home-site/public_html/scale/src.html Line: 44

Причем возникает она при, казалось бы, безобидной операции
Код

        el.value = ""; 

где el - объект HTMLInputElement, в стандарте на который изменяемое свойство value присутвтвует.
В чём проблема я понять не могу. Помогите, пожалуйста. Версия FireFox -1.0.6
Вот код:
Код

<!DOCTYPE html PUBLIC "-//W3C/DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Тест изменения начального значения поля ввода</title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    <script type="text/javascript"language="JavaScript">
    <!--
    /**
     * Определяет принадлежит ли элемент el массиву arr
     */
    function isInArray(el, arr) {
        for (var i = 0; i < arr.length; i++) {
            if (el == arr[i])
                return true;
        }

        return false;
    }

    /**
     * Возвращает объект типа Event
     */
    function getEvent(evt) {
        return (evt) ? evt : (window.event ? window.event : null); 
    }

    /**
     * Возвращает источник возникновения события
     */
    function getEventTarget(evt) {
        return evt.target ? evt.target : 
            (evt.srcElement ? evt.srcElement : null);
    }

    /**
     * Обрабатотчик получения элементом фокуса
     */
    function inputFocus(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;

        el.value = ""; // - FireFox ругается на эту строчку
    }

    /**
     * Обработчик потери элементом фокуса
     */
    function inputBlur(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;
        
        el.value = el.defaultValue;
    }

    /**
     * Обработчик нажатия клавиши
     */
    function inputKeyDown(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;

        newClass = el.getAttribute("onValueChangeClass");
        if (newClass) {
            el.className = newClass;
        }

        inputChange(evt);        
    }

    /**
     * Обработчик изменения значения 
     */
    function inputChange(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;

        el.onfocus   = null;
        el.onblur    = null;
        el.onkeydown = null;
        el.onchange  = null;
    }

    /** 
     * Регистрирует события для всех полей ввода 
     * с установленными аттрибутами hideDefaultValue 
     */
    function prepareDefaultValueHiding() {
        var list = document.getElementsByTagName("INPUT");
        var availableTypes = new Array("text", "password");
        for (var i = 0; i < list.length; i++) {
            var el = list[i];
            if (!isInArray(el.getAttribute("type"), availableTypes) || 
                    (el.getAttribute("hideDefaultValue") != 'on'))
                continue;

            el.onfocus   = inputFocus;
            el.onblur    = inputBlur;
            el.onkeydown = inputKeyDown;
            el.onchange  = inputChange;

            el.value = el.defaultValue;
        }
    }
    //-->
    </script>

    <style type="text/css">
        .def {
            color: #cccccc;
        }

        .cls {
            color: #000000;
        }
    </style>
</head>
<input type="text" class="def" value="Username" hideDefaultValue="on" onValueChangeClass="cls"><br>
<input type="password" value="Password" hideDefaultValue="on"><br><br>
<input type="text" value="Password"><br><br>

<script language="JavaScript">
<!--
    window.onload = prepareDefaultValueHiding;
//-->
</script>
</html>




--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
GIK
Дата 24.12.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 6
Всего: 14



Попробуй
el.getAttribute(value) = "";


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Иль
Дата 24.12.2005, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Придется снеси Винду
...
или сделай
Код

        el.value = "натуральный пробел"; // - FireFox ругается на эту строчку

Работает ! smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 24.12.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



Я хотел сказать сделай не черз defaultValue - может причина в нем. Задай ноде инпута свое JS свойство с твоим значением по умолчанию (или создай атрибут) и бери из него.

Это сообщение отредактировал(а) Иль - 24.12.2005, 22:14


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Bikutoru
Дата 25.12.2005, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Цитата
Я хотел сказать сделай не черз defaultValue - может причина в нем. Задай ноде инпута свое JS свойство с твоим значением по умолчанию (или создай атрибут) и бери из него.

Это был изначальный вариант, с которым была та же проблема.

Цитата(GIK @ 24.12.2005, 18:10)
Попробуй
el.getAttribute(value) = "";

Так getAttribute свего лишь возвращает DOMString со значением аттрибута.
Хотя, взяв эту идею за основу, заменил
Код

el.value = ""; // - FireFox ругается на эту строчку

на
Код

        par = el.getAttributeNode("value"); 
        if (par) {
            par.value = "";
        }

и
Код

        el.value = el.defaultValue;

на
Код

        par = el.getAttributeNode("value");
        if (par) {
            par.value = el.defaultValue;
        }

Но работать лучше от этого не стало. Проблема та же - в IE и Oper'e все нормально, а в FF работать отказывается



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Sardar
Дата 25.12.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



GIK - думай над ответом и проверяй его smile

Bikutoru у меня твой код работает(copy/paste), FireFox 1.5


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 25.12.2005, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



У меням код Bikutoru не работае - FireFox 1.0.5


Bikutoru, замени свою функцию на мою
Код

    function inputChange(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;
alert('Меняй логику кода :) ')
        el.onfocus   = null;
        el.onblur    = null;
        el.onkeydown = null;
        el.onchange  = null;
    }

smile Успехов


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 25.12.2005, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: 2
Всего: 14



В Gecko .onchange срабатывает при смене value через JS, а в IE нет такого поведения.
Убери .onchange вообще и делай через валидацию
Код

if(!el.value)// заметь - это условие сработает только на пустую строку тк в твоем случае оно не null полюбэ
    el.value='Первое значение из HTML'
else{
    el.onfocus=null
    ...
    el.onchange  = null;
}

Добавлено @ 22:06
А вот onload при смене src через JS в ИЕ сработает исправно - Аминь smile (как и в Gecko)
Хотя твоего случая это никак не касается, но надеюсь пригодиться в будую`щем.
Добавлено @ 22:10
Кстати, зачем париться с атрибутами, если ты не парсиш и не носишся со своим инпутом по дереву нод smile ?
Может это тебя больше устроит, правильный ты наш Bikutoru
Код

    function inputFocus(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;
     if(!el.zzz)el.zzz=el.value
        el.value = "";
    }

    /**
     * Обработчик потери элементом фокуса
     */
    function inputBlur(evt) {
        evt = getEvent(evt);
        el  = getEventTarget(evt);
        if (!evt || !el)
            return;
        
        el.value = el.zzz;
    }



--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.