2012-02-12 5 views
1

Я пытался реализовать 2 независимых контакта, основанных на оригинале contact.js, который поддерживает только 1 Contact Modal.Несколько контактов Модальные реализации

Вот SimpleModal плагин Страница проекта: http://www.ericmmartin.com/projects/simplemodal/

Вот моя реализация с оригинальным модальных и новым модальным, который появляется нормальный: http://jsfiddle.net/NinjaSk8ter/TEUsx/

У меня возникли проблемы, потому что contact.js JavaScript использует эти элементы управления из оригинальной модальности: '# modal-contact-form'

'контакт-имя' 'контакт-email' 'контакт-объект' 'контакт-сообщение' 'contact-cc' 'tokenValue '

Я пытаюсь добавить 2-ой модальную форму: «# модальных-Soporte-форму»

я добавил «модальную-Soporte-форму» в рамках contact.js и следующие новые элементы управления внутри HTML:

'контакт-name2' 'контакт-email2' 'контакт-subject2' 'контакт-message2' 'контакт-cc2' 'tokenValue2'

Однако, Im не уверены о том, как ссылаться на эти управления идентификаторами Повсеместно DOM внутри contact.js.

Оригинальный плагин представляет собой селектор для элементов с различными идентификаторами («# 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(); 

}); 

Здесь вы HTML, которые иллюстрируют 2 модальностей:

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

ответ

0

К сожалению, похоже, что код плагина кодирует селектор элементам с различными идентификаторами («# contact-xxx»). Это не делает его очень пригодным для повторного использования.

Решение состоит в том, чтобы модифицировать плагин для использования классов элементов, возможно, относительно элемента DOM, к которому применяется плагин.

Итак:

  • «инициализация» функция будет принимать селектор JQuery для «корневого» DOM элемента как пары (так что вы можете различать два контакт формы по идентификаторам)
  • в Выбор jquery будет выполнен как $ (theSelector) .find (". contact-xxxx ...") вместо $ ("# contact-xxx ....")
  • DOM будет иметь элементы с классами "контакт -xxx ", а не ids" contact-xxx "
+0

, что кажется лучшим подходом, потому что я хочу, чтобы реализовать другие различные модальности, так что изменения плагин, чтобы иметь возможность принимать различные классы, основанные на различных элементов DOM; но я не знаю, как это реализовать. – Paul

+0

Я понимаю вашу боль, плагин не так сильно написан в этом смысле: но ключ действительно должен заменить все жестко настроенные селектора с помощью ids, в softcoded селекторами с классами. Было бы много (небольших) изменений, чтобы сделать - вы можете также хотеть связаться с автором плагина ... – phtrivier

Смежные вопросы