jquery - 几种联系方式的实现

标签 jquery css

我一直在尝试基于仅支持 1 个联系模式的原始 contact.js 实现 2 个单独的联系模式。

这是 SimpleModal 插件元素页面:http://www.ericmmartin.com/projects/simplemodal/

这是我使用原始模态和看起来正常的新模态的实现: http://jsfiddle.net/NinjaSk8ter/TEUsx/

我遇到了问题,因为 contact.js JavaScript 使用了原始模态中的那些控制元素:'#modal-contact-form'

'联系人姓名' '联系人电子邮件' '联系人主题' '联系人消息' 'contact-cc' 'tokenValue'

我正在尝试添加第二个模态形式:'#modal-soporte-form'

我在 contact.js 中添加了“modal-soporte-form”,并在 html 中添加了以下新控件元素:

'contact-name2' 'contact-email2' 'contact-subject2' 'contact-message2' 'contact-cc2' 'tokenValue2'

但是,我不确定如何通过 contact.js 中的 DOM 引用这些控件 ID。

原始插件将选择器硬编码为具有各种 id 的元素(“#contact-xxx”),这对于我的第二个模式是不可重复使用的。建议改为使用与 DOM 元素相关的类。

根据元素页面:http://www.ericmmartin.com/projects/simplemodal/ 通过传递 jQuery 对象或 DOM 元素,可以将模态对话框创建为独立函数:

$.modal("<div><h1>SimpleModal</h1></div>");

但我对如何做到这一点一无所知。

DOM 如何考虑不同的控件名称?

这是 contact.js:

jQuery(function ($) {
var contact = {
    message: null,
    init: function () {
        $('#contact-form input.consultcontacto, a.consultcontacto').click(function (e) {
            e.preventDefault();

            // Create the 1st Modal dialog with the data

            $('#modal-contact-form').modal({
                closeHTML: "<a href='#' title='Close' class='modal-close'>Cierra Ticket Modal</a>",
                maxHeight: 62,
                maxWidth: 62,
                minHeight: 62,
                minWidth: 62,
                position: [138, 383],
                overlayId: 'contact-overlay',
                containerId: 'contact-container',
                onOpen: contact.open,
                onShow: contact.show,
                onClose: contact.close
            });
        });

        $('#contact-form input.suportecontacto, a.suportecontacto').click(function (e) {
            e.preventDefault();

            // Create the 2nd Modal dialog with the data

            $('#modal-soporte-form').modal({
                closeHTML: "<a href='#' title='Close' class='modal-close'>Cierra Ticket Modal</a>",
                maxHeight: 62,
                maxWidth: 62,
                minHeight: 62,
                minWidth: 62,
                position: [138, 383],
                overlayId: 'contact-overlay',
                containerId: 'contact-container',
                onOpen: contact.open,
                onShow: contact.show,
                onClose: contact.close

            });
        });
    },
    open: function (dialog) {
        // add padding to the buttons in firefox/mozilla
        if ($.browser.mozilla) {
            $('#contact-container .contact-button').css({
                'padding-bottom': '2px'
            });
        }
        // input field font size
        if ($.browser.safari) {
            $('#contact-container .contact-input').css({
                'font-size': '.9em'
            });
        }

        // Dynamically determine Modal Height

        //var h = 280;
        var h = 220;
        if ($('#contact-subject').length) {
            h += 26;
        }
        if ($('#contact-cc').length) {
            h += 22;
        }

        var title = $('#contact-container .contact-title').html();
        $('#contact-container .contact-title').html('Cargando...');
        dialog.overlay.fadeIn(200, function () {
            dialog.container.fadeIn(200, function () {
                dialog.data.fadeIn(200, function () {
                    $('#contact-container .contact-content').animate({
                        height: h
                    }, function () {
                        $('#contact-container .contact-title').html(title);
                        $('#contact-container form').fadeIn(200, function () {
                            $('#contact-container #contact-name').focus();

                            $('#contact-container .contact-cc').click(function () {
                                var cc = $('#contact-container #contact-cc');
                                cc.is(':checked') ? cc.attr('checked', '') : cc.attr('checked', 'checked');
                            });

                            // fix png's for IE 6
                            if ($.browser.msie && $.browser.version < 7) {
                                $('#contact-container .contact-button').each(function () {
                                    if ($(this).css('backgroundImage').match(/^url[("']+(.*\.png)[)"']+$/i)) {
                                        var src = RegExp.$1;
                                        $(this).css({
                                            backgroundImage: 'none',
                                            filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '", sizingMethod="crop")'
                                        });
                                    }
                                });
                            }
                        });
                    });
                });
            });
        });
    },
    show: function (dialog) {
        $('#contact-container .contact-send').click(function (e) {
            e.preventDefault();

            var form = $('#contact-container form');

            // validate form
            if (contact.validate()) {
                var msg = $('#contact-container .contact-message');
                msg.fadeOut(function () {
                    msg.removeClass('contact-error').empty();
                });
                $('#contact-container .contact-title').html('Enviando...');
                $('#contact-container form').fadeOut(200);
                $('#contact-container .contact-content').animate({
                    height: '80px'
                }, function () {
                    $('#contact-container .contact-loading').fadeIn(200, function () {
                        $.ajax({
                            url: form[0].action,
                            data: $('#contact-container form').serialize() + '&action=send',
                            type: 'post',
                            cache: false,
                            dataType: 'html',
                            success: function (data) {

                                $('#contact-container .contact-loading').fadeOut(200, function () {
                                    $('#contact-container .contact-title').html('Gracias!');
                                    msg.html(data).fadeIn(200);
                                    setTimeout(function () {
                                        contact.close(dialog);
                                    }, 1500);
                                });
                            },
                            error: contact.error
                        });
                    });
                });
            }
            else {
                if ($('#contact-container .contact-message:visible').length > 0) {
                    var msg = $('#contact-container .contact-message div');
                    msg.fadeOut(200, function () {
                        msg.empty();
                        contact.showError();
                        msg.fadeIn(200);
                    });
                }
                else {
                    $('#contact-container .contact-message').animate({
                        height: '30px'
                    }, contact.showError);
                }

            }
        });
    },
    close: function (dialog) {
        $('#contact-container .contact-message').fadeOut();
        $('#contact-container .contact-title').html('Cerrando...');
        $('#contact-container form').fadeOut(200);
        $('#contact-container .contact-content').animate({
            height: 40
        }, function () {
            dialog.data.fadeOut(200, function () {
                dialog.container.fadeOut(200, function () {
                    dialog.overlay.fadeOut(200, function () {
                        $.modal.close();
                    });
                });
            });
        });
    },
    error: function (xhr) {
        alert(xhr.statusText);
    },
    validate: function () {
        contact.message = '';
        if (!$('#contact-container #contact-name').val()) {
            contact.message += 'Name is required. ';
        }

        var email = $('#contact-container #contact-email').val();
        if (!email) {
            contact.message += 'Email is required. ';
        }
        else {
            if (!contact.validateEmail(email)) {
                contact.message += 'Email is invalid. ';
            }
        }

        if (!$('#contact-container #contact-message').val()) {
            contact.message += 'Message is required.';
        }

        if (contact.message.length > 0) {
            return false;
        }
        else {
            return true;
        }
    },
    validateEmail: function (email) {
        var at = email.lastIndexOf("@");

        // Make sure the at (@) sybmol exists and  
        // it is not the first or last character
        if (at < 1 || (at + 1) === email.length)
            return false;

        // Make sure there aren't multiple periods together
        if (/(\.{2,})/.test(email))
            return false;

        // Break up the local and domain portions
        var local = email.substring(0, at);
        var domain = email.substring(at + 1);

        // Check lengths
        if (local.length < 1 || local.length > 64 || domain.length < 4 || domain.length > 255)
            return false;

        // Make sure local and domain don't start with or end with a period
        if (/(^\.|\.$)/.test(local) || /(^\.|\.$)/.test(domain))
            return false;

        // Check for quoted-string addresses
        // Since almost anything is allowed in a quoted-string address,
        // we're just going to let them go through
        if (!/^"(.+)"$/.test(local)) {
            // It's a dot-string address...check for valid characters
            if (!/^[-a-zA-Z0-9!#$%*\/?|^{}`~&'+=_\.]*$/.test(local))
                return false;
        }

        // Make sure domain contains only valid characters and at least one period
        if (!/^[-a-zA-Z0-9\.]*$/.test(domain) || domain.indexOf(".") === -1)
            return false;

        return true;
    },
    showError: function () {
        $('#contact-container .contact-message')
            .html($('<div class="contact-error"></div>').append(contact.message))
            .fadeIn(200);
    }
};

contact.init();

});

这是说明 2 个模态的 html:

<html>
<head></head>
<body>
<form>
<div id="Soluciones_derecho2">
    <div class="contactanos">
        <div id="contact-button">
            <div id='contact-form'>
                <a class="consultcontacto" href="#"></a>
                <a class="suportecontacto" href="#"></a>
            </div>
        </div>
    </div>
</div>
</form>

<div id='modal-contact-form' style='display: none'>
<div class='contact-top'>
</div>
<div class='contact-content'>
    <h1 class='contact-title'>Crea Su Nuevo Ticket:</h1>
    <div class='contact-loading' style='display: none'>
    </div>
    <div class='contact-message' style='display: none'>
    </div>
    <form action='ModalContact1.aspx' style='display: none'>
        <label for='contact-name'>
            *Name:</label>
        <input type='text' id='contact-name' class='contact-input' name='name' tabindex='1001' />
        <label for='contact-email'>
            *Email:</label>
        <input type='text' id='contact-email' class='contact-input' name='email' tabindex='1002' />
        <label for='contact-subject'>
            Subject:</label>
        <input type='text' id='contact-subject' class='contact-input' name='subject' value=''
            tabindex='1003' />
        <label for='contact-message'>
            *Message:</label>
        <textarea id='contact-message' class='contact-input' name='message' cols='40' rows='4'
            tabindex='1004'></textarea>
        <br />
        <label>&nbsp;</label>
        <input type='checkbox' id='contact-cc' name='cc' value='1' tabindex='1005' />
        <%--<span class='contact-cc'>Send me a copy</span>--%>

        <br style="clear:both; line-height:0px;" />
        <label>&nbsp;</label>
        <button type='submit' class='contact-send contact-button' tabindex='1006'>
            Enviar</button>
        <button type='submit' class='contact-cancel contact-button simplemodal-close' tabindex='1007'>
            Cancelar</button>
        <br />
        <input type="hidden" id="tokenValue" name="tokenValue" value="<%= new MailService().GetToken(0) %>" />
    </form>
</div>
<div class='contact-bottom'><a href='http://www.ericmmartin.com/projects/simplemodal/'>Powered by SimpleModal</a></div>
</div>

<div id='modal-soporte-form' style='display: none'>
<div class='contact-top'>
</div>
<div class='contact-content'>
    <h1 class='contact-title'>Somete Su Proyecto Requisito:</h1>
    <div class='contact-loading' style='display: none'>
    </div>
    <div class='contact-message' style='display: none'>
    </div>
    <form action='ModalContact2.aspx' style='display: none'>
        <label for='contact-name2'>
            *Nombre:</label>
        <input type='text' id='contact-name2' class='contact-input' name='name' tabindex='1001' />
        <label for='contact-email2'>
            *Email:</label>
        <input type='text' id='contact-email2' class='contact-input' name='email' tabindex='1002' />
        <label for='contact-subject2'>
            Tema:</label>
        <input type='text' id='contact-subject2' class='contact-input' name='subject' value=''
            tabindex='1003' />
        <label for='contact-message2'>
            *Mensaje:</label>
        <textarea id='contact-message2' class='contact-input' name='message' cols='40' rows='4'
            tabindex='1004'></textarea>
        <br />
        <label>&nbsp;</label>
        <input type='checkbox' id='contact-cc2' name='cc' value='1' tabindex='1005' />

        <br style="clear:both; line-height:0px;" />
        <label>&nbsp;</label>
        <button type='submit' class='contact-send contact-button' tabindex='1006'>
            Enviar</button>
        <button type='submit' class='contact-cancel contact-button simplemodal-close' tabindex='1007'>
            Cancelar</button>
        <br />
        <input type="hidden" id="tokenValue2" name="tokenValue" value="<%= new MailService().GetToken(0) %>" />
    </form>
</div>
<div class='contact-bottom'><a href='http://www.ericmmartin.com/projects/simplemodal/'>Powered by SimpleModal</a></div>
</div>
</body>
</html>

这是 contact.css:

#contact-overlay {                          /* Overlay */
background-color:#000;
/*background-color: Green;*/
cursor:wait;
}

#contact-container {                      /* contact-container is the containerId defined in contact.js */
font-family: Arial;
font-size: 12px;
line-height: 18px;                        /* Height of space above and below all Text ie Labels */
text-align:left; 
/*width:425px;*/                          /* Modal Width */ /* Modal Height within contact.js */
width: 350px;
}

#contact-container .contact-content {    /* contact-content is the class defined within class modal-contact-form within Site1.Master */ 
background-color: yellow;
/*background-color: #8C8C8C;*/
color:#666666;
/*height: 40px; */                       /* height from point where modal rolls down */
}

#contact-container form {
margin: 0 0 0 0;                         /* margin of form controls */
padding: 0 0 0 0;
background-color: red;
}

#contact-container h1 {                  /* Text for Create Ticket & Goodbye */
/*color: #666666;*/
color: Black;                         
font-size: 13px;
line-height: 13px;                       /* Height of space above and below Text and overall */
margin: 0 0 0 0;                        /* Margin of container itself */
padding: 0 0 2px 68px;                  /* Padding for Text above and below Create Ticket & Goodbye */
text-align:left;
background-color: Green;
}

#contact-container label {
clear: left;
float: left; 
display: block; 
font-weight: bold; 
padding: 0 4px 0 0;                     /* padding between Labels and Textboxes */
margin: 0 0 2px 0;               
text-align: right; 
width: 62px;                            /* width of Labels */
background-color: Lime;
}

