博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表单onsubmit事件无效以及表单onsubmit使用ajax无效解决
阅读量:6897 次
发布时间:2019-06-27

本文共 2989 字,大约阅读时间需要 9 分钟。

  hot3.png

今天在做登陆页面,想法是这样的:

    前台提交表单给后台,如果用户名密码不正确,就提示用户用户名密码不对,并不跳转,也不重定向,而当用户名和密码输入正确的时候,跳转到登陆之后的页面。

 

这个过程需要用到的技术主要就是ajax技术和js的onsubmit(onclick也可以)技术。

过程如下:

1.用户输入用户名和密码

2.当用户点击submit按钮时,先执行onsubmit函数,利用ajax进行用户名密码验证。

3.1验证不通过,onsubmit返回false,表单无法提交,页面提示用户密码有错。

3.2验证通过,onsubmit返回true,表单提交,服务器返回用户内部视图,登陆成功。

 

表单如下:

 

onclick中的方法必须有一个return,不然无论如何都会提交表单。(原理你应该懂得!)

这里有一个必须注意的地方:ajax有两种方式,一种是同步方式,一种是异步方式。

粗略地讲,如果有下面这段js脚本:

如果是同步方式:当1执行完毕后,接着执行ajax,线程会处于等待状态,等2执行完毕之后,接着执行3.

如果是异步方式:当1执行完毕之后,接着执行ajax,但是ajax不会阻塞主线程,ajax执行的同时会执行3.

因此,当使用异步方式进行验证的时候,会出现无论如何,onsubmit(onclick)都不会起作用,这会让程序员感觉自己的代码有问题,其实代码没问题,是逻辑的问题。要解决这个问题,我们就必须用ajax的同步方式。

下面展示错误的ajax验证方式:

function checkpwd(){   //由checkuser调用此函数			var state = 0;						var url = "checkpwd.do";			var args = {"password":document.getElementById("password").value}; 			$.POST(url,args,function(data){				if(data == "false")  state = 0;				else if(data == "true")  state = 1;			});			if(state == 1) return true;			else return false;	}

因此,这种方式将会导致在执行$.POST的时候下面的代码已经执行了,所以看到ajax根本没效果。

原因是:jquery中封装的$.POST和$.GET使用的是异步的方式。因此我们不能使用$.POST和$.GET或者说需要将其设置为同步方式。为了简便,我们还是使用$.ajax(),因为这个封装的函数中用户可以自定义使用同步方式或者使用异步方式。 当然使用js原始的XMLHttpRequest......

下面是正确的方式:

function checkpwd(){			var state = 0;						/* var url = "checkpwd.do"; */			/* var args = {"password":document.getElementById("password").value}; */			/* $.POST(url,args,function(data){				if(data == "false")  return false;				else if(data == "true")  return true;			}); */						$.ajax({		          type : "post",		          url : "checkpwd.do",		          data : "password=" + document.getElementById("password").value,		          async : false,		          success : function(data){		            if(data == "true") state=1;		          }		     });			if(state == 1) return true;			else return false;		}

这样的话,会执行完毕ajax之后才进行返回操作。

 

这里是ajax的一些参考示例

原始ajax使用:

function loadXMLDoc(){	var xmlhttp;	if (window.XMLHttpRequest)	{		//  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码		xmlhttp=new XMLHttpRequest();	}	else	{		// IE6, IE5 浏览器执行代码		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");	}	xmlhttp.onreadystatechange=function()	{		if (xmlhttp.readyState==4 && xmlhttp.status==200)		{			document.getElementById("myDiv").innerHTML=xmlhttp.responseText;		}	}	xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);   //true表示使用异步方式	xmlhttp.send();}

使用jQuery封装的ajax:

1.load()函数.

$(document).ready(function(){	$("button").click(function(){		$("#div1").load("/try/ajax/demo_test.txt");	});});

2.get()函数.

$(document).ready(function(){	$("button").click(function(){		$.get("/try/ajax/demo_test.php",function(data,status){			alert("数据: " + data + "\n状态: " + status);		});	});});

3.ajax.

$.ajax({		          type : "post",		          url : "checkpwd.do",		          data : "password=" + document.getElementById("password").value,		          async : false,		          success : function(data){		            if(data == "true") state=1;		          }		     });

 

转载于:https://my.oschina.net/qkmc/blog/872778

你可能感兴趣的文章
ASP.NET Core 一步步搭建个人网站(4)_主页和登录验证
查看>>
黄聪:在Photoshop中创建不规则无缝拼接图案(转)
查看>>
[Java学习笔记]Java Tips
查看>>
sqlserver字符串合并(merge)方法汇总
查看>>
(转载)模拟银行自助终端系统
查看>>
SQL位移运算函数
查看>>
SQL2008关于权限的解释
查看>>
boost学习之安装
查看>>
quartz定时器-spring.xml写法
查看>>
Java网络编程
查看>>
C语言下动态库相互调用
查看>>
Newtonsoft.Json高级用法
查看>>
Pair Work之总结
查看>>
简易计算器WinForm方式
查看>>
Python时间序列选择波动率预测指数收益算法分析案例
查看>>
Linux之磁盘命令学习
查看>>
A List of Pages a Peoplesoft Role Name can Access
查看>>
1. Two Sum
查看>>
当当网上书店购物车——CSS源码
查看>>
数据库连接池
查看>>