2010-09-05 16 views
5

Tengo un plugin de facebox en mi jQuery, para hacer lightbox para mí. Hice un enlace en el que hace clic y aparece un formulario de solicitud de amistad.jQuery Facebox: envía el valor del campo de entrada vacío

El formulario realiza un llamado ajax cuando hace clic en "Enviar solicitud", pero los 2 campos no envían nada de lo que ha escrito en él, simplemente envía un valor vacío.

Pero si no está dentro del lightbox de facebox, entonces funciona y envía los valores en la llamada ajax.

Así que algo en el facebox.js impide los campos y les envía valores vacíos.

¿Cómo puedo solucionar esto?

Aquí es facebox.js:

(function($) { 
    $.facebox = function(data, klass) { 
    $.facebox.loading() 

    if (data.ajax) fillFaceboxFromAjax(data.ajax) 
    else if (data.image) fillFaceboxFromImage(data.image) 
    else if (data.div) fillFaceboxFromHref(data.div) 
    else if ($.isFunction(data)) data.call($) 
    else $.facebox.reveal(data, klass) 
    } 

    /* 
    * Public, $.facebox methods 
    */ 

    $.extend($.facebox, { 
    settings: { 
     opacity  : 0, 
     overlay  : true, 
     loadingImage : 'images/loading.gif', 
     closeImage : 'images/closelabel.png', 
     imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], 
     faceboxHtml : '\ 
    <div id="facebox" style="display:none;"> \ 
     <div class="popup"> \ 
     <table> \ 
      <tbody> \ 
      <tr> \ 
       <td class="tl"/><td class="b"/><td class="tr"/> \ 
      </tr> \ 
      <tr> \ 
       <td class="b"/> \ 
       <td class="body"> \ 
       <div class="content"> \ 
       </div> \ 
       <div class="footer"> \ 
        <a href="#" class="close"> \ 
        <img src="/facebox/closelabel.gif" title="close" class="close_image" /> \ 
        </a> \ 
       </div> \ 
       </td> \ 
       <td class="b"/> \ 
      </tr> \ 
      <tr> \ 
       <td class="bl"/><td class="b"/><td class="br"/> \ 
      </tr> \ 
      </tbody> \ 
     </table> \ 
     </div> \ 
    </div>' 
    }, 

    loading: function() { 
     init() 
     if ($('#facebox .loading').length == 1) return true 
     showOverlay() 

     $('#facebox .content').empty() 
     $('#facebox .body').children().hide().end(). 
     append('<div class="loading"><img src="'+$.facebox.settings.loadingImage+'"/></div>') 

     $('#facebox').css({ 
     top: getPageScroll()[1] + (getPageHeight()/10), 
     left: 385.5 
     }).show() 

     $(document).bind('keydown.facebox', function(e) { 
     if (e.keyCode == 27) $.facebox.close() 
     return true 
     }) 
     $(document).trigger('loading.facebox') 
    }, 

    reveal: function(data, klass) { 
     $(document).trigger('beforeReveal.facebox') 
     if (klass) $('#facebox .content').addClass(klass) 
     $('#facebox .content').append(data) 
     $('#facebox .loading').remove() 
     $('#facebox .body').children().fadeIn('normal') 
     $('#facebox').css('left', $(window).width()/2 - ($('#facebox table').width()/2)) 
     $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') 
    }, 

    close: function() { 
     $(document).trigger('close.facebox') 
     return false 
    } 
    }) 

    /* 
    * Public, $.fn methods 
    */ 

    $.fn.facebox = function(settings) { 
    init(settings) 

    function clickHandler() { 
     $.facebox.loading(true) 

     // support for rel="facebox.inline_popup" syntax, to add a class 
     // also supports deprecated "facebox[.inline_popup]" syntax 
     var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) 
     if (klass) klass = klass[1] 

     fillFaceboxFromHref(this.href, klass) 
     return false 
    } 

    return this.click(clickHandler) 
    } 

    /* 
    * Private methods 
    */ 

    // called one time to setup facebox on this page 
    function init(settings) { 
    if ($.facebox.settings.inited) return true 
    else $.facebox.settings.inited = true 

    $(document).trigger('init.facebox') 
    makeCompatible() 

    var imageTypes = $.facebox.settings.imageTypes.join('|') 
    $.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i') 

    if (settings) $.extend($.facebox.settings, settings) 
    $('body').append($.facebox.settings.faceboxHtml) 

    var preload = [ new Image(), new Image() ] 
    preload[0].src = $.facebox.settings.closeImage 
    preload[1].src = $.facebox.settings.loadingImage 

    $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() { 
     preload.push(new Image()) 
     preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') 
    }) 

    $('#facebox .close').click($.facebox.close) 
    $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) 
    } 

    // getPageScroll() by quirksmode.com 
    function getPageScroll() { 
    var xScroll, yScroll; 
    if (self.pageYOffset) { 
     yScroll = self.pageYOffset; 
     xScroll = self.pageXOffset; 
    } else if (document.documentElement && document.documentElement.scrollTop) {  // Explorer 6 Strict 
     yScroll = document.documentElement.scrollTop; 
     xScroll = document.documentElement.scrollLeft; 
    } else if (document.body) {// all other Explorers 
     yScroll = document.body.scrollTop; 
     xScroll = document.body.scrollLeft; 
    } 
    return new Array(xScroll,yScroll) 
    } 

    // Adapted from getPageSize() by quirksmode.com 
    function getPageHeight() { 
    var windowHeight 
    if (self.innerHeight) { // all except Explorer 
     windowHeight = self.innerHeight; 
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode 
     windowHeight = document.documentElement.clientHeight; 
    } else if (document.body) { // other Explorers 
     windowHeight = document.body.clientHeight; 
    } 
    return windowHeight 
    } 

    // Backwards compatibility 
    function makeCompatible() { 
    var $s = $.facebox.settings 

    $s.loadingImage = $s.loading_image || $s.loadingImage 
    $s.closeImage = $s.close_image || $s.closeImage 
    $s.imageTypes = $s.image_types || $s.imageTypes 
    $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml 
    } 

    // Figures out what you want to display and displays it 
    // formats are: 
    //  div: #id 
    // image: blah.extension 
    // ajax: anything else 
    function fillFaceboxFromHref(href, klass) { 
    // div 
    if (href.match(/#/)) { 
     var url = window.location.href.split('#')[0] 
     var target = href.replace(url,'') 
     $.facebox.reveal($(target).clone().show(), klass) 

    // image 
    } else if (href.match($.facebox.settings.imageTypesRegexp)) { 
     fillFaceboxFromImage(href, klass) 
    // ajax 
    } else { 
     fillFaceboxFromAjax(href, klass) 
    } 
    } 

    function fillFaceboxFromImage(href, klass) { 
    var image = new Image() 
    image.onload = function() { 
     $.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass) 
    } 
    image.src = href 
    } 

    function fillFaceboxFromAjax(href, klass) { 
    $.get(href, function(data) { $.facebox.reveal(data, klass) }) 
    } 

    function skipOverlay() { 
    return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null 
    } 

    function showOverlay() { 
    if (skipOverlay()) return 

    if ($('facebox_overlay').length == 0) 
     $("body").append('<div id="facebox_overlay" class="facebox_hide"></div>') 

    $('#facebox_overlay').hide().addClass("facebox_overlayBG") 
     .css('opacity', $.facebox.settings.opacity) 
     .click(function() { $(document).trigger('close.facebox') }) 
     .fadeIn(200) 
    return false 
    } 

    function hideOverlay() { 
    if (skipOverlay()) return 

    $('#facebox_overlay').fadeOut(200, function(){ 
     $("#facebox_overlay").removeClass("facebox_overlayBG") 
     $("#facebox_overlay").addClass("facebox_hide") 
     $("#facebox_overlay").remove() 
    }) 

    return false 
    } 

    /* 
    * Bindings 
    */ 

    $(document).bind('close.facebox', function() { 
    $(document).unbind('keydown.facebox') 
    $('#facebox').fadeOut(function() { 
     $('#facebox .content').removeClass().addClass('content') 
     hideOverlay() 
     $('#facebox .loading').remove() 
    }) 
    }) 

})(jQuery); 

