一、准备知识:json

1.什么是json?

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。任何的语言之间都可以用json进行数据的交换

2、回顾json的dumps和loads方法

  1. import json
  2.  
  3. ##json序列化##
  4. d={"name":"egon","age":12}
  5.  
  6. data=json.dumps(d)
  7.  
  8. print(data) #{"name": "egon", "age": 12}
  9. print(type(data)) #<class 'str'>
  10. f=open("a.txt","w")
  11.  
  12. f.write(data)
  13. f.close()
  14.  
  15. ## 反序列化##
  16.  
  17. f=open("b","r")
  18.  
  19. data=f.read()
  20. data=json.loads(data)
  21. print(data) #{'name': 'Yuan'}
  22. print(type(data)) #<class 'dict'>

3、json字符串概念

  1. i=10
  2. s='hello'
  3. l=[111,222,333]
  4. b=True
  5. t=(1,2,3)
  6. d={'name':'yuan'}
  7.  
  8. print(json.dumps(i)) # '10' json 字符串
  9. print(json.dumps(s)) # '"hello"'
  10. print(json.dumps(l)) # '[111, 222, 333]'
  11. print(json.dumps(t)) # '[1, 2, 3]'
  12. print(json.dumps(d)) # '{"name": "yuan"}'
  13. print(json.dumps(b)) # '{"name": "yuan"}'

4、json对象概念

  1. json对象是JS的对象子集,并且json对象只认双引号

不合格的json对象

  1. { name: "张三", 'age': 32 } // 属性名必须使用双引号
  2.  
  3. [32, 64, 128, 0xFFF] // 不能使用十六进制值
  4.  
  5. { "name": "张三", "age": undefined } // 不能使用undefined
  6.  
  7. { "name": "张三",
  8. "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
  9. "getName": function() {return this.name;} // 不能使用函数和日期对象
  10. }

5、stringify与parse方法

python中json模块有dumps和loads方法,而在js语言中有stringify与parse方法

  1. JSON.parse(): 用于将一个 JSON 字符串转换为 JavaScript 对象 
  2. eg:
  3. console.log(JSON.parse('{"name":"Yuan"}'));
  4. console.log(JSON.parse('{name:"Yuan"}')) ; // 错误
  5. console.log(JSON.parse('[12,undefined]')) ; // 错误
  6.  
  7. JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。 
  8. eg: console.log(JSON.stringify({'name':"egon"})) ;
  1. <script>
  2.  
  3. // JS 的json序列化与反序列化方法
  4.  
  5. // parse()
  6. s='{"name":1}';
  7. var data=JSON.parse(s);
  8. console.log(data);
  9. console.log(typeof data); //object
  10.  
  11. // stringfy
  12.  
  13. s2={'name':'yuan'};
  14. console.log(JSON.stringify(s2)) // '{"name":"yuan"}'
  15. console.log(typeof JSON.stringify(s2)); //string
  16.  
  17. </script>

6、如在读取json数据时,数据过长不好浏览时,可用bejson工具查看

二、Ajax简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。
功能:是JS的一种向后端服务器发送数据技术,也就是说在js语言中使用,写在js文件中,或者<script>标签中

AJAX的特点

 -  异步处理

 -  局部刷新

三、jquery实现的ajax

