2009-06-01 5 views
0

Я делаю слайд-вниз регистрационную форму, которая отправляется с плагином jQuery ajax.form. Эффект работает, подача работает. Но когда вы их объединяете, они не работают ...jQuery форма представления/улучшения эффектов?

Это для механизма выражения, поэтому теги {if} - это только условные обозначения EE. Посмотрите, что содержимое изменяется после входа пользователя в систему. Мне просто нужно перезагрузить его, чтобы содержимое менялось - я думаю, что было бы проще, чем сделать переполнение .html() переписывать ... Как только форма , правильное содержимое перезагружается и доступно для просмотра, но «#panel» не будет обновляться.

<div id="client-login"> 
<div class="wrap"> 
<p class="work-message">We're doing some work under the hood! If things get/are funky, please excuse us!</p> 
    {if logged_out} 
    <div id="client" class="login">Client Login</div> 
    {/if} 
    {if logged_in} 
    <div id="client" class="login">Hey, {username}!</div> 
    {/if} 
</div> 
</div> 
<div id="panel"> 
    <div id="panel-content" class="wrap"> 
    {if logged_out} 
    {exp:member:login_form id="login-form"} 
    <ul> 
    <li> 
    <label><span>Username</span></label> 
    <input type="text" name="username" value="" maxlength="32" class="input" size="25" /> 
    </li> 
    <li> 
    <label><span>Password</span></label> 
    <input type="password" name="password" value="" maxlength="32" class="input" size="25" /> 
    </li> 
    <li class="login-forgot"> 
    <a href="{path='member/forgot_password'}">Forgot your password?</a> 
    </li> 
    {if auto_login} 
    <li class="checkbox"> 
    <input class='checkbox' type='checkbox' name='auto_login' value='1' /> Auto-login on future visits 
    </li> 
    {/if} 
    </ul> 
    <p> 
    <input type="submit" id="panelsubmit" name="submit" value="Submit" /> 
    </p> 
    {/exp:member:login_form} 
    {/if} 
    <div id="messages"> 
    <p></p> 
    </div> 
{if logged_in} 
    <div id="logout"> 
     <h2>What do ya wanna' do?!</h2> 
     <form id="login-form" > 

      <input type="hidden" name="ACT" value="10" /> 

      <input type="submit" value="Log Out" /> 

     </form> 
    </div> 
{/if} 

$(document).ready(function() 
{ 
$('.login').toggle(
function() 
{ 
    $('#panel').stop().animate({ 
    height: "150", 
    padding:"20px 0", 
    backgroundColor:'rgba(0,0,0,0.8)', 
}, 500); 
$('#client-login').stop().animate({ 
    backgroundColor:'rgba(0,0,0,0.8)', 
}, 500); 
}, 
function() 
{ 
    $('#panel').stop().animate({ 
    backgroundColor:'rgba(0,0,0,0.2)', 
    height: "0", 
    padding:"0px 0", 
    }, 500);  
$('#client-login').stop().animate({ 
    backgroundColor:'rgba(0,0,0,0.2)', 
}, 500); 

}); 

    $('#login-form').ajaxForm({ 
     // success identifies the function to invoke when the server response 
     // has been received; here we apply a fade-in effect to the new content 
     success: function() { 
      $("#client").remove().fadeOut("fast"); 
      $("#client-login").load("/ #client-login").fadeIn("fast"); 
      $("#panel-content").remove().fadeOut("fast"); 
      $("#panel").load("/ #panel-content").fadeIn("fast"); 

     } 
    }); 
}); 

Функциональность в основном есть, но форма должна работать так же ПОСЛЕ, как она была представлена, как и раньше! Кроме того, анимация для .remove не работает. Я новичок в JavaScript, и я не знаю, как это улучшить.

ответ

5

Поскольку вы загружаете контент через AJAX, анимация и функциональность, присутствовавшие до перезагрузки, больше не будут работать, потому что эффекты связаны только с исходными элементами. Чтобы исправить это, вам нужно повторно привязать загруженный контент к анимации и т. Д.

Существует несколько способов сделать это. Во-первых, вы можете просто повторно применить свои анимационные функции к загруженному контенту. Например, после загрузки содержимого вызовите функцию, которая повторно привязывает анимации к новым элементам.

Во-вторых, и более легко, вы можете использовать функцию jQuery live(). Это лучший метод, на мой взгляд. Функция live() связывает все текущие и будущие элементы, а не просто привязывает текущие элементы. Поэтому при создании анимации создайте его внутри функции live(). Вот пример использования от http://docs.jquery.com/Events/live:

$("p").live("click", function(){ 
    $(this).after("<p>Another paragraph!</p>"); 
}); 
+0

Я не уверен, что мой синтаксис верен. Это своего рода работа, но я должен щелкнуть ее два раза, чтобы инициализировать ... Я не уверен, что делать! Пожалуйста, извините мое невежество! –

+0

Можете ли вы опубликовать свой синтаксис? –

