2009-06-01 48 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

我不确定我的语法是否正确。这很有用,但我必须点击它两次才能初始化......我不知道该怎么做!请原谅我的无知! – 2009-06-01 01:17:59

+0

你能发表你的语法吗? – 2009-06-01 01:40:56

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内容重新加载时发生? – 2009-06-01 04:26:18

+0

动画发生在点击上(就像slideToggle)。 ajax将调用一个新的动画 - 淡入新内容(可能幻灯片关闭)。我并不十分确定我是如何做事的,但主要问题在于点击。 我编辑了脚本(向上)。 – 2009-06-01 16:07:01

+0

更新的代码是否工作?看起来应该... – 2009-06-01 19:08:58

0

好吧,这是我和它似乎工作... 有没有更好的方式来做到这一点?

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

是否有一个特别的原因,你有两个现场活动? – 2009-06-03 00:08:41

+0

当我把它裹在一个 - 我可以只是犯了一个错字,它表现得很滑稽... – 2009-06-03 02:24:02

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

没问题!乐于帮助。 – 2009-06-03 22:50:01