Я пытаюсь разработать повторно используемую функцию на основе диалоговой формы jQuery в качестве замены для приглашения JS.Мне нужно, чтобы пользователь вводил данные до того, как будет выполнен другой код JS (следующий запрос AJAX зависит от ввода пользователя).
Функция должна прочитать одно текстовое поле и вернуть введенное значение, если кнопка OK или Return
Мне удалось создать функцию с обратным вызовом, и она работает, за исключением того, что она не ждет реакции пользователя и кода после выполнения функции.
Я понимаючто вызовы jQuery являются асинхронными и пробными версиями с отложенной опцией, но это тоже не сработало.
Есть ли способ заставить мой код ждать ввода пользователя, прежде чем он продолжит выполнение?Конечно, идеальным решением было бы использовать, например, var userInput = getTxtField(....);
Обновление: Функция getTxtField
запускается другими действиями пользователя (кнопками): renameFile, renameFolder, addFile и т. Д.
Обновление # 2 Проблема решена
Благодаря предложению @ SuperPrograman я начал думать с логикой асинхронного выполнения.Исходный код был разработан с использованием подхода value = prompt(...)
, а код AJAX был в нижней части одной функции.Я просто взял код AJAX в отдельной функции, и теперь он работает как положено.Я обновил код JS внизу.
Мой код следующий
....
<div class='hidden' id='dialog-newName' title=''>
<label id='label-txtField' for="txtField"></label>
<input type="text" name="txtField" id="txtField" value="" class="text ui-widget-content ui-corner-all">
</div>
....
function getTxtField (title, label, defVal, callBack) {
$('#label-txtField').text(label);
$('#txtField').val(defVal);
$( '#dialog-newName' ).dialog({
modal: true, closeOnEscape: false,
height: 200, width: 500,
title: title,
buttons: {
OK: function() {
callBack('OK', $('#txtField').val());
$(this).dialog( "close" );
},
Cancel: function() {
$('#txtField').val('');
//callBack('Cancel', ''); // not necessary
$(this).dialog( "close" );
}
},
});
}
...
switch (action) {
case 'action1':
// user pressed button for Action1
console.log('before dialog getTxtField ');
getTxtField('Action1', 'Label1', 'defaultValue1', function(buttonP, result) {
console.log(buttonP + ' value=' + result); // prints OK
});
// executed before input finished
console.log('after dialog getTxtField returnVal=' + newName + ')');
break;
case 'action2':
// ....
break;
}
// proceed with AJAX request for selected action
...
//=========================
// working code
//=========================
$('.selector').click ( function() {
var frmId = $(this).closest('form').attr('id');
var action = $(this).attr('ajaxAction');
var form = $('#theForm')[0];
var ajaxData = new FormData(form);
switch action {
case 'actions that do not require function getTxtField':
ajaxData.append(specific data for the action);
ajaxCall (frmId, ajaxData);
break;
case 'actions that with function getTxtField':
getTxtField('Titlexx', 'Labelxx', 'defaultValuexx', function(buttonP, result) {
// process result
ajaxData.append(specific data for the action);
ajaxCall (frmId, ajaxData);
});
break;
}
})
function ajaxCall (id, data) {
// standard ajax code
}