Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2012, 19:33
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Повесить сеттер на input.value
Подскажите, как вызвать некую функцию не только при вызове события (keydown, select, change...), но и при обычном присваивании элементу формы некоегого значения:
input.value = 'blah'; // ← должна вызываться определенная функция
(на старые браузеры можно забить)

Обычный Object.defineProperty здесь, наверно, не прокатит, так как убивает стандартный геттер и сеттер.

Тот же вопрос интересен и касательно innerHTML.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 28.07.2012 в 19:39.
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2012, 19:38
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

<input id="lala" type="text" />
<script>
    var inp = document.getElementById( 'lala' );
    var descriptor = Object.getOwnPropertyDescriptor( inp, 'value' );
    var oldSetter = descriptor.set;
    descriptor.set = function( value ) {
        alert( "Попытка назначить: " + value );
        oldSetter.apply( this, arguments );
    }
    Object.defineProperty( inp, "value", descriptor );

    inp.value = "test";;
</script>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 28.07.2012, 19:41
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

devote,
Uncaught TypeError: Invalid property.  A property cannot both have accessors and be writable or have a value, #<Object>


Object.getOwnPropertyDescriptor ( ROOT.name.field, 'value' )
 → 
configurable: true
enumerable: true
value: "Jubilee"
writable: true


Тут нет сеттера, как видно.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 28.07.2012 в 19:46.
Ответить с цитированием
  #4 (permalink)  
Старый 28.07.2012, 19:48
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Я так понимаю это хром тупит с первым вариантом.
<input id="lala" type="text" />
<script>
    var inp = document.getElementById( 'lala' );

    Object.defineProperty( inp, "value", {
        configurable: true,
        enumerable: true,
        set: function( value ) {
            alert( "Попытка назначить: " + value );
            this.setAttribute( "value", value );
        },
        get: function() {
            return this.getAttribute( "value" );
        }
    });
 
    inp.value = "test";

    alert( inp.value );
</script>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #5 (permalink)  
Старый 28.07.2012, 19:50
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

devote, хм, как-то не догадался использовать атрибут. Спасибо.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #6 (permalink)  
Старый 28.07.2012, 19:51
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от devote
Я так понимаю это хром тупит с первым вариантом.
Он не тупит, просто дескриптор не содержит акцессоров.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #7 (permalink)  
Старый 28.07.2012, 19:54
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от FINoM
Он не тупит, просто дескриптор не содержит акцессоров.
это я понял, а опера содержит.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2012, 19:57
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

С innerHTML вопрос еще открыт. Здесь никак не заюзаешь атрибут.
Хотя, в принципе, можно погеморроиться: при срабатывании сеттера превращать полученную строку в DOM элементы, затем аппендить в искомый элемент, предварительно удалив каждый тег внутри.
При геттере преобразовывать элементы внутри в строку.
Но это уж слишком геморройно.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности

Последний раз редактировалось FINoM, 28.07.2012 в 20:02.
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2012, 20:18
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Вот она, рыба:
<div>Blah</div>
<span></span>
<script>
var div = document.querySelector( 'div' ),
  span = document.querySelector( 'span' );

div.addEventListener( 'DOMSubtreeModified', function() {
  span.innerHTML = 'fuck yea';
});

div.innerHTML = 'New HTML';
</script>
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #10 (permalink)  
Старый 28.07.2012, 20:18
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от FINoM
Но это уж слишком геморройно.
ну почему геморойно, не так и геморно:

<div id="lala"></div>
<script>
    var div = document.getElementById( 'lala' );
 
    (function( div ) {
        var currentInnerHTML = div.innerHTML;
        Object.defineProperty( div, "innerHTML", {
            configurable: true,
            enumerable: true,
            set: function( value ) {
                alert( "Попытка назначить: " + value );
                var div = document.createElement("DIV");
                div.innerHTML = value;
                currentInnerHTML = div.innerHTML;
                // очищаем от всего что есть сейчас
                while( this.firstChild ) {
                    this.removeChild( this.firstChild );
                }
                // добавляем новое
                while( div.firstChild ) {
                    this.appendChild( div.firstChild );
                }
            },
            get: function() {
                return currentInnerHTML;
            }
        });
    })( div );
  
    div.innerHTML = "<b>test</b> <i>italic</i>";
 
    alert( div.innerHTML );
</script>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повесить событие на изменение DOM nebaz Events/DOM/Window 5 17.06.2012 15:15
повесить событие на массив элементов zlodiak Элементы интерфейса 1 24.02.2012 13:57
Не получается повесить событие wine-time Элементы интерфейса 2 23.07.2011 03:54
Выпадающий калькулятор, помогите... Silentz Общие вопросы Javascript 2 23.01.2010 10:39
Как повесить событие без редактирования файла? bilbas Общие вопросы Javascript 8 11.09.2009 15:17