Ajax 异步局部刷新

Ajax 异步局部刷新

    AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
    通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
    传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

实现json 字符串与 JavaScrip 对象得相互转换 JSON.parse()和 JSON.stringify()

1.序列化(将JavaScrip 转换为 json)使用 JSON.stringify()

console.log(JSON.stringify({'name':"baolin"}));

2.反序列化(将json转换为JavaScrip)使用 JSON.parse()

console.log(JSON.parse('{"name":"baolin"}'));

Csrf跨站请求伪造

 向Django后台提交数据时,需要csrf_token验证所以需要定义该键值对;
 

设置Csrf验证以及向后端传送数据

1.定义csrf_token
{% csrf_token %}

2.伪造键值对向后端发csrfmiddlewaretoken 键值对

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
</head>
<body>

<p>
    <input type="text" class="num1">+<input type="text" class="num2">=<input type="text" class="ret">
    {% csrf_token %}
    <input id="cal" type="button" value="求和">
</p>

<script>
    $("#cal").click(function () {
        var num1=$(".num1").val();        // 获取 input 输入的 val值
        var num2=$(".num2").val();
        $.ajax({
            url:"/cal/",                {# 发送 ajax 的url #}
            type:"post",                {# 请求方式为 post或get #}
            data:{                      {# date 表示向后端发送的值,如果没有数据需要发送可以省略 #}
                "num1":num1,        {# 向后端提交得数据 #}
                "num2":num2,
                csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()    // 当使用POST提交数据是,需要scrf_token验证 (固定格式)
            },
            success:function (data) {   // 回调函数,如果该ajax执行成功返回该函数,date 为/send_ajax/返回的值

                $(".ret").val(data)     // 将返回得数据 写入到class 为 ret 得输入空中
            }
        })
    });
</script>

3.urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^cal/', views.cal),
]

4.views.py

def cal(request):
    if request.method == "POST":
        # 获取前端 ajax 传入得值
        num1 = request.POST.get("num1")
        num2 = request.POST.get("num2")

        # 将值转换为 int 类型
        ret = int(num1) + int(num2)

        # 返回结果
        return HttpResponse(ret)
    return render(request,"cal.html")

通过Ajax实现页面的登陆功能

1.urls.py 路由配置

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),            # 页面登陆窗口
    url(r'^index/', views.index),            # 页面首页窗口
    url(r'^logout/', views.log_out),         # 退出用户
    url(r'^reg/', views.reg),                # 添加用户
    url(r'^set_pwd/', views.set_pwd),        # 修改当前用户密码
]

2.views.py 视图函数

from django.shortcuts import render, redirect, HttpResponse

from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
import json

def login(request):
    if request.method == "POST":
        username = request.POST.get("user")
        password = request.POST.get("pwd")

        # 验证 通过 ajax 获取的 用户密码是否正确
        users = auth.authenticate(username=username, password=password)

        # 定义一个 字典,用于将数据 序列化 传给前端
        loginResponse={"user":None,"errorMsg":None}
        if users:
            # 如果验证成功 定义 session 值
            auth.login(request, users)
            # 将字典user 赋值
            loginResponse["user"]=username

        else:
            # 验证失败 在errorMsg 赋值
            loginResponse["errorMsg"]="用户名或密码错误"

        # 将字典返回给前端
        return HttpResponse(json.dumps(loginResponse))
    return render(request,"login.html")

# 使用Django自带得装饰器login_required 实现验证
# 验证失败跳转到 /login/ 路径,否则返回 index.html 页面
@login_required(login_url='/login/')
def index(request):
    return render(request, "index.html")

3.login.html 前端模板展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
</head>
<body>

{#用户登录#}
<form action="">
    {% csrf_token %}
    <p>姓名 <input type="text" class="user"></p>
    <p>密码 <input type="password" class="pwd"></p>
    <input type="button" value="提交" class="loginBnt"><span class="errorInfo"></span>
</form>

<script>
    // ajax 用户登录
    $(".loginBnt").click(function () {
        $.ajax({
            url:"/login/",
            type:"post",
            data:{
                user:$(".user").val(),
                pwd:$(".pwd").val(),
                csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
            },
            success:function (data) {
                // data 是后端接收到 json字符串
                var data=JSON.parse(data);    {# 将json字符串序列化为js类型字典 #}

                if(data["user"]){
                    location.href="/index/";    {# 如果登录成功,在前端进行页面跳转 #}
                }
                else {
                    console.log(data["errorMsg"]);
                    var error_msg = data["errorMsg"];                       {# 如果登录不成功,取出后端发挥的错误信息 #}
                    $(".errorInfo").html(error_msg).css("color","red");     {# 将错误信息放到按钮后面 #}

                    setTimeout(function () {            {# 3秒钟后 让提示信息消失 #}
                        $(".errorInfo").html("");
                    },3000)
                }
            }
        })
    })
</script>
</body>
</html>

####################index.html 模板
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
        <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
        <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
        <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</head>
<body>
    <nav class="navbar navbar-inverse">
{#        #}
        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav navbar-right">
            <li><a href="#">{{ request.user }}</a></li>
            <li><a href="/logout/">注销</a></li>
            <li><a href="/reg/">添加用户</a></li>
            <li><a href="/set_pwd/">修改密码</a></li>
          </ul>
        </div><!-- /.navbar-collapse -->
    </nav>
</body>
</html>
时间: 2024-10-16 14:26:54

Ajax 异步局部刷新的相关文章

js(三) ajax异步局部刷新技术底层代码实现

ajax 异步 javaScript and xml 开发五步骤: 1. 创建对象 XMLHttpRequest(chrome,firefox) ie... jquery 2. 找到连接, http的method方法    GET|POST    PUT DELETE 3. 注册监听器  有数据返回之后,就会自动调用该方法(不是一次 3次) 4. 发送请求 POST PUT delete 请求数据 5. 处理请求 1 <%@ page language="java" conten

Ajax实时局部刷新

//Ajax实现局部刷新      <script type="text/javascript">    var xmlhttp;    function getData()    {      //获取用户填写的名称      var city=document.getElementById("txt").value;      //创建异步调用对象      xmlhttp=new ActiveXObject("Microsoft.XMLH

使用php后台给自己做一个页面路由,配合ajax实现局部刷新。

今天就要放假了,把近来囤积的小玩意儿总结整理一下. 在请求一个html页面来嵌入到当前页会有一个问题,就是跟随请求过来的html他的样式表和脚本会失效.是因为文档加载的先后顺序等问题造成的.因此,加载一些纯文本还好. 举个例子,只有这个问题明白了,我们的原理才好理解. b.html有一个点击事件,但是a.html通过ajax拿到b.html后,如果这个b.html的js不是写在页面里面的,你就会发现没有生效.css样式也一样,都需要重新绑定一下. 首先定义两个页面,一个父页面a.html,一个b

ajax实现局部刷新

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>demo</title></head><body><div class="maxBox"> <span class="T-active indexA">首页</span

通过javascript&amp;&amp;ajax实现局部刷新

使用形式如下: function showli_1(){ //通过一个按钮onclick触发函数 var xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET","/ajax_js_war_exploded/EmpServlet?flag=1",true);//定义上传的方式,要传输的Servlet和?后加要传输的数据,数据之间以逗号分隔开,定义是否为异步 xmlhttp.send(); //将请求发送 xmlhttp.on

easyui的datagrid整合struts2,以及Ajax,实现局部刷新功能,并设置分页的实现---------投票案例

========================================================================================================= 1.登陆功能- ----表单内容----------------------------------------------------- <pre name="code" class="java"><div class="log

基于H5 pushState和Ajax完美实现页面局部刷新

众所周知使用Ajax可以局部刷新提高用户体验,然而url不跟随改变是其一大弊端. 如果修改浏览器地址栏的url,同时不刷新整个页面就完美了. 先来看看什么是pushState? 给history对象增加一个状态. window.history.pushState(stateData, 'title', 'newUrl'); // stateData用于事件参数 window.addEventListener('popstate', function(){ var state = window.h

局部刷新登录页面的实现方法

局部刷新的登录就是在一个页面上有一个登录框,登录之后交给后台异步处理,处理完成之后会在前端显示出来登录的用户信息,最常见的例子就是登陆优酷的时候我们可以看到URL登录之后没有变化(事实上,优酷用的方式不是局部刷新的方式,很明显可以看到整个页面刷新了,所以优酷的实现方式就是不是局部刷新,但是一时间没有找到例子).最近打算做一个博客的网站的项目,登录这里想要提供给用户提供一个更加良好的体验,就想到了利用ajax实现局部刷新,但是又想到了第二次登录的时候会需要判断登录过之后需要直接显示用户信息而不是登

使用ajax实现无刷新改变页面内容

如何使用ajax实现无刷新改变页面内容(也就是ajax异步请求刷新页面),下面通过一个小demo说明一下,前端页面代码如下所示 1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="p_tg.aspx.cs" Inherits="p_tg" %> 2 3 <!DOCTYPE html> 4 5 <html> 6 <head&