События JS: зацепление значения изменяет событие на вводах текста

Я бы сделал это так. Он отлаживаем и не генерирует слишком много кода (memcpy будет оптимизирован из реального кода на любом уровне оптимизации) https://godbolt.org/z/lMShik

Кстати в этом случае небезопасная версия IMO так же безопасна, как и IMO, она нарушает строгие правила псевдонимов.

typedef enum
{
    TYPE_A,
    TYPE_B,
    TYPE_C
}Types;


struct a 
{
    int a;
    int b;
    int c;
    int d;    
};

struct b 
{
    int a;
    int b;
    int c;
};

struct c 
{
    int a;
    int b;
};

void inline __attribute__((always_inline)) Set_a(void *ptr, Types type, int value)
{
    struct a a;
    struct b b;
    struct c c;

    switch(type)
    {
        case TYPE_A:
            memcpy(&a, ptr, sizeof(a));
            a.a = value;
            memcpy(ptr, &a, sizeof(a));
            break;
        case TYPE_B:
            memcpy(&b, ptr, sizeof(b));
            b.a = value;
            memcpy(ptr, &b, sizeof(b));
            break;
        case TYPE_C:
            memcpy(&c, ptr, sizeof(c));
            c.a = value;
            memcpy(ptr, &c, sizeof(c));
            break;
    }
}


void inline __attribute__((always_inline)) Set_a_unsafe(void *ptr, Types type, int value)
{
    struct a a;
    struct b b;
    struct c c;

    switch(type)
    {
        case TYPE_A:
            ((struct a *)ptr) -> a = value;
            break;
        case TYPE_B:
            ((struct b *)ptr) -> a = value;
            break;
        case TYPE_C:
            ((struct c *)ptr) -> a = value;
            break;
    }
}

    struct a x,y;


int main()
{
    Set_a(&x, TYPE_A, 45);
    Set_a_unsafe(&y, TYPE_B, 100);

    printf("%d\n", x.a);
    printf("%d\n", y.a);
}

31
задан Community 23 May 2017 в 12:17
поделиться

5 ответов

Jquery

Использования можно также использовать некоторых они слушатель события поля ввода как

$("yourid").on("change",function(){
//here do something
});
$("yourid").on("keypress",function(){
//here do something
});

$("yourid").on("keydown",function(){
//here do something
});

$("yourid").on("keyup",function(){
//here do something
});
0
ответ дан 27 November 2019 в 22:52
поделиться

Я не могу найти подходящего события для этого.

Да, нет ни одного.

Есть События мутации DOM , но они не не поддерживает кроссбраузерность и в любом случае не запускает значения формы, так как они не отражаются в атрибутах (кроме IE из-за ошибки).

Только в Mozilla, JavaScript watch ] можно установить в свойстве value, чтобы отслеживать изменения по сценарию. Только в IE можно настроить обработчик JScript onpropertychange для перехвата как сценариев, так и пользовательских изменений. В других браузерах вам придется использовать свой собственный интервальный опросчик для поиска изменений.

function watchProperty(obj, name, handler) {
    if ('watch' in obj) {
        obj.watch(name, handler);
    } else if ('onpropertychange' in obj) {
        name= name.toLowerCase();
        obj.onpropertychange= function() {
            if (window.event.propertyName.toLowerCase()===name)
                handler.call(obj);
        };
    } else {
        var o= obj[name];
        setInterval(function() {
            var n= obj[name];
            if (o!==n) {
                o= n;
                handler.call(obj);
            }
        }, 200);
    }
}

watchProperty(document.getElementById('myinput'), 'value', function() {
    alert('changed!');
});

Это крайне неудовлетворительно. Он не будет реагировать на пользовательские изменения в Mozilla, он разрешает только одно отслеживаемое свойство для каждого объекта в IE,

19
ответ дан 27 November 2019 в 22:52
поделиться

Вы можете добавить обычный прослушиватель событий для вашего поля ввода, например. (с использованием jQuery)

$(myTextControl).change(function() {
    ...
    /* do appropriate event handling here */
    ...
});

Хорошо, учитывая, что javascript, который изменяет входное значение, не контролируется вами, это становится трудным. У вас остается два варианта:

1.) Совместимость с кроссбраузером: Реализуйте опрос входного значения с помощью функции, которая постоянно проверяет, изменилось ли значение. (Что-то в этом роде.)

//at beginning before other scripts changes the value create a global variable
var oldValue = myTextControl.value;

function checkIfValueChanged() {
    if(myTextControl.value != oldValue) {
        $(myTextControl).trigger("change");
        clearInterval(checker);
    }
}

//every 500ms check if value changed
var checker = setInterval('checkIfValueChanged()', 500);

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

Если значение может изменяться несколько раз с помощью внешнего сценария, просто позвольте функции интервала запускаться вместо ее отмены и просто обновите oldValue;

2.) AFAIK Еще не поддерживается всеми браузерами (? протестируйте его на тех, которые вам нужно поддерживать )

Вы можете выполнить привязку к специальному событию DOM Level 3Event: DOMAttrModified (в Firefox, может быть, и в других, я думаю, что в Opera это тоже есть, Safari ??,

5
ответ дан 27 November 2019 в 22:52
поделиться
var oldVal = $('#myTextControl').val();

//Your script that changes the value

if(oldVal != $('#myTextControl').val())
{
//Your content has changed, do something
}
-6
ответ дан 27 November 2019 в 22:52
поделиться

Вам нужно будет прослушивать события клавиатуры, когда наблюдаемый вами элемент находится в фокусе.

-10
ответ дан 27 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: