подтвердить замену в JavaScript - PullRequest
1 голос
/ 19 января 2011

Да, я искал все выше и ниже по переполнению стека и видел несколько отличных решений этой проблемы, которые снова и снова решались с помощью таких вещей, как SimpleModal, jQuery.confirm и т. П.

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

Существует существующий скрипт, который я на свободередактировать (но не переписывать), что делает несколько вещей, таких как проверка, объединение нескольких входных данных в одну переменную и т. д.

Сценарий был записан в:

  1. Взять несколькопеременные сеанса и присвоение им новых переменных и их форматирование соответственно
  2. Предоставление пользователю подтверждения, чтобы увидеть, хотят ли они использовать эти переменные для предварительного заполнения формы на странице
  3. Подготовить некоторые функциидля проверки входных данных.
  4. другие вещи, такие как предложение сценария отказа, среди прочего

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

У кого-нибудь есть идеи, как взять то, что есть, и "обернуть" его в сценарий "прослушивания" if / else для каждого из вариантов ДА или НЕТ?

Извинитеесли это перепутано ... мой мозг тоже все время смешивается.

Ответы [ 2 ]

1 голос
/ 21 января 2011

Насколько я знаю, до сих пор нет способа остановить сценарии, такие как диалог браузера () или подтверждения ().

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

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

Одна или несколько функций передаются в этот «фиктивный» диалог для выполнения при выборе опции.Специально с фоновой активностью ajax ответственность за прекращение конфликтующих вызовов функций при открытом диалоге лежит на разработчику.

Вот пример, который я придумал:

 <html>
<head>
<title>Modal Dialog example</title>
<script type="text/javascript">
<!--

var ModalDialog = function(text,choices){
    this._text = text;
    this._choices = choices;
    this._panel = null;
    this._modalDialog = null;

    this._disableElements = function(tag){
        var elements = document.getElementsByTagName(tag);
        for(i=0; i < elements.length; i++){
            elements[i].disabled = true;
        }
    };

    this._enableElements = function(tag){
        var elements = document.getElementsByTagName(tag);
        for(i=0; i < elements.length; i++){
            elements[i].disabled = false;
        }
    };

    this._disableBackground = function(){
        if(this._panel){
            this._panel.style.display = 'block';
        }
        else{
            // lower the curtain
            this._panel = document.createElement('div');
            this._panel.style.position = 'fixed';
            this._panel.style.top = 0;
            this._panel.style.left = 0;
            this._panel.style.backgroundColor = 'gray';
            this._panel.style.opacity = '0.2';
            this._panel.style.zIndex = 99; // make sure the curtain is in front existing Elements
            this._panel.style.width = '100%';
            this._panel.style.height = '100%';
            document.body.appendChild(this._panel);

            // Disable active Elements behind the curtain
            this._disableElements('INPUT');
            this._disableElements('BUTTON');
            this._disableElements('SELECT');
            this._disableElements('TEXTAREA');
        }
    };

    this.close = function(){
        // Hide Curtain
        this._panel.style.display = 'none';
        // Hide Dialog for later reuse - could also be removed completely
        this._modalDialog.style.display = 'none';
        // reactivate disabled Elements
        this._enableElements('INPUT');
        this._enableElements('BUTTON');
        this._enableElements('SELECT');
        this._enableElements('TEXTAREA');
    };

    this.open = function(){
        var _this = this;
        this._disableBackground();
        if(this._modalDialog){
            this._modalDialog.style.display = 'block';
        }
        else{
            // create the Dialog
            this._modalDialog = document.createElement('div');
            this._modalDialog.style.position = 'absolute';
            this._modalDialog.style.backgroundColor = 'white';
            this._modalDialog.style.border = '1px solid black';
            this._modalDialog.style.padding = '10px';
            this._modalDialog.style.top = '40%';
            this._modalDialog.style.left = '30%';
            this._modalDialog.style.zIndex = 100; // make sure the Dialog is in front of the curtain

            var dialogText = document.createElement('div');
            dialogText.appendChild(document.createTextNode(this._text));

            // add Choice Buttons to the Dialog
            var dialogChoices = document.createElement('div');      
            for(i = 0; i < this._choices.length; i++){
                var choiceButton = document.createElement('button');
                choiceButton.innerHTML = this._choices[i].label;
                var choiceAction = _this._choices[i].action
                var clickAction = function(){
                    _this.close();
                    if(choiceAction)choiceAction();
                };
                choiceButton.onclick = clickAction;
                dialogChoices.appendChild(choiceButton);
            } 

            this._modalDialog.appendChild(dialogText);
            this._modalDialog.appendChild(dialogChoices);

            document.body.appendChild(this._modalDialog);
        }
    };
};

var myConfirm = function(text,okAction){
    var dialog = new ModalDialog(text,[
        {
            label:'ok',
            action : function(){ 
                console.log('ok')
                okAction();
            }
        },
        {   
            label:'cancel'
        }
    ]);
    dialog.open();  
};
-->
</script>

</head>
<body>
    <form name="identity" action="saveIdentity.do">
        <label>Firstname</label><input name="name" type="text"><br>
        <label>Lastname</label><input name="name" type="text"><br>
        <input type="button" 
            value="submit" 
            onclick="if(myConfirm('Do you really want to Commit?',function(){ document.forms['identity'].submit();}));">
    </form>
</body>
 </html>

В этом коде естьвсе еще ошибка относительно доступности сохраненной функции выбора (неопределенной) во время выполнения.Переменная функции больше не доступна в замыкании.Если у кого-то есть решение для этого, вы можете добавить к нему.

Надежда, которая приближается к тому, что вам нужно знать.

0 голосов
/ 01 сентября 2012

Обновленная версия: исправлен выбор. Действие не определено, добавлена ​​совместимость с IE. Internet Explorer - одна из основных причин использовать это, так как confirm() теперь заблокирован по умолчанию.

<!doctype html>
<html><head>
<title>Modal Dialog example</title>

<script type="text/javascript"><!-- ///3010417/podtverdit-zamenu-v-javascript

var ModalDialog = function(text,choices) {
    this._text = text;
    this._choices = choices;
    this._panel = null;
    this._modalDialog = null;

    this._disableElements = function(tag) {
        var elements = document.getElementsByTagName(tag);
        for(i=0; i < elements.length; i++) {
            elements[i].disabled = true;
        }
    };

    this._enableElements = function(tag) {
        var elements = document.getElementsByTagName(tag);
        for(i=0; i < elements.length; i++) {
            elements[i].disabled = false;
        }
    };

    this._disableBackground = function() {
        if(this._panel) {
            this._panel.style.display = 'block';
        }
        else {
            // lower the curtain
            this._panel = document.createElement('div');
            this._panel.style.position = 'fixed';
            this._panel.style.top = 0;
            this._panel.style.left = 0;
            this._panel.style.backgroundColor = '#000';
            this._panel.style.opacity = '0.3';
            this._panel.style.filter = 'alpha(opacity=30)'; //ie7+
            this._panel.style.zIndex = 99; // make sure the curtain is in front existing Elements
            this._panel.style.width = '100%';
            this._panel.style.height = '100%';
            document.body.appendChild(this._panel);

            // Disable active Elements behind the curtain
            this._disableElements('INPUT');
            this._disableElements('BUTTON');
            this._disableElements('SELECT');
            this._disableElements('TEXTAREA');
        }
    };

    this.close = function() {
        // Hide Curtain
        this._panel.style.display = 'none';
        // Hide Dialog for later reuse - could also be removed completely
        this._modalDialog.style.display = 'none';
        // reactivate disabled Elements
        this._enableElements('INPUT');
        this._enableElements('BUTTON');
        this._enableElements('SELECT');
        this._enableElements('TEXTAREA');
    };

    this.open = function() {
        var _this = this;
        this._disableBackground();
        if(this._modalDialog) {
            this._modalDialog.style.display = 'block';
        }
        else {
            // create the Dialog
            this._modalDialog = document.createElement('div');
            this._modalDialog.style.position = 'absolute';
            this._modalDialog.style.backgroundColor = 'white';
            this._modalDialog.style.border = '1px solid black';
            this._modalDialog.style.padding = '16px';
            this._modalDialog.style.top = '35%';
            this._modalDialog.style.left = '30%';
            this._modalDialog.style.zIndex = 100; // make sure the Dialog is in front of the curtain

            var dialogText = document.createElement('div');
            dialogText.style.padding = '0 10px 10px 0';
            dialogText.style.fontFamily = 'Arial,sans-serif';
            dialogText.appendChild(document.createTextNode(this._text));

            // add Choice Buttons to the Dialog
            var dialogChoices = document.createElement('div');
            for(i = 0; i < this._choices.length; i++) {
                var choiceButton = document.createElement('button');
                choiceButton.style.marginRight = '8px';
                choiceButton.name = i;
                choiceButton.innerHTML = this._choices[i].label;
                var clickAction = function() {
                    _this.close();
                    if(_this._choices[this.name].action) _this._choices[this.name].action();
                };
                choiceButton.onclick = clickAction;
                dialogChoices.appendChild(choiceButton);
            }

            this._modalDialog.appendChild(dialogText);
            this._modalDialog.appendChild(dialogChoices);

            document.body.appendChild(this._modalDialog);
        }
    };
};

var myConfirm = function(text,okAction){
    var dialog = new ModalDialog(text,[
        {
            label  : 'OK',
            action : function() {
                console.log('ok');
                okAction();
            }
        },
        {
            label : 'Cancel'
        }
    ]);
    dialog.open();
};
-->
</script>

</head>
<body>
    <form name="identity" action="saveIdentity.do">
        <label>Firstname</label><input name="name" type="text"><br>
        <label>Lastname</label><input name="name" type="text"><br>
        <input type="button" value="submit"
            onclick="if(myConfirm('Do you really want to Commit?',function(){ alert('submitted') }));">
        <!-- document.forms['identity'].submit(); -->
    </form>
</body>
</html>
...