还有一个确认了问题

时间:2011-01-19 19:32:14

标签: javascript javascript-events callback modal-dialog

是的,我在SO上搜索得很高,看到了一些解决这个问题的好方法,这些解决方案已经一次又一次地用SimpleModal,jQuery.confirm等解决了。

问题是,我正在开发这种不允许使用JS框架的低级设备,而且我不得不将这种模式确认为现有的JS。

现有的脚本可以自由编辑(但不能重写),可以执行一些操作,例如验证,将一些输入连接到单个变量等等。

脚本写入:

  1. 获取一些会话变量并为其分配新的变量名称并相应地格式化
  2. 向用户提供确认,以确定他们是否要使用这些变量预填充页面上的表单
  3. 准备一些功能以验证输入。
  4. 其他东西,比如提供放弃场景,等等
  5. 现在,当“确认”到位时,一切都很好,因为脚本会暂停,直到提供确定或取消。我现在在页面上呈现一个我想要模拟这种行为的模态,我想到的唯一方法是删除对通过确认事项的行的依赖而不运行脚本直到用户与之交互模态。

    有没有人知道如何采取适当的措施并将其“包装”在“监听”if / else场景中,以确定每种YES或NO的可能性?

    对不起,如果这是混乱......我的布莱恩也在此刻混淆了。

2 个答案:

答案 0 :(得分:1)

据我所知 - 到目前为止 - 没有办法暂停脚本,如浏览器特定警报()或确认()对话框。

像dojo这样的框架尝试通过在整个窗口上放置一个透明的DIV来模拟这种行为,以防止在显示Dialog时出现点击或其他输入。

这是我经历的非常棘手,因为键盘输入可能能够激活此幕后的输入字段或按钮。键盘快捷键或Field-Tabbing例如。 一种解决方法是手动禁用活动元素,在大多数情况下,这对我很有效。

一个或多个函数传递给此“模拟”对话框,以便在选择选项时执行。 特别是对于ajax后台活动,在Dialog打开时停止冲突函数调用的责任在于开发人员。

以下是我提出的一个例子:

 <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>

在此代码中,在执行时仍存在与存储的选择功能(未定义)的可用性有关的错误。闭包中不再提供函数变量。如果有人为此解决问题,欢迎您加入。

希望接近您需要知道的内容。

答案 1 :(得分:0)

更新版本:fixed choiceAction undefined,添加了IE兼容性。 Internet Explorer是使用它的一个主要原因,因为confirm()现在默认被阻止。

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

<script type="text/javascript"><!-- //http://stackoverflow.com/questions/4739740/yet-another-confirm-replacement-quesiton

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>