Остановите выполнение JavaScript, не запирая браузер

Могут Вы для остановки выполнения JavaScript, не запирая браузер? Путем Вы обычно останавливались бы, выполнение должно сделать большое количество while()- цикл, но в случае FireFox, это запирает браузер, пока цикл не закончился.

Каково Ваше взятие на этом?


Я пытаюсь переопределить window.confirm() реализовать мое собственное диалоговое окно с помощью HTML. Я делаю это так, я не должен изменять существующий код (это - довольно большая кодовая база).

Я должен смочь остановить выполнение для разрешения ввода данных пользователем; чтобы в свою очередь возвратить булевскую переменную как стандарт подтверждают, что функция делает:

if (confirm("..."))
{
    // user pressed "OK"
}
else
{
    // user pressed "Cancel"
}



Обновление

К моему знанию; это не может быть сделано с помощью setTimeout() или setInterval() так как эти функции выполняют код, который это дано им асинхронно.

6
задан cllpse 19 January 2010 в 22:01
поделиться

6 ответов

Подтверждение () Подсказка () и Alert () Функции - они вызывают из песочной коробки JavaScript в браузере, и браузер приостанавливает выполнение JavaScript. Вы не можете сделать то же самое, так как вам нужно создать свою функциональность в JavaScript.

Я не думаю, что есть отличный способ упасть в замену, не делая реструктуризацию по линиям:

myconfirmfunction(function() {
   /* OK callback */
}, function() {
   /* cancel callback */
});
9
ответ дан 8 December 2019 в 03:26
поделиться

Либо используйте обратные вызовы или сделать только ваш код Firefox только. В Firefox с поддержкой JavaScript 1.7 и выше вы можете использовать оператор текучести для моделирования желаемого эффекта. Я создал библиотеку для этой цели ASYNC.JS . Стандартная библиотека для Async.js включает в себя метод подтверждения, который можно использовать как таковые:

if (yield to.confirm("...")) {
  // user pressed OK
} else {
  // user pressed Cancel
}
7
ответ дан 8 December 2019 в 03:26
поделиться

Вы не можете остановить резьбу события в JavaScript, поэтому вместо этого вам нужно работать по всей проблеме, обычно с помощью функций обратного вызова. Это функции, которые запускаются позже, но могут быть переданы как любой другой объект в JavaScript. Вы можете быть знакомы с ними из программирования AJAX. Так, например:

doSomeThing();
var result = confirm("some importart question");
doSomeThingElse(result);

будет преобразован в:

doSomeThing();
customConfirm("some importart question", function(result){
  doSomeThingElse(result);
});

, где CustomCondFirm теперь занимает вопрос и передает результат к функции, который требуется в качестве аргумента. Если вы реализуете диалоговое окно DOM с помощью кнопки, затем подключите слушатель события к кнопкам OK и отменить и вызовите функцию обратного вызова, когда пользователь нажимает на один из них.

7
ответ дан 8 December 2019 в 03:26
поделиться

Вы также можете попробовать Dreamweaver, если он у вас есть. Он обрабатывает Classic ASP и даже обеспечивает некоторое заполнение кода.

-121--3554037-

Эти вопросы невозможно ответить без дополнительных разъяснений. Вопрос помечен как C++, что означает, что язык предположительно является C++.

В этом случае, если объявления сделаны в области пространства имен, объявление ix недействительно. Использование безымянного типа класса (не имеющего связи) для объявления объекта с внешней связью недопустимо. Объявление ix будет работать в локальной области

void foo() {
  struct { int x; } ix; // OK, no linkage
}

Также может сработать, если ix будет объявлено с внутренней связью в области пространства имен

static struct { int x; } ix; // OK? Internal linkage?

, хотя я лично считаю, что это также было задумано как плохо сформированное (Comeau так или иначе это позволяет).

Но объявление области пространства имен с внешней связью плохо сформировано

// In namespace scope
struct { int x; } ix; // ERROR

Таким образом, если предполагается область пространства имен и если вышеупомянутые объявления предназначены для того, чтобы быть взятыми как единый фрагмент кода, то на эти вопросы нет значимых ответов. Весь код просто недействителен. Это бессмысленно. Это не C++.

В противном случае, если ix объявлен без связи (локальной) или с внутренней связью, то ix является объектом.

Что касается ia , то это объект независимо от того, где он объявлен, поскольку тип класса имеет имя .

Следует отметить, что понятие объект в C++ не имеет ничего общего с классами. Объект в C++ - область места хранения (памяти). Переменная типа int является объектом в C++, например.

Добавлено позже: Бит о законности ix объявления является интересным вопросом. Видимо, C++ 98 допускал такие декларации, которые предлагалось объявить вне закона в DR # 132 . Однако позже предложение было отклонено (по довольно странной причине) и вещи остались как есть. Однако Comeau Online отказывается принимать объявление объекта с внешней связью с неименованным типом (внутренняя связь в порядке). Это вполне может быть формальная ошибка в компиляторе Comeau (не то, чтобы я жаловался на это).

Добавлено еще позже: О, я вижу, что есть еще более поздний DR # 389 , который окончательно запрещает такие объявления, но статус этого DR все еще CD1.

-121--4196153-

Я не думаю, что есть какой-либо способ разумно воссоздать функциональность confirm () или prompt () в вашем собственном JavaScript. Они «особенные» в смысле реализуются как вызовы в собственную библиотеку браузера. В JavaScript невозможно создать модальный диалог такого рода.

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

Необходимо изменить существующую библиотеку, а не заменить файл window.confirm.

1
ответ дан 8 December 2019 в 03:26
поделиться

То, как вы обычно остановите выполнение, вряд ли когда-либо станут бесконечным.

Разбивайте свою работу на части, что вы звоните с Settimeout

Измените это:

  DoSomeWork();
  Wait(1000);
  var a = DoSomeMoreWork();
  Wait(1000);
  DoEvenMoreWork(a);

к этому:

 DoSomeWork();
 setTimeout(function() {
    var a = DoSomeMoreWork();
    setTimeout(function() { 
        DoEvenMoreWork(a);
    }, 1000);
 }, 1000);
2
ответ дан 8 December 2019 в 03:26
поделиться

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

Затем я попробовал этот - сохранить и воспроизвести событие, что тоже кажется невозможным в кроссбраузерности. Однако в зависимости от мероприятия и того, насколько гибкими вы должны быть, вы можете приблизиться.

В конце концов я сдался и почувствовал себя намного лучше; Я нашел способ заставить свой код работать, вообще не замедляя собственное событие.

0
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: