【问题标题】:Custom prompt function not quite finished自定义提示功能未完成
【发布时间】:2014-03-13 20:44:22
【问题描述】:

我正在开发一个基于浏览器的文本风格游戏(这是一个使用一些图像/动画的文本游戏,但使用文本来传达故事/动作/命令)。 我曾经通过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); 直到用户给出了一些输入并按回车键。

我尝试使函数尽可能动态化,但请随意添加任何可能使其更好/更快/更易于使用的内容。

感谢您的帮助。

【问题讨论】:

  • “但我需要它来阻止其他代码执行,直到用户填写响应并按回车键” 这在 javascript 中是不可能的。 你唯一真正的选择是使用回调。您不能有选择地停止部分 javascript。如果你停止一个部分,你就停止了这一切。而且,当您停止这一切时,您也会停止与页面的所有用户交互,从而无法将文本添加到文本输入中。
  • 那么prompt是怎么做的呢?
  • prompt 是内置在浏览器中的,它不是用 javascript 完成的。
  • 您可以阻止用户使用叠加层与页面进行交互,但是您不能阻止 javascript 的执行,除非同时使用户无法使用文本输入。
  • 那么,我必须做些什么才能拥有类似的系统,而不是像提示一样的行为? (文字出现在聊天屏幕,用户输入答案,游戏可能返回响应,代码正常继续)。

标签: javascript jquery html prompt


【解决方案1】:

使用回调是在事件发生后执行操作的好方法。在这种情况下,事件将是“用户填写响应”。在这里查看一个工作示例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's 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);
});

【讨论】:

  • 如果我只想将 cPrompt 的结果保存到变量而不是提醒它,该怎么办?
  • 你可以在匿名回调函数中放入任何你想要的代码。诀窍是在回调函数中从中断处继续,而不是在调用提示函数后立即继续。
  • 我希望它使用起来更简单,就像原来的提示功能一样,只是参数更多。如果项目再增长,它将开始变得非常混乱。
  • 基于回调的编程确实是处理用户交互时要走的路。为了防止你的代码变得混乱,你应该使用函数。
  • 我正在使用函数,这就是我写一个的原因。我只想让我的提示像提示一样,除了使用我自己制作的输入字段和 div 来显示文本。我希望它在代码意义上也像提示一样,只是一个简单的行。
【解决方案2】:

使用回调。

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);
});

【讨论】:

  • 这很好,但由于某种原因,它不断向警报 (_cprompt); 发送垃圾邮件。另外,我不希望它给我 alert(),它只是为了向我显示函数正确返回的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多