#contact-container .contact-input {
background: #eee; 
border: 1px solid #fff; 
font-family: Arial; 
float: left; 
padding: 0 0 0 0; 
margin: 0 0 2px 0; 
/*width:300px;*/                        /* width of textboxes */
width: 250px;
}

#contact-container textarea {
/*height:114px;*/                       /* height of textarea */
height:108px;
}

#contact-container br {
clear:both;
}

#contact-container .contact-loading {
background:url(../Images/Contact/loading.gif) no-repeat; 
height:55px; 
margin:-14px 0 0 190px; 
padding:0; 
position:absolute; 
width:54px; 
z-index:8000;
}

#contact-container .contact-message {
text-align:center;
}

#contact-container .contact-error {
background:#000; 
border:2px solid #ccc; 
font-size:12px; 
font-weight:bold; 
line-height:18px; 
margin:0 auto; 
padding:2px; 
width:92%;
}

#contact-container .contact-cc {
cursor:default; 
font-size: 12px; 
vertical-align:top;
background-color: Fuchsia;
margin: 0 0 0 0;
}

#contact-container .contact-button {
/*background: #d76300;*/                    /* Color of Button */
background: black;
border: 0;
color: #fff;                                /* Color of Button Text */
cursor: pointer; 
font-size: 12px; 
font-weight: bold; 
height: 19px;                               /* Height of Button */
width: 58px;
margin: 0 0 2px 0;  
text-align: center; 
vertical-align: middle; 
-webkit-border-radius: 8px; 
-moz-border-radius: 8px; 
/*border-radius:8px;*/
}