Aquí es mi forma, aunque dudo que algo está mal aquí, ya que trabaja fuera de la caja:

 <div id="addFriend" style="display: none;"> 
       <div style="float:right; font-size: 14px;">Add <strong><?php echo $showU["full_name"]; ?></strong> as friend </div> 
       <div class="clearfloat"></div> 

<form id="FriendRequest" action="javascript:DoFriendRequest(<?php echo $v["id"]; ?>, <? echo $showU["id"]; ?>)" method="post"> 

     <script type="text/javascript" charset="utf-8"> 
     $(document).ready(function(){ 
    $("label").inFieldLabels(); 
}); 
    </script> 
       <table align="center" width="auto" border="0" cellpadding="5" cellspacing="5" style="margin: auto;"> 
       <tr> 
       <td style="padding: 10px;" align="center"> 
       Comment: </td><td> 
       <span class="field"> 

       <input name="commentFriend" type="text" id="commentFriend" style="height: auto;"value="" size="22"> 
       </span> 
       </td></tr><tr> 
       <td style="padding: 10px;" align="center"> 
       Message: 
       </td><td> 
       <span class="field"> 

       <input name="messageFriend" type="text" id="messageFriend" value="" size="22"> 
       </span> 
       </td> 
       </tr> 
       <tr> 
       <td colspan="2" style="margin: auto; text-align: center;"> 
       <input name="submit" type="submit" id="submit" value="Send request"> 
       </td> 
       </tr> 

       <tr> 
           <td colspan="2" style="margin: auto; text-align: center;"> 
       </td> 
       </tr> 
       </table> 
       </form> 

       <div style="margin: auto; text-align: center; font-size: 16px; font-weight: bold;" id="insert_svar"></div> 
    </div> 

