Событие текстового поля JavaScript

Это не имеет ничего общего со старым или новым проектом, а скорее является фактором используемого вами SDK. Проблема, с которой вы сталкиваетесь, заключается в том, что, хотя это функция компилятора, она требует поддержки SDK. IOS 5 SDK не обеспечивает такую ​​поддержку, хотя iOS 6 SDK делает.

По этой причине, теперь вы должны просто использовать iOS 6 SDK. Читайте дальше, если вы хотите использовать подписку на объекты с помощью iOS 5 SDK.

Все, что вам нужно сделать, это добавить файл заголовка, чтобы компилятор попытался выполнить вызов. Нет необходимости добавлять реализацию; он обрабатывается автоматически arclite. (Если вы не используете ARC, вам нужно будет заставить компоновщик включить arclite. Но вам все равно не нужно фактически переключаться на него.)

Создайте новый файл интерфейса, NSObject + subscripts.h .

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSDictionary(subscripts)
- (id)objectForKeyedSubscript:(id)key;
@end

@interface NSMutableDictionary(subscripts)
- (void)setObject:(id)obj forKeyedSubscript:(id )key;
@end

@interface NSArray(subscripts)
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
@end

@interface NSMutableArray(subscripts)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
#endif

Я положил этот кусок на Github .

Примечание: раньше я предлагал добавить требуемые методы в NSObject, прежде чем объяснять, как добавлять их только к соответствующим объектам. Оглядываясь назад, я считаю, что это была ошибка с моей стороны; это приводило к ошибкам, обнаруживаемым во время выполнения, а не во время компиляции, в отличие от подхода, представленного здесь. Этот подход все еще есть в моем блоге , но теперь я считаю, что это скорее крутой взлом, чем полезный подход.

Источник:

6
задан cgp 16 June 2009 в 11:58
поделиться

2 ответа

Вот решение, которое периодически опрашивает элемент на предмет любых изменений

<script type="text/javascript">

var changeWatcher = {
    timeout: null,
    currentValue: '',
    watchForChange: function( el ) {
        if( el.value != this.currentValue ) {
            this.changed( el );
        }
        this.timeout = setTimeout( function() {
             changeWatcher.watchForChange(el)
        }, 200 );
    },
    cancelWatchForChange: function() {
        clearTimeout( this.timeout );
        this.timeout = null;
    },
    changed: function( el ) {
        this.currentValue = el.value;
        // do something with the element and/or it's value
        //console.log( el.value );
    }
}

</script>
<input type='text' value='abc' onfocus='changeWatcher.watchForChange(this)' onblur='changeWatcher.cancelWatchForChange()' onchange='changeWatcher.changed(this)' />
3
ответ дан 8 December 2019 в 17:26
поделиться

используйте onchange вместо onkeyup в этом случае

см .: http://www.w3schools.com/jsref/ event_onchange.asp

например

<input type='text' value='abc' onchange='changeSomething(this);' />

, чтобы обойти это

ИЗМЕНИТЬ Две вещи:
1) Значения автозаполнения можно выбрать с помощью клавиш со стрелками и ввода / табуляции, а также с помощью мыши. Клавиши со стрелками / enter.tab запускают события onkeyup ... однако щелчок в поле автозаполнения не запускает событие onclick.
2) Событие onchange срабатывает при потере фокуса, ЕСЛИ содержимое изменилось. Фокус не теряется при выборе значений автозаполнения.

По сути, похоже, нет никакого способа разумно гарантировать, что событие будет обработано так, как вы хотите.

Во-первых, вам действительно нужно прислушиваться к каждому нажатию клавиши? Во-вторых, не стоит ли вам отключать автозаполнение? (например, )

11
ответ дан 8 December 2019 в 17:26
поделиться
Другие вопросы по тегам:

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