#contact-container .contact-button:hover {
background:#f49000;
}

#contact-container a.modal-close {              /* modal-close is defined in contact.js */
color: gray;
font-family: Arial;                         /* Text for Cierra Ticket */
font-size: 11px;                        
font-weight: bold; 
position: absolute; 
text-decoration: none; 
right: 8px; 
top: -2px;
}

#contact-container a.modal-close:link {
color: gray;
text-decoration: none;
}

#contact-container a.modal-close:visited {
color: #999;
text-decoration: none;
}

#contact-container a.modal-close:hover {
color: gray;
text-decoration: underline;
}

#contact-container a.modal-close:active {
color: #999;
text-decoration: none;
}

#contact-container .contact-top {
/*background-color:#333;*/
background-color:orange;
height:13px; 
margin:0; 
padding:0; 
-webkit-border-top-left-radius:4px; 
-webkit-border-top-right-radius:4px; 
-moz-border-radius-topleft:4px; 
-moz-border-radius-topright:4px; 
/*border-radius: 8px 8px 0 0; */
}

#contact-container .contact-bottom {
/*background-color:#333;*/
background-color: Purple;
font-size:10px; 
height:13px; 
line-height:12px; 
text-align:center; 
-webkit-border-bottom-right-radius:8px; 
-webkit-border-bottom-left-radius:8px; 
-moz-border-radius-bottomright:8px; 
-moz-border-radius-bottomleft:8px; 
/*border-radius:0 0 8px 8px;*/
}

