Возможно ли продублировать нативное поведение подсказки JavaScript ()? - PullRequest
2 голосов
/ 23 марта 2009

Я использую свою собственную версию prompt () для эстетических целей; он довольно хорошо подходит для визуальных элементов, но я столкнулся с небольшим затруднением: нативная версия функции приводит к тому, что выполнение кода полностью прекращается до тех пор, пока приглашение не будет обработано.

Это очень мило, и вот почему ниже работает так, как работает:

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

Однако при моем методе дела идут не так гладко. Я использую диалоговое окно, поле ввода и кнопку «ОК» для сбора данных от пользователя; насколько мне известно, сбор данных работает отлично; то есть я точно знаю, что после того, как пользователь нажмет кнопку «ОК», у меня будет доступ к данным, которые они только что добавили в подсказку.

Однако я не могу найти способ заставить мою версию работать так, как работает нативная. Поэтому мой вопрос таков: возможно ли вообще заставить JavaScript прекратить выполнение, пока вы не попросите его возобновить?

Заранее благодарим за любую помощь.

Ответы [ 2 ]

6 голосов
/ 23 марта 2009

Нет, дублировать это поведение невозможно. Чтобы достичь того же эффекта, используйте обратный вызов в вашем коде, чтобы вы могли сделать что-то вроде:

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, при условии, что приглашение был уже ответил. Если вы беспокоитесь о глобальных переменных, загрязняющих ваше пространство, вы можете обернуть все это в замыкание, но в противном случае все должно быть в порядке.

0 голосов
/ 23 марта 2009

@ Paolo:

Это код, с которым я сейчас работаю:

<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 () срабатывает, как только страница загружена, что совершенно точно не то, что я хочу; в идеале я хотел бы, чтобы остальная часть кода ожидала обработки запроса, но я сильно сомневаюсь, что это возможно за пределами собственной реализации. Подумайте, мне просто нужно согласиться на разработку моего алгоритма, чтобы подсказка сразу использовалась?

...