Я работаю над текстовой игрой в стиле браузера (это текстовая игра, в которой используются некоторые изображения/анимации, но текст для передачи истории/действий/команд). Раньше я работал через prompt("What is your class?");
(Warrior, Wizard ETC), но хотел создать свою собственную функцию для этого, чтобы сделать ее красивее. Ниже некоторого кода:
/*
1st value: Message being asked
2nd value: input field being used
3rd value: message block where question is presented
*/
var _cprompt = cPrompt('What is your class?', 'dialog-input', 'dialog-text');
alert(_cprompt);
И это фактическая функция cPrompt();
/*
Custom prompt class
message: The message shown
inputField: The ID of the txtfield where the user inputs his answer
messageField: The textarea where the response appears
userInput: Empty variable to store the users input
*/
function cPrompt(mssg, inputFieldId, messageFieldId) {
var message = mssg;
var inputField = $('#'+inputFieldId);
var messageField = $('#'+messageFieldId);
var userInput = "";
messageField.append(message);
// Detect enter space being pressed in inputField
inputField.keyup(function (e) {
if (e.keyCode == 13) {
userInput = inputField.val();
}
});
}
Пока все хорошо, но мне нужно это, чтобы остановить выполнение другого кода до тех пор, пока пользователь не заполнит ответ и не попал в него (похоже на prompt();
), поэтому в этом случае он не будет выполнять alert(_cprompt);
до тех пор, пока пользователь не внесет какой-либо ввод и не ударит ввод.
Я попытался сделать функцию максимально динамичной, но, пожалуйста, не стесняйтесь добавлять все, что может сделать ее лучше/быстрее/проще в использовании.
Спасибо за вашу помощь.
Использование обратного вызова - отличный способ выполнить действие после возникновения события. В этом случае событием будет "пользователь, заполняющий ответ". Посмотрите рабочий пример здесь http://jsfiddle.net/Q2qUK/2/.
<div id="dialog-text"></div>
<input id="dialog-input" />
В функции cPrompt вы можете запустить функцию обратного вызова, как и любую другую функцию, когда время будет правильным. Вместо того, чтобы возвращать значение, вы передаете результаты в качестве параметра функции обратного вызова.
function cPrompt(mssg, inputFieldId, messageFieldId, callback){
var message = mssg;
var inputField = $('#'+inputFieldId);
var userInput = "";
cNotify(messageFieldId, message);
// Detect enter space being pressed in inputField
inputField.on('keyup', function (e) {
if (e.keyCode == 13) {
userInput = inputField.val();
callback(userInput);
// If you want the callback to only be executed once,
// unbind the keyup event afterwards.
inputField.off('keyup');
// Empty the input field after processing the user message.
inputField.val('');
}
});
}
В качестве примера того, как позволить вашему кодированию отвечать на ввод пользователя, я создал эту функцию cNotify, чтобы показать ввод пользователя в элементе диалога-текста.
function cNotify(messageFieldId, message){
$('#' + messageFieldId).append('<div>' + message + '</div>');
}
Для передачи обратного вызова используйте анонимную функцию в качестве параметра функции cPrompt.
cPrompt('What is your class?', 'dialog-input', 'dialog-text', function(_cprompt){
// Here you put all the code you want to run after the user pressed enter.
cNotify('dialog-text', _cprompt);
});
Использовать обратные вызовы.
function cPrompt(mssg, inputFieldId, messageFieldId, callback) {
var message = mssg;
var inputField = $('#'+inputFieldId);
var messageField = $('#'+messageFieldId);
messageField.append(message);
// Detect enter space being pressed in inputField
inputField.keyup(function (e) {
if (e.keyCode == 13) {
callback(inputField.val());
}
});
}
cPrompt('What is your class?', 'dialog-input', 'dialog-text', function (_cprompt) {
alert(_cprompt);
});