2016-03-09 4 views
-2

У меня есть диапазон и поле ввода, а когда поле ввода пуст, мне нужно, чтобы он говорил «Пусто». Когда я вводю какой-либо текст в поле, диапазон автоматически добавит буквы/цифры в диапазон. Если значение входных данных будет удалено, диапазон снова скажет «Пусто».Может ли кто-нибудь помочь мне сделать этот скрипт проще?

if($.trim($('#input').val()) == ''){ 
    $('#span').html('Empty'); 
} 
$('#input').bind("change keyup input",function() { 
    $('#span').html($(this).val()); 
    if($.trim($('#input').val()) == ''){ 
     $('#span').html('Empty'); 
    } 
}); 

Я думаю, что это может быть реализовано более простым способом и, надеюсь, внутри одной функции. Это возможно?

+1

Не уменьшилось, но, думаю, http://codereview.stackexchange.com/ является более подходящим в этом случае. – lex82

ответ

2

Он прост: установить HTML в #span элемента с функцией, а также выполнять функции как во время выполнения, и во время определенных событий, связанных с #input поля. Я рекомендую использовать .on() вместо .bind():

// Define function that sets html value 
 
var updateSpan = function() { 
 
    var v = $.trim($(this).val()); 
 
    if(v === '') { 
 
    $('#span').html('Empty'); 
 
    } else { 
 
    $('#span').html(v); 
 
    } 
 
} 
 

 
// Execute function at runtime 
 
// We use .call() so that `this` in the function refers to our input 
 
updateSpan.call($('#input')[0]); 
 

 
// Bind the function as a callback during these events, too 
 
// The element is automatically passed as `this` 
 
$('#input').on('change keyup input', updateSpan);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="input" /> 
 
<span id="span"></span>

Если вы действительно любите запутанный код, вы можете даже сократить if заявления в этом:

var updateSpan = function() { 
    var v = $.trim($(this).val()); 
    $('#span').html(v === '' ? 'Empty' : v); 
} 
+0

Хотя он занимает гораздо больше места, чем мои 4 строки, я думаю, что это легче понять. Это было бы прекрасно с условием '$ (this) .val(). Trim() == ''' – lex82

+1

Если вы уклоните свой JS, все можно сделать одной строкой;) – Terry

0
$('#input').on("change keyup input",function() { 
    if($.trim($('#input').val()) == ''){ 
     $('#span').html('Empty'); 
    } else { 
     $('#span').html($(this).val()); 
    } 
}); 
+0

Когда вы копируете и вставляете с помощью мыши, могут быть события изменения, не связанные с клавиатурой. – lex82

+0

@ lex82 Хорошо, давайте оставим это как есть. –

+0

Вам не хватает, чтобы интервал был инициализирован. Событие должно запускаться один раз. См. Мой ответ. – lex82

0

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

Вы можете заменить .bind на .on и триггеры на «клавиатуру».

После того, как вы создали функцию, вы можете вызвать ее, включив один из триггеров, все еще используя тот же селектор.

Вроде так;

$('#input').on('keyup', function(){ 
    text = $(this).val().trim(); 
    if(text == ''){ 
     $('#span').html('Empty'); 
    } else { 
     $('#span').html(text); 
    } 
}).trigger('keyup'); 

Или вы можете определить функцию типа;

$.fn.emptyCheck = function(){ 
     return (this.val().trim() != ''); 
} 

или

$.fn.emptyCheck = function(){ 
    text = this.val().trim(); 
    if(text == ''){ 
     $('#selector').html('Empty'); 
    } else { 
     $('#selector').html(text); 
} 

затем вызвать его с помощью

$('input').on('keyup', function(){ 
     if($(this).emptyCheck()){ 
      /* your function */ 
     } 
}); 

или

$('input').on('keyup', function(){ 
    $(this).emptyCheck(); 
} 

соответственно.

+0

Вы забыли обновить диапазон, когда вход не пусто. – lex82

+0

Спасибо, обновлено – Webber

0

Это должно сделать трюк:

$('#input') 
    .bind("change keyup input", function() { 
     updateSpan($(this).val()); 
    }) 
    .trigger('keyup'); 

function updateSpan(s) { 
    $('#span').html(s.trim() == '' ? 'Empty' : s); 
} 

Окончательный .keyUp() убеждается событие запускается один раз, поэтому продолжительность инициализации.

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

Смежные вопросы