注意:         var btn=$(this)           //在ajax中不能直接用$(this) ,因为作用域不一样  ,所以在这里先赋值给一个变量,然后用变量

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. </head>
  9. <body>
  10.  
  11. <a href="/get_OK/">点击</a><span class="error"></span>
  12. <hr>
  13. <p>姓名<input type="text"></p>
  14. <p>密码<input type="password"></p>
  15. <p><button class="Ajax_send">Ajax_send</button><span class="login_error"></span></p>
  16.  
  17. <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
  18. <script>
  19. $(".Ajax_send").click(function () {
  20. // ajax请求
  21.  
  22. $.ajax({
  23. url:"/get_ajax/", //请求路径
  24. type:"GET", //请求方式
  25. data:JSON.stringify({ //请求数据
  26. name:$(":text").val(),
  27. pwd:$(":password").val()
  28. }), // 请求数据 ,是js数据 ?name=yuan&pwd=123
  29. contentType:"application/json",
  30.  
  31. //不指定请求类型时
  32. {# data:{ #}
  33. {# name:$(":text").val(), #}
  34. {# pwd:$(":password").val() #}
  35. {# }, #}
  36. success:function (data) { //data是形参
  37. var data=JSON.parse(data);
  38. console.log(data);
  39. console.log(typeof data);
  40. // $(".error").html(data) 找到span标签,加上数据
  41.  
  42. if(!data["flag"]){ //如果验证错误
  43. $(".login_error").html("用户名或者密码错误")
  44. }
  45. }
  46. })
  47. })
  48. </script>
  49. </body>
  50. </html>
  1. --------------urls.py
  2.  
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^get_ajax/', views.get_ajax),
  6. ]
  7.  
  8. --------------views.py
  9.  
  10. #不指定传输数据的类型时
  11. def get_ajax(request):
  12.  
  13. username=request.GET.get("name")
  14. password=request.GET.get("pwd")
  15.  
  16. response={"flag":False}
  17. if username=="yuan" and password=="":
  18. response["flag"]=True
  19. import json
  20. import time
  21.  
  22. time.sleep(10) #验证异步的特点
  23. return HttpResponse(json.dumps(response))
  24.  

get/post两种方式分别发送默认编码 urlencode 和 json 格式的数据

  1. ---------------------views.py
  2.  
  3. def asd(request):
  4. print(request.GET)
  5. print(request.POST)
  6. print(request.body)
  7.  
  8. return HttpResponse('OK')
  9.  
  10. ---------------------.html
  11.  
  12. $.ajax({
  13. url:/asd/,
  14. type:'get',
  15. data:{
  16. a:22,
  17. b:33
  18. },
  19. success:function () {
  20. alert(222)
  21. }
  22. })
  23.  
  24. 结果:
  25. <QueryDict: {'a': [''], 'b': ['']}>
  26. <QueryDict: {}>
  27. b''
  1. ---------------------views.py
  2.  
  3. def asd(request):
  4. print(request.GET)
  5. print(request.POST)
  6. print(request.body)
  7.  
  8. return HttpResponse('OK')
  9.  
  10. ---------------------.html
  11.  
  12. $.ajax({
  13. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  14. url:/asd/,
  15. type:'get',
  16. data:JSON.stringify({
  17. a:22,
  18. b:33
  19. }),
  20. contentType:"application/json",
  21.  
  22. success:function () {
  23. alert(222)
  24. }
  25. })
  26.  
  27. 结果:
  28. <QueryDict: {'{"a":22,"b":33}': ['']}>
  29. <QueryDict: {}>
  30. b''
  1. ---------------------views.py
  2.  
  3. def asd(request):
  4. print(request.GET)
  5. print(request.POST)
  6. print(request.body)
  7.  
  8. return HttpResponse('OK')
  9.  
  10. ---------------------.html
  11. $.ajax({
  12. url:/asd/,
  13. type:'post',
  14. data:{
  15. a:22,
  16. b:33
  17. },
  18. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  19. success:function () {
  20. alert(222)
  21. }
  22. })
  23.  
  24. 结果:
  25. <QueryDict: {}>
  26. <QueryDict: {'a': [''], 'b': ['']}>
  27. b'a=22&b=33'
  1. ---------------------views.py
  2.  
  3. def asd(request):
  4. print(request.GET)
  5. print(request.POST)
  6. print(request.body)
  7.  
  8. return HttpResponse('OK')
  9.  
  10. ---------------------.html
  11. $.ajax({
  12. url:/asd/,
  13. type:'post',
  14. data:JSON.stringify({
  15. a:22,
  16. b:33
  17. }),
  18. contentType:"application/json",
  19. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  20. success:function () {
  21. alert(222)
  22. }
  23. })
  24.  
  25. 结果:
  26. <QueryDict: {}>
  27. <QueryDict: {}>
  28. b'{"a":22,"b":33}'

结论:所以无论用那种请求方式或者发送的什么数据,首先在视图函数中先打印一下GET、POST、body,看结果后再取值

  1. PS:
      request.body # 一定有值
      request.POST # application/x-www-form-urlencoded/数据格式 :name=alex&age=123
      
  2.  
  3.       #方式一:
  4. $.ajax({
  5. url:'xx',
  6. type:'post',
  7. data: JSON.stringfy(pList),
  8. headers:{'Content-Type':'application/json'},
  9. //contentType:'json',
  10. success:function(arg){
  11.  
  12. }
  13.  
  14. })
  15. # 使用request.body取值
  16. json.loads(request.body.decode('utf-8'))
  17.  
  18. # 方式二:
  19. $.ajax({
  20. url:'xx',
  21. type:'post',
  22. data: {k1: JSON.stringfy(pList),'age':18} // k1="[....]"&age=18
  23. success:function(arg){
  24. }
  25.  
  26. })
  27. # 使用request.post取值
  28. json.loads(request.POST.get('k1'))

1.    $.ajax参数

请求参数:

  1. ######################------------data---------################
  2.  
  3. data: 当前ajax请求要携带的数据,是一个jsonobject对象,ajax方法就会默认地把它编码成某种格式
  4. (urlencoded:?a=1&b=2)发送给服务端;此外,ajax默认以get方式发送请求。
  5.  
  6. function testData() {
  7. $.ajax("/test",{ //此时的data是一个json形式的对象
  8. data:{
  9. a:1,
  10. b:2
  11. }
  12. }); //?a=1&b=2
  13. ######################------------processData---------################
  14.  
  15. processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;iffalse
  16. 那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString()
  17. ,最后得到一个[objectObject]形式的结果。
  18.  
  19. ######################------------contentType---------################
  20.  
  21. contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。
  22. 用来指明当前请求的数据编码格式;urlencoded:?a=1&b=2;如果想以其他方式提交数据,
  23. 比如contentType:"application/json",即向服务器发送一个json字符串:
  24. $.ajax("/ajax_get",{
  25.  
  26. data:JSON.stringify({
  27. a:22,
  28. b:33
  29. }),
  30. contentType:"application/json",
  31. type:"POST",
  32.  
  33. }); //{a: 22, b: 33}
  34.  
  35. 注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象
  1. $.ajax({
  2. url: "" ,    // 请求路径
  3. type:"" ,    // 请求方式
             data:{"name":"yuan"} //请求数据
                 if  processData=false //不对数据做预处理,不涉及编码类型
                 if  processData=true
                        设计编码类型:
                  contentType:默认值: "application/x-www-form-urlencoded"
  4. successfunction(data){      // data形参
  5. }
  6. })

 注意点

  1. data:JSON.stringify({
  2. a:22,
  3. b:33
  4. }),
  5. contentType:"application/json",
  6. type:"POST",
  7. 当指定contentTypejson时,data内的数据一定要转成json字符串,并且当是post请求时 csrf_token 要用header的方式传送,因为你在data内手动添加键值对的方式
    在指定contentType时,ajax不会按照默认的urlencode的方式做处理了,那就不会解析出csrf的数据了,故被forbidden

响应参数

  1. dataType 客户端期望服务器返回的数据类型,服务器端返回的数据会根据这个值解析后,传递给回调函数。
  2. 默认不需要显性指定这个属性,ajax会根据服务器返回的content Type来进行转换;
  3. 比如我们的服务器响应的content Typejson格式,这时ajax方法就会对响应的内容
  4. 进行一个json格式的转换,if转换成功,我们在success的回调函数里就会得到一个json格式
  5. 的对象;转换失败就会触发error这个回调函数。如果我们明确地指定目标类型,就可以使用data Type
  6. dataType的可用值:htmlxmljsontextscript
  7. 见下dataType实例
  1. from django.shortcuts import render,HttpResponse
  2. from django.views.decorators.csrf import csrf_exempt
  3. # Create your views here.
  4.  
  5. import json
  6.  
  7. def login(request):
  8.  
  9. return render(request,'Ajax.html')
  10.  
  11. def ajax_get(request):
  12.  
  13. l=['alex','little alex']
  14. dic={"name":"alex","pwd":123}
  15.  
  16. #return HttpResponse(l) #元素直接转成字符串alexlittle alex
  17. #return HttpResponse(dic) #字典的键直接转成字符串namepwd
  18. return HttpResponse(json.dumps(l))
  19. return HttpResponse(json.dumps(dic))# 传到前端的是json字符串,要想使用,需要JSON.parse(data)
  20.  
  21. //---------------------------------------------------
  22. function testData() {
  23.  
  24. $.ajax('ajax_get', {
  25. success: function (data) {
  26. console.log(data);
  27. console.log(typeof(data));
  28. //console.log(data.name);
  29. //JSON.parse(data);
  30. //console.log(data.name);
  31. },
  32. //dataType:"json",
  33. }
  34. )}
  35.  
  36. 注解:Response Headerscontent Typetext/html,所以返回的是String;但如果我们想要一个json对象
  37. 设定dataType:"json"即可,相当于告诉ajax方法把服务器返回的数据转成json对象发送到前端.结果为object
  38. 当然,
  39. return HttpResponse(json.dumps(a),content_type="application/json")
  40.  
  41. 这样就不需要设定dataType:"json"了。
  42. content_type="application/json"content_type="json"是一样的!

2.csrf跨站请求伪造

方式1

  1. $.ajaxSetup({
  2. data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
  3. });
    在使用ajax前配置此配置,但是这种方法有局限性,只有此配置和要返回的html文件在用一个文件内才起作用,如在插件内使用不起作用

方式2

  1.   {% csrf_token %}
      ...
      ...
  2.  
  3. $.ajax({
  4.  
  5.   data:{
  6.     "csrfmiddlewaretoken":'4PoazPJ2ZfCcoogiCmCLrsl0TmMQheDxrk0mKHJ9KwfbN1zFbdp6C890mU8xfU6y'
        ...
        ...
  7.   },
    })
  8.  
  9. 在页面内添加  {% csrf_token %} ,并且在ajax data中添加新的键值对

方式3

  1. <script src="{% static 'js/jquery.cookie.js' %}"></script>
  2.  
  3. $.ajax({
  4. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  5. })
  6.  
  7. 引用js/jquery.cookie.js文件或cdn,在ajax之前配置此配置,此方法100%有效

3.  jQuery.serialize()

  3.1 serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串

  serialize()函数常用于将表单内容序列化,以便用于AJAX提交。

  该函数主要根据用于提交有效表单控件的name和value,将它们拼接为一个可直接用于表单提交的文本字符串,该字符串已经过标准的URL编码处理(字符集编码为UTF-8)。

  该函数不会序列化不需要提交的表单控件,这和常规的表单提交行为是一致的。例如:不在<form>标签内的表单控件不会被提交、没有name属性的表单控件不会被提交、带有disabled属性的表单控件不会  被提交、没有被选中的表单控件不会被提交。

  1. 与常规表单提交不一样的是:常规表单一般会提交带有name的按钮控件,而serialize()函数不会序列化带有name的按钮控件。

  3.2 语法:找到要序列化的表单→  .serialize()

  1.    data:$('#s1').serialize()

  3.3 返回值

  serialize()函数的返回值为String类型,返回将表单元素编码后的可用于表单提交的文本字符串。

  3.4  可以对表单内的所有数据都进行序列化,也可以对部分数据序列化

  1.   $(":text, select, :checkbox").serialize()

四、上传文件

1. form表单实现的上传文件

  1. <form action="/upload/" method="post" enctype="multipart/form-data">
  2. {% csrf_token %}
  3. <p>用户名<input type="text" name="user"></p>
  4. <p>头像<input type="file" name="avatar"></p>
  5. <input type="submit">
  6. </form>
  7.  
  8. -----------------------------
  9. def upload(request):
  10. if request.method=="POST":
  11. print("POST", request.POST) #POST <QueryDict: {'csrfmiddlewaretoken': ['wwOnWaSQRIHiczZvmOG5ApqLv4Y8EPDMcFG5Tmevk9NNWoHD4zbxiX0TW9NL4kGE'], 'user': ['asd']}>
  12. print("FILES",request.FILES) # FILES <MultiValueDict: {'avatar': [<InMemoryUploadedFile: 111111.png (image/png)>]}>
  13.  
  14. file_obj=request.FILES.get("avatar")
  15. print(file_obj,type(file_obj)) #111111.png <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
  16. print(file_obj.name,"-----") #111111.png -----
  17. with open(file_obj.name,"wb") as f:
  18. for i in file_obj:
  19. f.write(i)
  20.  
  21. return HttpResponse("成功")
  22. return render(request,"upload.html")

2.Ajax(FormData) 实现的上传文件

使用FormData的最大优点就是我们可以异步上传一个二进制文件.

代码部分:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. <style>
  9. .login_error{
  10. color: red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15.  
  16. <form action="" id="s1">
  17. <p>姓名<input type="text"></p>
  18. <p>密码<input type="password"></p>
  19. <p>头像<input type="file" id="upload_avatar"></p>
  20. </form>
  21.  
  22. <p><button class="Ajax_send">Ajax_send</button><span class="login_error"></span></p>
  23.  
  24. <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
  25. <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
  26.  
  27. <script>
  28. function foo() {
  29. $(".login_error").html("")
  30. }
  31. $(".Ajax_send").click(function () {
  32.  
  33. var formData=new FormData();
  34. formData.append("username",$(":text").val());
  35. formData.append("password",$(":password").val());
  36. formData.append("avatar",$("#upload_avatar")[0].files[0]);
  37. //$("#upload_avatar")[0].files[0]==File {name: "1.png", lastModified: 1508844386855, lastModifiedDate: Tue Oct 24 2017 19:26:26 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 286658, …}
  38.  
  39. // ajax请求
  40. $.ajax({
  41. url:"/get_ajax/",
  42. type:"POST",
  43. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  44. data:formData,
  45. contentType:false,
  46. processData:false,

  47. success:function (data) {
  48. var data=JSON.parse(data);
  49. console.log(data);
  50. console.log(typeof data); //object
  51.  
  52. if(!data["flag"]){
  53. $(".login_error").html("用户名或者密码错误")
  54. setTimeout(foo,3000)
  55. }
  56. }
  57. })
  58. })
  59. </script>
  60.  
  61. </body>
  62. </html>
  1. def get_ajax(request):
  2.  
  3. username=request.POST.get("username")
  4. password=request.POST.get("password")
  5. print("FIFLE",request.FILES)
  6. print("POST",request.POST)
  7. response={"flag":False}
  8. if username=="yuan" and password=="":
  9. response["flag"]=True
  10. import json
  11. return HttpResponse(json.dumps(response))

  

python-day81--Ajax的更多相关文章

  1. python处理ajax请求

    先要起一个服务 server.py,可以支持python的cgi脚本. #!coding:utf8 from BaseHTTPServer import HTTPServer from CGIHTTP ...

  2. python json ajax django四星聚会

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  3. Python 之Ajax

    1.使用Ajax在后台传递参数的示例 要使用Ajax传递参数,需要使用jquery,使用jquery需要注意以下几点. 1.建立static的目录,将jquery导入 2.在项目s13day18_dj ...

  4. python 模拟ajax查询社工库...

    在windows中使用,输入有关信息查询社工库,本来是网页版的,我把ajax请求提取出来.粗略的封装下,挺好玩. #coding:utf8 import urllib2,urllib from Bea ...

  5. Python开发—Ajax系列

    概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  6. Python:ajax 学习笔记

    什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味 ...

  7. python与 Ajax跨域请求

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...

  8. Python之AJAX

    AJAX <script> $("#i4").on("click", function () { var i1 = $("#i1" ...

  9. Python 20 Ajax全套

    概述 对于web应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  10. Python Django Ajax 传递列表数据

    function getTableContent(node) { event.preventDefault(); var tr = node.parentNode.parentNode; var id ...

随机推荐

  1. P2153 [SDOI2009]晨跑

    思路 典型的最小费用最大流问题,拆点,每个点对应的入点和出点之间连一条cap=1的边表示只能经过一次的限制条件 然后其他边从u的出点连向v的入点即可 代码 #include <cstdio> ...

  2. SalGAN: Visual saliency prediction with generative adversarial networks

    SalGAN: Visual saliency prediction with generative adversarial networks 2017-03-17 摘要:本文引入了对抗网络的对抗训练 ...

  3. 数据集是 seq 文件的处理办法

    数据集是 seq 文件的处理办法 2017-03-17 最近下了一个数据集,是 seq 格式的,第一次处理这种数据.使用了官方提供的 matlab 工具包:https://pdollar.github ...

  4. 给大家分享两套WordPress收费主题

    主题一:No.7 – 极简 by 大当家 1.主题网址:http://qzhai.net/2016-03-546.html 2.主题预览:http://qzhai.net/000/?theme=No. ...

  5. B树,B+树比较

    首先注意:B树就是B-树,"-"是个连字符号,不是减号.也就是B-树其实就是B树 B-树是一种平衡的多路查找(又称排序)树,在文件系统中有所应用.主要用作文件的索引.其中的B就表示 ...

  6. Thread类的常用方法

    String getName() 返回该线程的名称. void setName(String name) 改变线程名称,使之与参数 name 相同. int getPriority() 返回线程的优先 ...

  7. 使用MapperScannerConfigurer简化MyBatis配置

    MyBatis的一大亮点就是可以不用DAO的实现类.如果没有实现类,Spring如何为Service注入DAO的实例呢?MyBatis-Spring提供了一个MapperFactoryBean,可以将 ...

  8. springcloud问题随笔

    http://www.cnblogs.com/EasonJim/p/8085120.html 1.调用其它服务返回could not be queued for execution and no fa ...

  9. JavaScript 调试常见报错以及原因

    JavaScript 调试常见报错以及原因 测试环境 chrome 版本 66.0.3359.170(正式版本) (64 位) TypeError 类型错误 不是操作符所接受的数据类型. //---- ...

  10. ngui 适配iphone x

    using UnityEngine; using System.Collections; [RequireComponent(typeof(UIPanel))]public class FixedUI ...