AJAX | jsonãä¸ä¼ æä»¶ãSweetAlertæä»¶
AJAXåå¤ç¥è¯ï¼JSON
1ï¼ä»ä¹æ¯ JSON ï¼
JSON æçæ¯ JavaScript 对象表示æ³ï¼JavaScript Object Notationï¼
JSON æ¯è½»éçº§çææ¬æ°æ®äº¤æ¢æ ¼å¼
JSON ç¬ç«äºè¯è¨ *
JSON å
·æèªææè¿°æ§ï¼æ´æçè§£
- JSON ä½¿ç¨ JavaScript è¯æ³æ¥æè¿°æ°æ®å¯¹è±¡ï¼ä½æ¯ JSON ä»ç¶ç¬ç«äºè¯è¨åå¹³å°ãJSON è§£æå¨å JSON åºæ¯æè®¸å¤ä¸åçç¼ç¨è¯è¨ã
å¥é½å«å¤è¯´äºï¼ä¸å¾å§ï¼
åæ ¼çjson对象ï¼
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["å¼ ä¸", "æå"] }
[ { "name": "å¼ ä¸"}, {"name": "æå"} ]ã
ä¸åæ ¼çjson对象ï¼
{ name: "å¼ ä¸", 'age': 32 } // 屿§åå¿
须使ç¨åå¼å·
[32, 64, 128, 0xFFF] // ä¸è½ä½¿ç¨åå
è¿å¶å¼
{ "name": "å¼ ä¸", "age": undefined } // ä¸è½ä½¿ç¨undefined
{ "name": "å¼ ä¸",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {return this.name;} // ä¸è½ä½¿ç¨å½æ°åæ¥æå¯¹è±¡
}
2ï¼stringifyä¸parseæ¹æ³
JavaScriptä¸å ³äºJSON对象åå符串转æ¢çä¸¤ä¸ªæ¹æ³ï¼
JSON.parse(): ç¨äºå°ä¸ä¸ª JSON å符串转æ¢ä¸º JavaScript 对象
JSON.parse('{"name":"Q1mi"}');
JSON.parse('{name:"Q1mi"}') ; // é误
JSON.parse('[18,undefined]') ; // é误
JSON.stringify(): ç¨äºå° JavaScript å¼è½¬æ¢ä¸º JSON å符串ã
JSON.stringify({"name":"Q1mi"})
3ï¼åXMLçæ¯è¾
JSON æ ¼å¼äº2001å¹´ç± Douglas Crockford æåºï¼ç®çå°±æ¯å代ç¹ç笨éç XML æ ¼å¼ã
JSON æ ¼å¼æä¸¤ä¸ªæ¾èçä¼ç¹ï¼ä¹¦åç®åï¼ä¸ç®äºç¶ï¼ç¬¦å JavaScript åçè¯æ³ï¼å¯ä»¥ç±è§£éå¼æç´æ¥å¤çï¼ä¸ç¨å¦å¤æ·»å è§£æä»£ç ãæä»¥ï¼JSONè¿ é被æ¥åï¼å·²ç»æä¸ºå大ç½ç«äº¤æ¢æ°æ®çæ åæ ¼å¼ï¼å¹¶è¢«åå ¥ECMAScript 5ï¼æä¸ºæ åçä¸é¨åã
XMLåJSONé½ä½¿ç¨ç»æåæ¹æ³æ¥æ è®°æ°æ®ï¼ä¸é¢æ¥åä¸ä¸ªç®åçæ¯è¾ã
ç¨XML表示ä¸å½é¨åç叿°æ®å¦ä¸ï¼
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>ä¸å½</name>
<province>
<name>é»é¾æ±</name>
<cities>
<city>åå°æ»¨</city>
<city>大åº</city>
</cities>
</province>
<province>
<name>广ä¸</name>
<cities>
<city>广å·</city>
<city>æ·±å³</city>
<city>ç æµ·</city>
</cities>
</province>
<province>
<name>å°æ¹¾</name>
<cities>
<city>å°å</city>
<city>é«é</city>
</cities>
</province>
<province>
<name>æ°ç</name>
<cities>
<city>ä¹é²æ¨é½</city>
</cities>
</province>
</country>
ç¨JSON表示å¦ä¸ï¼
{
"name": "ä¸å½",
"province": [{
"name": "é»é¾æ±",
"cities": {
"city": ["åå°æ»¨", "大åº"]
}
}, {
"name": "广ä¸",
"cities": {
"city": ["广å·", "æ·±å³", "ç æµ·"]
}
}, {
"name": "å°æ¹¾",
"cities": {
"city": ["å°å", "é«é"]
}
}, {
"name": "æ°ç",
"cities": {
"city": ["ä¹é²æ¨é½"]
}
}]
}
ç±ä¸é¢ç两端代ç å¯ä»¥çåºï¼JSON ç®åçè¯æ³æ ¼å¼åæ¸ æ°ç屿¬¡ç»æææ¾è¦æ¯ XML 容æé 读ï¼å¹¶ä¸å¨æ°æ®äº¤æ¢æ¹é¢ï¼ç±äº JSON æä½¿ç¨çåç¬¦è¦æ¯ XML å°å¾å¤ï¼å¯ä»¥å¤§å¤§å¾èçº¦ä¼ è¾æ°æ®æå ç¨å¾å¸¦å®½ã
4ï¼AJAXç®ä»
AJAXï¼Asynchronous Javascript And XMLï¼ç¿»è¯æä¸æå°±æ¯â弿¥çJavascriptåXMLâãå³ä½¿ç¨Javascriptè¯è¨ä¸æå¡å¨è¿è¡å¼æ¥äº¤äºï¼ä¼ è¾çæ°æ®ä¸ºXMLï¼å½ç¶ï¼ä¼ è¾çæ°æ®ä¸åªæ¯XMLï¼ã
AJAX 䏿¯æ°çç¼ç¨è¯è¨ï¼èæ¯ä¸ç§ä½¿ç¨ç°ææ åçæ°æ¹æ³ã
AJAX æå¤§çä¼ç¹æ¯å¨ä¸éæ°å è½½æ´ä¸ªé¡µé¢çæ åµä¸ï¼å¯ä»¥ä¸æå¡å¨äº¤æ¢æ°æ®å¹¶æ´æ°é¨åç½é¡µå 容ãï¼è¿ä¸ç¹ç¹ç»ç¨æ·çæåæ¯å¨ä¸ç¥ä¸è§ä¸å®æè¯·æ±åååºè¿ç¨ï¼
AJAX ä¸éè¦ä»»ä½æµè§å¨æä»¶ï¼ä½éè¦ç¨æ·å 许JavaScript卿µè§å¨ä¸æ§è¡ã
åæ¥äº¤äºï¼å®¢æ·ç«¯ååºä¸ä¸ªè¯·æ±åï¼éè¦çå¾
æå¡å¨ååºç»æåï¼æè½ååºç¬¬äºä¸ªè¯·æ±ï¼
弿¥äº¤äºï¼å®¢æ·ç«¯ååºä¸ä¸ªè¯·æ±åï¼æ éçå¾
æå¡å¨ååºç»æï¼å°±å¯ä»¥ååºç¬¬äºä¸ªè¯·æ±ã
示ä¾
页é¢è¾å
¥ä¸¤ä¸ªæ´æ°ï¼éè¿AJAXä¼ è¾å°å端计ç®åºç»æå¹¶è¿åã
HTMLé¨å代ç
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AJAXå±é¨å·æ°å®ä¾</title>
</head>
<body>
<input type="text" id="i1">+
<input type="text" id="i2">=
<input type="text" id="i3">
<input type="button" value="AJAXæäº¤" id="b1">
<script src="/static/jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
$.ajax({
url:"/ajax_add/",
type:"GET",
data:{"i1":$("#i1").val(),"i2":$("#i2").val()},
success:function (data) {
$("#i3").val(data);
}
})
})
</script>
</body>
</html>
def ajax_demo1(request):
return render(request, "ajax_demo1.html")
def ajax_add(request):
i1 = int(request.GET.get("i1"))
i2 = int(request.GET.get("i2"))
ret = i1 + i2
return JsonResponse(ret, safe=False)
urlpatterns = [
...
url(r'^ajax_add/', views.ajax_add),
url(r'^ajax_demo1/', views.ajax_demo1),
...
]
5ï¼AJAX常è§åºç¨æ æ¯
æç´¢å¼ææ ¹æ®ç¨æ·è¾å ¥çå ³é®åï¼èªå¨æç¤ºæ£ç´¢å ³é®åã
è¿æä¸ä¸ªå¾éè¦çåºç¨åºæ¯å°±æ¯æ³¨åæ¶åçç¨æ·åçæ¥éã
å ¶å®è¿é就使ç¨äºAJAXææ¯ï¼å½æä»¶æ¡åçäºè¾å ¥ååæ¶ï¼ä½¿ç¨AJAXææ¯åæå¡å¨åéä¸ä¸ªè¯·æ±ï¼ç¶åæå¡å¨ä¼ææ¥è¯¢å°çç»æååºç»æµè§å¨ï¼æååæå端è¿åçç»æå±ç¤ºåºæ¥ã
æ´ä¸ªè¿ç¨ä¸é¡µé¢æ²¡æå·æ°ï¼åªæ¯å·æ°é¡µé¢ä¸çå±é¨ä½ç½®èå·²ï¼
å½è¯·æ±ååºåï¼æµè§å¨è¿å¯ä»¥è¿è¡å
¶ä»æä½ï¼æ éçå¾
æå¡å¨çååºï¼
å½è¾å ¥ç¨æ·ååï¼æå æ ç§»å¨å°å ¶ä»è¡¨å项䏿¶ï¼æµè§å¨ä¼ä½¿ç¨AJAXææ¯åæå¡å¨ååºè¯·æ±ï¼æå¡å¨ä¼æ¥è¯¢å为lemontree7777777çç¨æ·æ¯å¦åå¨ï¼æç»æå¡å¨è¿åtrue表示å为lemontree7777777çç¨æ·å·²ç»åå¨äºï¼æµè§å¨å¨å¾å°ç»æåæ¾ç¤ºâç¨æ·å已被注åï¼âã
æ´ä¸ªè¿ç¨ä¸é¡µé¢æ²¡æå·æ°ï¼åªæ¯å±é¨å·æ°äºï¼
å¨è¯·æ±ååºåï¼æµè§å¨ä¸ç¨çå¾
æå¡å¨ååºç»æå°±å¯ä»¥è¿è¡å
¶ä»æä½ï¼
AJAXçä¼ç¼ºç¹
ä¼ç¹ï¼
AJAX使ç¨JavaScriptææ¯åæå¡å¨åé弿¥è¯·æ±ï¼
AJAXè¯·æ±æ 须巿°æ´ä¸ªé¡µé¢ï¼
å 为æå¡å¨ååºå
容ä¸åæ¯æ´ä¸ªé¡µé¢ï¼èæ¯é¡µé¢ä¸çé¨åå
å®¹ï¼æä»¥AJAXæ§è½é«ï¼
6ï¼jQueryå®ç°çAJAX
æåºæ¬çjQueryåéAJAX请æ±ç¤ºä¾ï¼
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ajax test</title>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<button id="ajaxTest">AJAX æµè¯</button>
<script>
$("#ajaxTest").click(function () {
$.ajax({
url: "/ajax_test/",
type: "POST",
data: {username: "Q1mi", password: 123456},
success: function (data) {
alert(data)
}
})
})
</script>
</body>
</html>
views.pyï¼
def ajax_test(request):
user_name = request.POST.get("username")
password = request.POST.get("password")
print(user_name, password)
return HttpResponse("OK")
$.ajaxåæ°
dataåæ°ä¸çé®å¼å¯¹ï¼å¦æå¼å¼ä¸ä¸ºå符串ï¼éè¦å°å
¶è½¬æ¢æå符串类åã
$("#b1").on("click", function () {
$.ajax({
url:"/ajax_add/",
type:"GET",
data:{"i1":$("#i1").val(),"i2":$("#i2").val(),"hehe": JSON.stringify([1, 2, 3])},
success:function (data) {
$("#i3").val(data);
}
})
})
7ï¼JSå®ç°AJAX
var b2 = document.getElementById("b2");
b2.onclick = function () {
// åçJS
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", "/ajax_test/", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send("username=q1mi&password=123456");
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
alert(xmlHttp.responseText);
}
};
};
8ï¼AJAX请æ±å¦ä½è®¾ç½®csrf_token
æ¹å¼1
éè¿è·åéèçinputæ ç¾ä¸çcsrfmiddlewaretokenå¼ï¼æ¾ç½®å¨dataä¸åéã
$.ajax({
url: "/cookie_ajax/",
type: "POST",
data: {
"username": "Q1mi",
"password": 123456,
"csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val() // 使ç¨jQueryååºcsrfmiddlewaretokençå¼ï¼æ¼æ¥å°dataä¸
},
success: function (data) {
console.log(data);
}
})
æ¹å¼2
éè¿è·åè¿åçcookieä¸çå符串 æ¾ç½®å¨è¯·æ±å¤´ä¸åéã
注æï¼éè¦å¼å ¥ä¸ä¸ªjquery.cookie.jsæä»¶ã
$.ajax({
url: "/cookie_ajax/",
type: "POST",
headers: {"X-CSRFToken": $.cookie('csrftoken')}, // ä»Cookieåcsrftokenï¼å¹¶è®¾ç½®å°è¯·æ±å¤´ä¸
data: {"username": "Q1mi", "password": 123456},
success: function (data) {
console.log(data);
}
})
æè ç¨èªå·±åä¸ä¸ªgetCookieæ¹æ³ï¼
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
æ¯ä¸æ¬¡é½è¿ä¹å太麻ç¦äºï¼å¯ä»¥ä½¿ç¨$.ajaxSetup()æ¹æ³ä¸ºajax请æ±ç»ä¸è®¾ç½®ã
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
注æï¼
å¦æä½¿ç¨ä»cookieä¸åcsrftokençæ¹å¼ï¼éè¦ç¡®ä¿cookieåå¨csrftokenå¼ã
å¦æä½ çè§å¾æ¸²æçHTMLæä»¶ä¸æ²¡æå å« {% csrf_token %}ï¼Djangoå¯è½ä¸ä¼è®¾ç½®CSRFtokençcookieã
è¿ä¸ªæ¶åéè¦ä½¿ç¨ensure_csrf_cookie()è£ é¥°å¨å¼ºå¶è®¾ç½®Cookieã
django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def login(request):
pass
æ´å¤ç»è详è§ï¼Djagno宿¹ææ¡£ä¸å ³äºCSRFçå 容
9ï¼AJAXä¸ä¼ æä»¶
/
/ ä¸ä¼ æä»¶ç¤ºä¾
$("#b3").click(function () {
var formData = new FormData();
formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());
formData.append("f1", $("#f1")[0].files[0]);
$.ajax({
url: "/upload/",
type: "POST",
processData: false, // åè¯jQueryä¸è¦å»å¤çåéçæ°æ®
contentType: false, // åè¯jQueryä¸è¦å»è®¾ç½®Content-Type请æ±å¤´
data: formData,
success:function (data) {
console.log(data)
}
})
})
ç»ä¹ ï¼ç¨æ·åæ¯å¦å·²è¢«æ³¨åï¼
åè½ä»ç»
卿³¨å表åä¸ï¼å½ç¨æ·å¡«åäºç¨æ·ååï¼æå
æ ç§»å¼åï¼ä¼èªå¨åæå¡å¨åé弿¥è¯·æ±ãæå¡å¨è¿åè¿ä¸ªç¨æ·åæ¯å¦å·²ç»è¢«æ³¨åè¿ã
æ¡ä¾åæ
页é¢ä¸ç»åºæ³¨å表åï¼
å¨username inputæ ç¾ä¸ç»å®onbluräºä»¶å¤ç彿°ã
å½inputæ ç¾å¤±å»ç¦ç¹åè·å username表ååæ®µçå¼ï¼åæå¡ç«¯åéAJAX请æ±ï¼
djangoçè§å¾å½æ°ä¸å¤ç该请æ±ï¼è·åusernameå¼ï¼å¤æè¯¥ç¨æ·å¨æ°æ®åºä¸æ¯å¦è¢«æ³¨åï¼å¦æè¢«æ³¨åäºå°±è¿åâè¯¥ç¨æ·å·²è¢«æ³¨åâï¼å¦åååºâè¯¥ç¨æ·åå¯ä»¥æ³¨åâã
10ï¼åºåå
Djangoå ç½®çserializers
def books_json(request):
book_list = models.Book.objects.all()[0:10]
from django.core import serializers
ret = serializers.serialize(âjsonâ, book_list)
return HttpResponse(ret)
è¡¥å ä¸ä¸ªSweetAlertæä»¶ç¤ºä¾
ç¹å»ä¸è½½Bootstrap-sweetalert项ç®ã
$(".btn-danger").on("click", function () {
swal({
title: "ä½ ç¡®å®è¦å é¤åï¼",
text: "å é¤å¯å°±æ¾ä¸åæ¥äºå¦ï¼",
type: "warning",
showCancelButton: true,
confirmButtonClass: "btn-danger",
confirmButtonText: "å é¤",
cancelButtonText: "åæ¶",
closeOnConfirm: false
},
function () {
var deleteId = $(this).parent().parent().attr("data_id");
$.ajax({
url: "/delete_book/",
type: "post",
data: {"id": deleteId},
success: function (data) {
if (data.status === 1) {
swal("å 餿å!", "ä½ å¯ä»¥åå¤è·è·¯äºï¼", "success");
} else {
swal("å é¤å¤±è´¥", "ä½ å¯ä»¥åå°è¯ä¸ä¸ï¼", "error")
}
}
})
});
})