【问题标题】:My ajax script will run once correctly but it wont run again我的 ajax 脚本将正确运行一次,但不会再次运行
【发布时间】:2013-10-15 04:43:00
【问题描述】:

所以我的代码似乎有一些问题。现在我刚刚开始学习 AJAX 和 jquery,所以我很陌生。他们网站的运作方式是:

当用户单击“登录”按钮时,在输入用户名和密码的按钮下方会出现一个表单。当用户单击登录时,我的 ajax 脚本将处理登录并刷新他们的头像,以便他们知道自己已登录。然后,当他们想要注销时,他们单击注销,然后将它们注销没有问题。

我遇到的问题是,一旦我完成了登录/注销过程,我无法在不刷新页面的情况下再次显示表单。

我希望我说得通 =/ 这是我的代码:

<script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/jscript"></script>
<script>
  $(function () {
    $('form').on('submit', function (e) {
      $.ajax({
        type: 'post',
        url: 'loginsystem/login.php',
        data: $('form').serialize(),
        success: function () {
            $("#loginForm").slideUp('slow');
            $("#playerFace").load('ajaxPHPScripts/getUserAvatar-100px.php');
            $("#loginLogout").load('ajaxPHPScripts/loginLogoutButton.php');
        }
      });
      e.preventDefault();
    });
  });
function doSomething() {
    $.ajax({
        type: 'get',
        url: 'loginsystem/logout.php',
        success: function () {
            $("#playerFace").load('ajaxPHPScripts/getUserAvatar-100px.php');
            $("#loginLogout").load('ajaxPHPScripts/loginLogoutButton.php');
        }
      });
}
$(document).ready(function(){
    $("#loginForm").hide();
  $("#loginbtn").click(function(){
    $("#loginForm").slideToggle('slow');
  });
});
$(document).ready(function() {
    $("#removeLoginForm").click(function(){
        $("#loginForm").slideUp('slow');
    });
});
</script>

现在是 html:

<div id="sidebar">
            <div id="sidebarinner">
                <div id="sidebarInnerInner">
                    <div id="playerAvatar">
                        <table width="100%" border="0" cellspacing="0" cellpadding="0">
                          <tr>
                            <td style="width:100px;" id="playerFace"><img src="https://minotar.net/avatar/steve/100"></td>
                            <td style="text-align:center;"><?php ServerPing(); //pings to see if server is online?></td>
                          </tr>
                        </table>
                    </div>
                    <div id="joinAndLog">
                        <table width="100%" border="0" cellspacing="0" cellpadding="0" style="text-align:center; height:100%;">
                            <tr>
                                <td style="width:50%;" id="loginLogout"><?php LoginOrLogout(); ?></td>
                                <td style="width:50%;"><?php SignupOrManageAcc(); ?></td>
                            </tr>
                        </table>
                    </div>

                    <div id="loginForm">
                        <form class="sideForm" id="testform" style="text-align:center;  margin-bottom:10px;"> 
                            <input type="text" id="name" name="username" value="" placeholder="Username..."/> 
                            <br />
                            <input type="password" id="pass" name="password" value="" placeholder="Password..."/> 
                            <br />
                            <input id="submit" type="submit" name="submit" value="Login" style="width:25%; cursor:pointer;" /> 
                            <input type="reset" name="" value="Cancle" id="removeLoginForm" style="width:25%; cursor:pointer;" />
                            <br />
                            <!--a href="#" style="padding:0px; margin:0px;">Forgot Password</a-->
                        </form> 
                     </div>
</div>

【问题讨论】:

    标签: javascript jquery html ajax login


    【解决方案1】:

    如果您正在动态加载内容,那么您需要将静态事件处理程序重新绑定到动态加载内容中的对象,或者您需要使用仍可处理动态加载内容的委托事件处理程序。委托事件处理程序是更优雅的解决方案。

    委托的事件处理程序如下所示:

    $('#sidebar').on('submit', '#loginForm', function() {...});
    

    理想情况下,您应该在特定的登录表单上放置一个 id(我在我的代码示例中建议 "loginForm" 并使用它而不是 "form" 作为目标选择器,这样您就知道事件处理程序只针对正确的表单。

    使用绑定到非动态创建/销毁的父元素的委托事件处理,但针对该静态父元素内的特定动态内容的选择允许您保持事件处理程序有效,即使目标内容是销毁然后重新加载。

    【讨论】:

    • 啊,我将不得不阅读委托事件处理程序。至于表单选择器,如果我这样做form#randomId 会起作用吗?
    • @TomasCordero - 没有理由使用form#randomId。 ID 在页面中是唯一的,因此没有理由在它们之前加上任何其他内容。只需为表单选择一个有意义且描述性的名称并使用它。这就是为什么我建议"#loginForm"
    【解决方案2】:

    您需要像第一个表单一样绑定新加载的表单。

    所以,在你加载新的 HTML 之后,你需要再次运行这样的东西:

    $('form').on('submit', function (e) {
      $.ajax({
        ///// snip /////
      });
      e.preventDefault();
    });
    

    由于这个内部函数是重复的,所以你不妨在外部定义它。

    var onFormSubmit = function (e) {
      $.ajax({
        ///// snip /////
      });
      e.preventDefault();
    }
    

    现在要将表单绑定到该函数,您只需执行以下操作:

    $('form').on('submit', onFormSubmit);

    【讨论】:

    • 这只会让表单在再次混乱之前工作一次吗?或者它会让表格保持工作?我会试一试,但我只是想听听你要说的话=)
    • 那应该在你的成功函数里面,所以每次加载一个新表单时,它都会被绑定。顺便说一句,您可能想在其他地方定义这个函数......我将编辑我的答案,详细说明我的意思。
    • 哦,这很有道理!非常感谢你!所以基本上这将是一个循环?只是不使用任何 while、for 或 do while
    • 不完全是一个循环......如果你愿意,一个手动循环。基本上当前的问题是您有一个表单,并且您告诉浏览器在提交表单时执行一些特殊操作(这就是 $('form').on('submit', ...) 所做的)。当您执行 ajax 操作时,您正在将一个新表单加载到页面中。提交这个新表单时浏览器不知道该怎么做,所以你需要告诉它。
    • 如果您愿意,也可以按照@jfriend00 的建议使用委托事件处理程序......我相信它对浏览器来说效率更高(尽管在这种情况下差异可以忽略不计),但它也是一个要学习的新概念,所以我省去了额外的复杂性。 :)
    【解决方案3】:

    更新代码:

    $(document).ready(function(){
     $("#loginForm").hide();
     $("#loginbtn").on('click',function(){ // use .on() method
     $("#loginForm").slideToggle('slow');
    });
    });
    $(document).ready(function() {
     $("#removeLoginForm").on('click',(function(){ // use .on() method
     $("#loginForm").slideUp('slow');
    });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多