DoFriendRequest()

function DoFriendRequest(BuID, uID){ 
    $('#submit').attr('disabled', 'disabled'); 
    var wrapperId = '#insert_svar'; 
    $.ajax({ 
     type: "POST", 
     url: "misc/AddFriendRequest.php", 
    data: { 
    mode: 'ajax', 
    BuID : BuID, 
    uID : uID, 
    message : $('#messageFriend').val(), 
    comment : $('#commentFriend').val() 
    }, 
     success: function(msg){ 
     $('#submit').removeAttr('disabled'); 
    $(wrapperId).prepend(msg); 
    $('#FriendRequest').fadeOut('slow'); 
    $('#message').val(""); 
    $('#comment').val(""); 
     } 
    }); 
} 
+0

¿Tiene esto en una página en algún lugar para que pueda proporcionar un enlace? Eso sería más fácil de probar que reconstruir tu página para probar. –

+0

¿Podría compartir todo el marcado? No puedo ayudarte si no tengo el código fuente completo. Lo siento, se suponía que solo debía dejar un comentario sobre su pregunta, pero no tengo la reputación suficiente para hacerlo. Actualizaré esta respuesta cuando se me ocurra. Como respuesta temporal a su pregunta, es posible que desee verificar esto. Podría ayudar - http://www.caiapps.com/stick-on-facebox/ –

Respuesta

4

El problema está en esta línea:

$.facebox.reveal($(target).clone().show(), klass) 

Se clonación de sus elementos, específicamente id="messageFriend" y id="commentFriend" que está causando problemas ya que son supone que ser único. El #ID selector encuentra elementos originales que todavía están vacíos (los clonados tienen los valores que busca).

Para resolver esto, que eliminaría los atributos id y encontrarlos por name lugar ... y sólo encontrar las :visible queridos, que sería el facebox actualmente abierto, así:

function DoFriendRequest(BuID, uID){ 
    $('#submit').attr('disabled', 'disabled'); 
    var wrapperId = '#insert_svar'; 
    $.ajax({ 
    type: "POST", 
    url: "misc/AddFriendRequest.php", 
    data: { 
     mode: 'ajax', 
     BuID : BuID, 
     uID : uID, 
     message : $('input[name=messageFriend]:visible').val(), 
     comment : $('input[name=commentFriend]:visible').val() 
    }, 
    success: function(msg){ 
     $('#submit').removeAttr('disabled'); 
     $(wrapperId).prepend(msg); 
     $('#FriendRequest').fadeOut('slow'); 
     $('#message, #comment').val(""); 
    } 
    }); 
} 

You can try the updated version here, eche un vistazo a la consola para ver que de hecho está enviando los valores ahora.

1

Probar:

$("target:last").serialize() 
Cuestiones relacionadas