【问题标题】:loaded form in div, button won't run click function在 div 中加载表单,按钮不会运行点击功能
【发布时间】:2014-10-20 05:40:10
【问题描述】:

jquery:

$(document).ready(function () {
 $("#stusel").change(onSelectChangest);
 $("#schoolsel").change(onSelectChangesc);
 $("#coachsel").change(onSelectChangeco);
 var selval = 0;
 //
 function onSelectChangest(){
   var selected = $("#stusel option:selected");
 //    alert ('Student Selected ' + selected.val());
   selval = selected.val();
   var usertype = '1';
   var pdata = {'usertype' : '1' , 'formtype': selected.val() };
   loadform(pdata);
 };
 // form load function
    function loadform(pdata) {
   $('#msg1').load(
     'makeform.php',
     pdata,
     function (responseText, textStatus, XMLHttpRequest) {
       var tstring = responseText.split('~$~');
       var thestatus = tstring[0];
       var theform = tstring[1];
       if (selval == 4) { // not coded for selection 4 yet
       }
       if (thestatus == 1) {
     // insert the form in the form div
         $('#display').html(theform);
     // open the form div
         $('#dispbox').removeClass('hideme');
     // run the process to make the form live
         loadformjs(selval);
       } else {
         $('#dispbox').addClass('hideme');
         $('#display').html('');
       }
     }
   );
 }
 //loadformjs
 function loadformjs(form) {
 $('#submitme').unbind('click');
 switch (form) {
 case '1':  //login
  $('#submitme').click(function(e) {
  e.preventDefault();
  var user = 'login_name='+ escape($('#uname').val());
  var upass = '&login_pass='+ escape($('#upass').val());
  var utype = '&user_type='+ usertype;
  var pdata = user+upass+utype;
  $.ajax({
    type   : "POST",
    cache  : false,
    url    : "login.php",
    data   : pdata,
    success: function(data) {
     var tstring = data.split('~');
     sysmsg = tstring[1];
     userdata = tstring[2];
     jQuery.cookie( 'userdata', userdata );
     }
    });
  });
 break;
 case '2':   //register
  alert ('loaded theform');
  $('#submitme').click(function(e) {
    alert('before ajax call');
    e.preventDefault();
  });
 break;
 }
} //snipped code here.... Theres more cases, etc.

现在的过程是用户从下拉菜单中选择一个动作,该动作导致一个表单被加载到一个 div 中,当表单被加载时,div 被显示,然后 loadformjs 被运行。它做的第一件事是取消绑定用于提交的按钮,然后它应该重新绑定按钮。

我收到表单已加载的警报。 我收到 loadqueryjs 正在运行的警报 但是当我使用该按钮时,似乎没有任何与点击相关的操作,因为点击的警报没有运行。

表格看起来像:

<center><h1>Registration</h1></center>
<form id=userform>
    <input type=hidden id=usertype value=".$usertype." name=usertype>
    <table border=0>
        <tr><td colspan=2> <center><h3>Required by HSCETP</h3></center></td></tr>
        <tr><td> Your School Code </td><td>
            <input type=text id=scode1 name=scode1 size=10> -
            <input type=text id=scode2 name=scode2 size=10> -
            <input type=text id=scode3 name=scode3 size=10>
        </td></tr>
        <tr><td> Your e-mail (login) </td><td> <input type=text id=email name=email size=50></td></tr>
        <tr><td> Repeat your e-mail (login) </td><td> <input type=text name=emailr size=50></td></tr>
        <tr><td> Your Password </td><td> <input type=password id=password name=password size=50></td></tr>
        <tr><td> Repeat your Password </td><td> <input type=password name=password1 size=50></td></tr>
        ".$reqgrade."
        ".$reqbook."
        ".$reqid."
        <tr><td colspan=2> <center><h3>Optional</h3></center></td></tr>
        ".$optzip."
        <tr><td> Your Name </td><td> <input type=text id=uname name=uname size=50></td></tr>
        <tr><td colspan=2> <button type=button id=submitme>Submit</button>
        </td></tr>
        <tr><td colspan=2>
            Each user account yadd yada yada - general text
        </td></tr>
        ".$adminwarn."
    </table>
</form>

现在是:

<button type=button id=submitme>Submit</button> 

曾经

 <button id=submitme>Submit</button>

但这导致表单提交,所以我添加了 type=button,但现在我什么也没得到。

工作流程是:

  • 用户从选择列表中选择操作
  • 被调用的jquery通过ajax获取表单将表单加载到div中,显示div,调用loadformjs
  • loadformjs 解绑submitme id 然后根据情况重新绑定 将我的 id 提交给新的点击函数
  • 用户完成表单,使用按钮提交并将表单提交到 ajax 进行处理,然后根据表单执行特定操作(如成功注册,用户也会登录)

那么,为什么已经加载到 div 中的表单没有绑定到 submitme id 并在点击时提交?

【问题讨论】:

  • 您听说过委托活动吗?
  • ID submitme 在页面上是唯一的吗?
  • @EhsanSajjad 尽管委托事件更适合动态元素,但我不明白为什么 OP 代码不应该工作。
  • 作为 OP 说内容正在通过 ajax 调用加载]
  • @EhsanSajjad click 事件处理程序正在绑定动态内容添加到页面,所以它应该可以工作。

标签: javascript jquery html ajax forms


【解决方案1】:

所以,问题是在 div 中加载表单。答案是改变 ajax 加载页面的方式。而不是

<form id=userform>
<input type=hidden id=usertype value=".$usertype." name=usertype>
<table border=0>
    <tr><td colspan=2> <center><h3>Required by HSCETP</h3></center></td></tr>
    <tr><td> Your School Code </td><td>
        <input type=text id=scode1 name=scode1 size=10> -
        <input type=text id=scode2 name=scode2 size=10> -
        <input type=text id=scode3 name=scode3 size=10>
    </td></tr>
    <tr><td> Your e-mail (login) </td><td> <input type=text id=email name=email size=50></td></tr>
    <tr><td> Repeat your e-mail (login) </td><td> <input type=text name=emailr size=50 </td></tr>
    <tr><td> Your Password </td><td> <input type=password id=password name=password size=50></td></tr>
    <tr><td> Repeat your Password </td><td> <input type=password name=password1 size=50></td></tr>
    ".$reqgrade."
    ".$reqbook."
    ".$reqid."
    <tr><td colspan=2> <center><h3>Optional</h3></center></td></tr>
    ".$optzip."
    <tr><td> Your Name </td><td> <input type=text id=uname name=uname size=50></td></tr>
    <tr><td colspan=2> <button type=button id=submitme>Submit</button>
    </td></tr>
    <tr><td colspan=2>
        Each user account yadd yada yada - general text
    </td></tr>
    ".$adminwarn."
</table>
</form>

将表单放入第一个程序中,然后从 ajax 调用中加载表单 ID。

最终结果是

<div id=dispbox class=hideme>
<table border=3 width=100%>
 <tr><td>
 <form id=userform>
 </form>
 <tr><td colspan=2> <button type=button id=submitme>Submit</button>
 </td></tr></table>
 </div>

而 ajax 的代码是

function loadform(pdata) {
   $('#msg1').load(
     'makeform.php',
     pdata,
     function (responseText, textStatus, XMLHttpRequest) {
       var tstring = responseText.split('~$~');
       var thestatus = tstring[0];
       var theform = tstring[1];
       var thebutton = tstring[2];
       if (thestatus == 1) {
  // insert the form in the form div
         $('#userform').html(theform);
         $('#submitme').html(thebutton);
   // open the form div
         $('#dispbox').removeClass('hideme');
       } else {
         $('#dispbox').addClass('hideme');
       }
     }
   );
  }

现在激活提交按钮的代码可以通过 case 语句运行,该语句仅根据表单设置要提交的适当 ajax 程序

使用此方法允许将所有表单加载到一个 div 中,表单的所有过程都通过一个按钮完成,而不是唯一处理每个表单输入,我使用 jquery.form.js 发送表单在 beforesubmit 中使用 case 语句重置正在调用的程序并在 aftersubmit 中进行后处理。

因此,基本规则是……您不能将 div 中的表单加载到页面中,然后针对它处理 jquery。这似乎是一个 dom 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多