JQuery - Предотвращение автозаполнения, запускающее размытие()
Я пытаюсь предотвратить размытие, когда выбирается: в автозаполнении вызывается. (select: вызывается, когда элемент нажимается на поле подсказки автозаполнения)
Однако, непреднамеренно, размытие называется, когда я выбираю элемент из окна предложений.
Как я могу исправить эту проблему?
Вот как мой код в основном выровнен.
$("#input_field").autocomplete({
source: "source.php",
select: function( event, ui ) { alert("Item selected! Let not trigger blur!"); }
}).blur(function(event) {
alert("Alert if the user clicked outside the input, pressed enter, or tab button.");
alert("But not from the item selection! :S");
});
Спасибо!
Изменить: Вот краткий контекст. Я пытаюсь разрешить пользователям искать/выбирать элемент или создавать новый элемент, если пользователь размывает ввод.
Ответы
Ответ 1
Виджет пользовательского интерфейса jQuery автозаполнения имеет событие "изменения", которое, я думаю, делает то, что вы хотите. Он вызывается так же, как размытие, за исключением того, что он не вызывается, когда элемент выбирается с помощью мыши.
$("#input_field").autocomplete({
source: "source.php",
select: function( event, ui ) { alert("Item selected! Let not trigger blur!"); }
});
$("#input_field").bind('autocompletechange', function(event, ui) {
alert("Alert if the user clicked outside the input, pressed enter, or tab button.");
alert("But not from the item selection! :S");
});
Ответ 2
Основываясь на том, что я здесь видел, я поставил два образца кода вместе, чтобы создать то, что, как я считаю, является ответом; это было для меня:
$('#txtCatagory').autocomplete({ source: 'handlers/Catagories.ashx', minLength: 2,
change: function (event, ui) {
AddTag(event.srcElement.value);
$('#txtCatagory').val('');
},
select: function (event, ui) {
event.preventDefault();
AddTag(ui.item.value);
$('#txtCatagory').val('');
}
});
Здесь мое текстовое поле:
<asp:TextBox runat="server" ID="txtCatagory" ClientIDMode="Static" OnKeyPress="return disableEnterKey(event)" />
Для меня это то, что я ввожу в текстовое поле, передается функции AddTag или что-то, что я выбираю из автозаполнения jQuery UI. Но критически это не пропускает то, что я набрал, ЕСЛИ я тогда использую автозаполнение, и он очищает поле, готовое для следующего ввода.
Как вы, возможно, догадались по имени функции AddTag, я использую это для пометки сообщений или продуктов, но благодаря сообщениям выше мне теперь удалось добавить автозаполнение этой функции.
Ответ 3
Я не знаю, как избежать onBlur для запуска, но я думаю, что у меня такая же проблема, и я решил это, проверив, открыто ли поле автозаполнения в функции onBlur.
HTML-декларация
<input id="autocompleteTextbox" type="text" onblur="onBlurFunction();"
onkeyup="onKeyUpFunction();" />
Javascript
var autocompleteOpen = false;
var itemSelected = false;
$("#autocompleteTextbox").autocomplete({
source: function(request, response) {
//Set source.
},
select: function(event, ui) {
itemSelected = true;
},
open: function(event, ui) {
autocompleteOpen = true;
},
close: function(event, ui) {
autocompleteOpen = false;
//A selection caused the close. Blur the autocomplete field.
if (itemSelected) {
document.getElementById("autocompleteTextbox").blur();
}
}
});
function onBlurFunction() {
if (!autocompleteOpen) {
//Do stuff.
}
}
function onKeyUpFunction() {
itemSelected = false;
}
Таким образом, код в onBlurFunction() не будет запущен, если автозаполнение открыто. itemSelected используется для проверки того, вводил ли пользователь текст в поле или что-то выбрал из списка автозаполнения. В функции закрытия я размываю поле, если пользователь выбрал что-то из списка. Я не знаю, имеет ли это значение в вашем случае.
Ответ 4
использовать event.stopPropagation();
$("#input_field").autocomplete({
source: "source.php",
select: function( event, ui ) { alert("Item selected! let not trigger blur!"); }
}).blur(function(event) {
event.stopPropagation();
alert("noooooo! blur is still being called!");
});
или вы можете использовать event.preventDefault()
таким же образом...
$("#input_field").autocomplete({
source: "source.php",
select: function( event, ui ) { alert("Item selected! let not trigger blur!"); }
}).blur(function(event) {
event.preventDefault();
});
ссылка event.preventDefault
Ответ 5
Вам может потребоваться более конкретное, но похоже, что вы все еще хотите, чтобы функция blur
вызывалась при размытии, но вы не хотите, чтобы она вызывалась при начальной настройке; попробуйте что-то вроде этого...
$('#input_field').data('ready_to_blur',false)
.blur(function(e) {
if ($(this).data('ready_to_blur'))
return;
$(this).data('ready_to_blur',true);
event.stopPropagationImmediate();
})
.autocomplete({
source: "source.php",
select: function( event, ui ) { alert("Item selected! let not trigger blur!"); }
})
Я также думаю, что вы захотите использовать stopPropagationImmediate
. См. Документы: http://api.jquery.com/event.stopImmediatePropagation/
Ответ 6
очень простое решение для этой проблемы.
обработчик события unbind blur при отображении выпадающего списка,
и связать обработчик события размытия после выбора.
добавление двух событий при инициализации автозаполнения
displaydropdowncallback: function(){ $("#AUTOTEXT").unbind("blur"); },
selectdatacallback: function (data) {
$("#AUTOTEXT").blur(validatepostcode);
}
Изменить исходный код автозаполнения jquery:
добавление кода options.displaydropdowncallback();
под
show: function () {
var offset = $(input).offset();
добавление options.selectdatacallback(selected.data);
под
function selectCurrent() {
var selected = select.selected();
if (!selected)
return false;
Ответ 7
Запускайте событие, когда пользователь размывается из текстового фелда, чтобы показать ему маленький div с шириной 200 пикселей и высотой 100 пикселей с синим цветом фона и с жирным текстом, который сообщает ему, что "он не должен покидать это поле пустой"