2

prompt()出于审美目的,我正在滚动我自己的版本;就视觉效果而言,它的表现非常好,但我遇到了一个小问题:该函数的本机版本导致代码执行完全停止,直到处理了提示。

这非常可爱,这就是为什么下面的工作方式如下:

<script>
    var c = prompt('Name?', '');
    alert(c); // displays whatever the user entered
</script>

然而,用我的方法,事情并没有那么顺利。我正在使用对话框、输入框和OK按钮从用户那里收集数据;据我所知,数据收集工作完美;也就是说,我确定在用户按下OK按钮后,我可以访问他们刚刚放入提示中的数据。

但是,我无法找到一种方法让我的版本像本地版本一样工作。那么,我的问题是:是否有可能告诉 JavaScript 停止执行,直到你告诉它继续执行?

提前感谢您提供的任何和所有帮助。

4

2 回答 2

6

不,不可能复制这种行为。实现相同效果的方法是在代码中使用回调,因此您可以执行以下操作:

myPrompt('Hello, mate, whats yer name?', function(answer) {
   alert(answer);
});

编辑:根据您的代码,为什么不这样做?

<body>
<div id="prompt" style="display: none;">
<input type="text" id="q" /> <input type="button" value="OK" id="ok" />
</div>
<script>
$ = function(i) {return document.getElementById(i);}

_prompt = function(prompt, callback) {
    $('prompt').style.display = '';
    $('q').value = '';
    $('ok').onclick = function() {
        callback($('q').value);
    }
}

_prompt('Name?', function(answer) {
    alert(answer);  
});
</script>
</body>

如果您更改alert(answer);为说... gAnswer = answer;(注意没有var声明),您将创建一个名为的全局变量gAnswer,您可以在 javascript 代码中的任何其他位置访问该变量,假设提示已得到回答。如果您担心全局变量会污染您的空间,则可以将其全部包装在一个闭包中,否则应该没问题。

于 2009-03-23T14:34:38.617 回答
0

@保罗:

这是我目前正在使用的代码:

<body>
<div id="prompt" style="display: none;">
<input type="text" id="q" /> <input type="button" value="OK" id="ok" />
</div>
<script>
$ = function(i) {return document.getElementById(i);}
_prompt = function(q, e)
 {
    $('prompt').style.display = '';
    $('q').value = '';
    $('ok').setAttribute('onclick', e + ' $("prompt").style.display = "none";');
 }
var c; _prompt('Name?', 'c = $("q").value;');
alert(c);
</script>
</body>

现在,正如预期的那样,alert() 会在页面加载后立即触发,这绝对不是我想要的;理想情况下,我希望其余代码等待提示得到处理,但我强烈怀疑这在本机实现之外是否可行。估计我只需要满足于设计我的算法,以便立即使用提示?

于 2009-03-23T15:04:02.183 回答