#contact-container .contact-bottom a,
#contact-container .contact-bottom a:link,
#contact-container .contact-bottom a:active,
#contact-container .contact-bottom a:visited 
{
color:#666; 
position:relative; 
top:-4px; 
text-decoration:none;
}

#contact-container .contact-bottom a:hover {
color:#888;
}

最佳答案

不幸的是,插件代码似乎将选择器硬编码为具有各种 ID 的元素(“#contact-xxx”)。这不会使其非常可重用。

一个解决方案是修改插件以使用元素类,可能与应用插件的 DOM 元素相关。

所以:

  • “init”函数将“根”DOM 元素的 jquery 选择器作为参数(以便您可以通过 ID 区分两个联系表单)
  • jquery 选择会像 $(theSelector).find(".contact-xxxx ...") 而不是 $("#contact-xxx ....") 那样完成
  • DOM 将包含类为“contact-xxx”而不是 ID 为“contact-xxx”的元素

关于jquery - 几种联系方式的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245868/

相关文章:

javascript - 从一个对象创建多个选择选项

javascript - 影响不同 SVG 中的相同类

javascript - 获取元素相对于主屏幕左上角的 TOP 和 LEFT 位置

html - 获取页脚始终位于页面 CSS 底部

javascript - 如何禁用页面的滚动条?

javascript - ajax 加载成功响应并加载旋转

javascript - 进行 while 循环延迟重复,直到其中的 ajax 调用完成

css - 实验性 CSS 和老式浏览器

jquery - 动态地将 from 操作值放入 Jquery 中?

html - 取消 css 填充