Головоломка JavaScript для решения: window.confirm = divConfirm (strMessage) - PullRequest
4 голосов
/ 13 января 2010

Сценарий: старый сайт, на котором уже написано много кода JS. Если пользователь хочет изменить все предупреждающие сообщения на оповещения о новом возрасте, основанные на jazzy Div, которые очень распространены при использовании JQuery, YUI, Prototype ... и т. Д.
В основном это древовидные диалоги JS
1. предупреждение

Чтобы изменить это просто, нам нужно написать новую функцию, которая будет показывать всплывающее окно div и показывать сообщение, после чего переопределить window.alert

function showDivAlert(strMessage){ <br/> //div popup logic and code <br/> } <br/> <br/> window.alert = showDivAlert; <br/>

2. подскажите

Это тоже выглядит легко написать функцию, чтобы принять строку и показать текстовое поле для входного значения. Теперь, когда действие возврата основано на нажатии кнопки «ОК», жизнь здесь проста.


function shoDivPromp(strMessage){ <br/> //div pop up to show the text box and accept input from the user <br/> } <br/> window.prompt = shoDivPromp; <br/>

3. подтверждение

Теперь выше двух было легко переопределить и изменить диалоговые окна по умолчанию, но есть сложности с подтверждением.
Однако диалоговое окно подтверждения JS по умолчанию останавливает выполнение JS, и когда пользователь нажимает кнопку ОК или Отмена выполнения, возобновляется путем определения возвращаемого значения (true / false). Но если мы используем всплывающее окно div, выполнение не останавливается, что является проблемой.
Мы все еще можем реализовать подтверждение, но в этом случае мы должны связать методы для случая ОК и ОТМЕНА, которые будут прикреплены к кнопкам ОК и ОТМЕНА. С этой функцией подпись будет похожа. function newConfirm(msg, fun OkAction(), fun CancelAction)

Теперь проблема в том, что это не может помочь мне изменить диалог подтверждения на сайте, как мы сделали с alert (); Вопрос
Я не уверен, возможно ли это или нет, но я думаю, что можно использовать какой-то шаблон JS. Итак, дайте мне знать, если это возможно.

Ответы [ 4 ]

5 голосов
/ 13 января 2010

Теперь проблема в том, что это не может помочь мне изменить диалог подтверждения на сайте, как мы сделали с alert ();

Это верно. Невозможно воспроизвести синхронный характер функций оповещения / подтверждения / приглашения в собственном JavaScript. Существует нестандартный метод showModalDialog, который может сделать это с помощью отдельного всплывающего документа, но он поддерживается не всеми браузерами и, как правило, считается крайне нежелательным.

Таким образом, стратегия замены плагинов не сработает. Вам придется менять каждое место, где вы вызывали эти методы, в оставшейся части скрипта.

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

function buttonclick() {
    var id= this.id;
    if (confirm('Are you sure you want to frob '+id+'?'))
        frob(id);
    wipe(id);
}

с:

function buttonclick() {
    var id= this.id;
    myConfirm('Are you sure you want to frob '+id+'?', function(confirmed) {
        if (confirmed)
            frob(id);
        wipe(id);
    });
}

Если вам нужно this для сохранения, вам нужно взглянуть на еще одно вложенное замыкание или function.bind, чтобы сделать это. Если у вас есть вызов confirm в цикле, все становится значительно сложнее.

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

3 голосов
/ 13 января 2010

Все 3 метода фактически останавливают выполнение JS, а не только подтверждение, потому что все они - модальные диалоги. Лично я бы постарался сделать все как можно более асинхронным, поскольку модальные диалоги препятствуют взаимодействию с текущим документом.

Лучше всего использовать функции обратного вызова из нового всплывающего окна подтверждения, как вы и предлагали.

Мне трудно понять, чего именно ты хочешь достичь. Похоже, вы хотите сделать что-то вроде следующего:

  • Запустите некоторый код JavaScript
  • Отображение поля «Подтвердить»
  • Дождаться нажатия кнопки «ОК» или «Отмена»
  • Продолжайте вводить код, когда пользователь нажимает кнопку «ОК», и возвращать код, когда пользователь нажимает кнопку «Отмена».

Причина, по которой вы хотите это сделать, заключается в том, что для переопределения функции чем-то, что использует обратные вызовы, потребуется переписать каждый раздел кода, который использует функцию подтверждения. Если вам нужен мой совет, я бы переписал код так, чтобы он работал асинхронно. Невозможно отложить выполнение скрипта, не заблокировав документ, который включает в себя действия «ОК» и «Отмена» вашего диалога.

2 голосов
/ 13 января 2010

если вы изменили роли Alert / Prompt / Confirm. замедляет выполнение в ожидании взаимодействия с пользователем для запуска следующего кода.

Переопределяя эти функции, код продолжает выполнение.

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

Тогда вы можете использовать любой плагин для Windows как sexy-alert-box и перезаписать Alert / Prompt / Confirm

1 голос
/ 13 января 2010

Сигнатура функции будет просто:

 function newConfirm(msg, okAction, cancelAction);

и будет использоваться как:

 function newConfirm(msg, okAction, cancelAction){
   var ok = doWhateverPromptIsNecessary();
   if (ok) {
     okAction();
   } else {
     cancelAction();
   }
 }

То есть, чтобы передать функцию "указатели" в функцию в качестве аргументов, просто передайте имя функции без (). Подпись функции одинакова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...