0
$('.login').toggle(
function() 
{ 
      $('#panel').stop().animate({ 
      height: "150", 
      padding:"20px 0", 
      backgroundColor:'rgba(0,0,0,0.8)', 
     }, 500); 
     $('#client-login').stop().animate({ 
      backgroundColor:'rgba(0,0,0,0.8)', 
     }, 500); 
    }, 
    function() 
    { 
      $('#panel').stop().animate({ 
      backgroundColor:'rgba(0,0,0,0.2)', 
      height: "0", 
      padding:"0px 0", 
      }, 500);  
     $('#client-login').stop().animate({ 
      backgroundColor:'rgba(0,0,0,0.2)', 
     }, 500); 

});

$('#login-form').ajaxForm({ 
    // success identifies the function to invoke when the server response 
    // has been received; here we apply a fade-in effect to the new content 
    success: function() { 
     $("#client-login .wrap").fadeOut('slow'); 
     $("#client-login .wrap").remove();   
     $("#client-login").load("/ #client-login").fadeIn(2000); 
     $("#panel-content").fadeOut('slow'); 
     $("#panel").load("/ #panel-content").fadeIn(2000); 
     $('#panel').animate({ 
      backgroundColor:'rgba(0,0,0,0.2)', 
      height: "0", 
      padding:"0px 0", 
      }, 500); 
     $('#client-login').animate({ 
      backgroundColor:'rgba(0,0,0,0.2)', 
     }, 500); 
    } 
}); 

Все действие происходит в «заголовок» DIV ...

+0

Как вы хотите, чтобы анимация произошла? Это происходит, когда вы что-то делаете (например, клик), или это происходит, только когда страница загружается/содержимое AJAX перезагружается? –

+0

Анимация происходит при щелчке (точно так же, как slideToggle). Ajax вызовет новую анимацию - исчезнет в новом контенте (возможно, слайд закрыт). Я еще не совсем уверен, как я хочу делать что-то, но главная проблема заключается в щелчке. Я отредактировал сценарий (upadted). –

+0

Работает ли обновленный код? Похоже, это должно ... –

0

Alright, это то, что у меня есть, и это, кажется, работает ... Есть ли лучший способ сделать это?

$(document).ready(function() 
{ 
$("#client-login").css({backgroundColor:'rgba(0,0,0,0.2)'}); 
$(".login").live('mouseover', function(){ 
    $(".login").toggle(
    function() 
    { 
       $('#panel').stop().animate({ 
       height: "150", 
       padding:"20px 0", 
       backgroundColor:'rgba(0,0,0,0.8)', 
      }, 500); 
      $('#client-login').stop().animate({ 
       backgroundColor:'rgba(0,0,0,0.8)', 
      }, 500); 
     }, 
    function() 
    { 
       $('#panel').stop().animate({ 
       backgroundColor:'rgba(0,0,0,0.2)', 
       height: "0", 
       padding:"0px 0", 
       }, 500);  
      $('#client-login').stop().animate({ 
       backgroundColor:'rgba(0,0,0,0.2)', 
      }, 500); 
}); 
}); 
$(".login").live('mouseover', function(){ 

    $('#login-form').ajaxForm({ 
     // success identifies the function to invoke when the server response 
     // has been received; here we apply a fade-in effect to the new content 
     success: function() { 
      $("#client-login .wrap").fadeOut('slow'); 
      $("#client-login .wrap").remove();   
      $("#client-login").load("/ #client-login").fadeIn(2000); 
      $("#panel-content").fadeOut('slow'); 
      $("#panel").load("/ #panel-content").fadeIn(2000); 
      $('#panel').animate({ 
       backgroundColor:'rgba(0,0,0,0.0)', 
       height: "0", 
       padding:"0px 0", 
       }, 500); 
      $('#client-login').animate({ 
       backgroundColor:'rgba(0,0,0,0.2)', 
      }, 500); 
     } 
    }); 
    }); 
}); 
+0

Есть ли особая причина, по которой у вас есть два живых события? –

+0

Это действовало смешно, когда я завернул его в один - я мог бы просто сделать опечатку ... –

0

Я понял!

$(document).ready(function(){ 
    $("#client-login").css({backgroundColor: 'rgba(0,0,0,0.2)'}); 
    var speed = 300; 
    var openpanel = function() { 
      $("#client-login").stop().animate({ 
       backgroundColor: 'rgba(0,0,0,0.8)' 
       },speed); 
      $("#panel").stop().animate({ 
       backgroundColor: 'rgba(0,0,0,0.8)', 
       height: '200px' 
       },speed); 
      $('#panel').removeClass("closed"); 
     }; 
    var closepanel = function() { 
      $("#client-login").stop().animate({ 
       backgroundColor: 'rgba(0,0,0,0.2)' 
       },speed); 
      $("#panel").stop().animate({ 
       backgroundColor: 'rgba(0,0,0,0.2)', 
       height: '0px' 
       },speed); 
      $('#panel').addClass("closed"); 
     }; 
    $(".login").live("click",function() { 
     if ($("#panel").hasClass("closed")) 
     { 
      openpanel(); 
     } else { 
      closepanel(); 
     }; 
    $('#login-form').ajaxForm({ 
     // success identifies the function to invoke when the server response 
     // has been received; here we apply a fade-in effect to the new content 
     success: function() { 
     closepanel(); 
     $("#client-login").load("/ #client-login"); 
     $("#panel").load("/ #panel-content", 1000); 
     } 
    }); 
    }); 
}); 

Спасибо за помощь, Джеймс!

+0

Без проблем! Рад был помочь. –

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