2012-06-08 3 views
1

Я пытаюсь создать поле пользовательских ключевые слова для моего сайта,unnexpected JQuery .last() поведение

Дело в том, у меня есть держатель входного Див, где я добавляемых входы, нажав на кнопку, но я проверить

$('div inputs').last().val().length < 3 

, если его меньше, чем 3 я трясти вход, еще:

$('div inputs').last().after('<input type="text" />') 

Proble м является, что:

$('div inputs').last().val()

возвращает Allways входное значение первый, что я делаю неправильно?

DEMO

ответ

2

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

Определить переменную входы в обратный вызов, и он будет работать:

$('body').on('click','#addkey',function(e){ 
    var inputs = $('#keysInput input'); 

    if(inputs.last().val().length < 3){ 
     $('#keysInput input').last().effect("shake", { times:1, distance: -5 }, 300); 
    }else{ 
     console.log(inputs.last().val()); 
     $('#keysInput input').last().after('<input type="text" placeholder="type another keyword" />');    
    } 
}) 
+0

Ага .. я вижу, он работает, если я выбираю снова, спасибо много –

+0

На самом деле я думаю, что проще просто обновить кеш: input = $ ('# keysInput input'); –

+0

Если вы используете его в других местах, то да. Если нет, я буду придерживаться области функции обратного вызова. –

1

Что-то вроде этого: демоhttp://jsfiddle.net/pVJXM/5/

Поведение: каждый раз, когда вы вводите 3 характер и все больше и хит + нажмите Вам будет получить добавление inout в конце.

Я использовал var inputs = $('#keysInput input:last'); вместо .last() несколько раз :), который сделает трюк для вас.

Надеется, что это помогает,

коду

var cont = $('#keysInput'); 

var addBtn = $('#addKey'); 

$('body').on('keydown','#keysInput',function(e){ 

}); 

$('body').on('click','#addkey',function(e){ 

    var inputs = $('#keysInput input:last'); 

    if(inputs.val().length < 3){ 
     inputs.effect("shake", { times:1, distance: -5 }, 300); 
    }else{ 
     console.log(inputs.last().val()); 
     inputs.after('<input type="text" placeholder="type another keyword" />');    
    } 
}) 




​ 
+0

это работает, потому что вы переместили кеширование внутри функции, вы все равно можете использовать .last() там;) –

+1

@ToniMichelCaubet yep вы могли :)) думал о создании, если минималистический подход к последнему звонку :) cheers –

+0

я вижу это хороший момент, но я думаю, это выглядело так, как будто вы сказали, что .last() не работает. –

0

В начале сценария вы выбрали inputs:

var inputs = $('#keysInput input'); 

После того, что вы используете этот конкретный набор значений, когда сценарий , который не содержит вновь созданных полей. Другими словами: вы работаете на inputs, содержащий только одно поле (начальное).

Решение состоит в том, чтобы просто переустановить значение (список выбранных входов) этой переменной.