AJAX、CORS、jQuery、表单提交

news/2024/7/10 23:39:38 标签: javascript, jquery

AJAX、jQuery、CORS

需求

自己做了个问答系统,客户端用户在前端页面提出问题,问题需要提交到后台(不同域的服务端,不同域:域名,端口等有一个不同就是跨域问题),后台给出问题答案后返回前端进行异步刷新(ajax)。

遇到的问题

  • 如何实现局部刷新(异步刷新

    • ajax 可以实现异步传输数据、局部刷新
  • 在上个问题基础上遇到了,ajax跨域问题

    • 跨域常见的方法有jsonp,CORS技术
    • jsonp只能发送GET请求,CORS可以发送GET或者POST等
    • CORS主要是在服务端配置允许请求的域信息(我的服务端采用的flask,底层是WSGI服务协议)
  • 前端 form提交时数据没有提交成功

    • 注意看浏览器控制台是否报错,最开始报错‘$.ajax func is not found’,是因为我引入的jQuery是slim版本,其中的ajax被移除了,故需要重新引入包含ajax的jquery.js文件
    • 包问题解决后发现form表单数据还是提交不成功,经过各种摸索,试验,最后发现普通的 按钮,默认的type=‘submit’,会自动提交数据,导致页面刷新(相当于自己编写的ajax函数没有得到请求结果就被刷新覆盖了),而在form外部是可以提交成功的,但是这样我们就无法获得表单的提交信息了。解决:input 、button 想要在form内部顺利提交表单(能够执行ajax并返回结果,不被强制刷新页面),都需显示指定type=‘button’
  • 浏览器缓存问题
    以link、script 文件方式引入的文件修改后要清楚浏览器缓存才能看到效果。否则会出现代码都对了,但是达不到效果,也不知到问题出在哪里的现象,这个问题很容易被忽视。

  • 局部更改 带有!import 的css属性问题

    • js有个 ‘cssText’ 属性,存储了当前元素的所有css值,我们可以通过在这个cssText基础上增加、覆盖值来更改
javascript">$("#card-header").text("查询成功").css("cssText","background-color:#28a745 !important;color:#fff;");

前端

method one:
javascript"><script>
    $(document).on("click","#btn",get_answer); //绑定按钮
    function get_answer(){
        var start_time = get_time();
        var question = $("#question").get(0).value;

        if (question == ''){
            return false;
        }

       $.ajax({
            type:'post',
            data:{"question":question},
            url:'http://127.0.0.1:5000/',
            async:true,
            dataType:"json",
            // xhrFields: {withCredentials: true}, //加这个报错,暂时不知道为啥???
            success:function (data,status) {
                console.log("status : " + status);
                console.log("answer : " + data['answer']);
                console.log("valid answer : " + data['valid_answer'])

                $("#answer").text(data['answer']);
                var time_consume = get_time() - start_time;
                var valid_answer = data['valid_answer'];

                if (valid_answer == "true"){
                    console.log("valid answer true comes")
                    $("#card-header").text("查询成功").css("cssText","background-color:#28a745 !important;color:#fff;");
                }
                else {
                    console.log("valid answer false comes");
                    $("#card-header").text("查询失败").css("cssText","background-color:#dc3545 !important;color:#fff;");
                }

                $("#time_consume").text("用时: " + time_format(time_consume) + "s");


                console.log("花费时间 : " + time_consume.toString());
            },
           error:function(){
                console.log("Request error.")
                var err_msg = "请求服务器出错,请稍后尝试。"
                $("#answer").text(err_msg);
            }
        })
    }

function get_time() {
     return new Date().getTime();
}

function time_format(time) {
    var seconds = time / 1000;
    return seconds.toFixed(2); // 保留2位小数
}
</script>

<form action="" class="flex justify-content-center align-items-center">
     <div class="input-group">
         <input type="text" class="form-control" placeholder="请输入问题" id="question">
         <button type="button" id="btn" class="btn btn-secondary" onclick="get_answer()">
             <span class="fa fa-search"></span>
         </button>
     </div>
</form>
method two:
javascript">// get_answer 函数 同上,可以把onclick直接写在input里面。实现绑定
<form action="" class="flex justify-content-center align-items-center">
     <div class="input-group">
         <input type="text" class="form-control" placeholder="请输入问题" id="question">
            <input type="button" class="btn btn-secondary" onclick="get_answer()">
                 <span class="fa fa-search"></span>
             </input>
     </div>
</form>

后端(基于Flask)

from flask import Flask,request,make_response,jsonify
from flask_cors import * # 解决ajax 跨域问题请求

app = Flask(__name__)
# r'/*' 是通配符,让本服务器所有的URL 都允许跨域请求
# CORS(app, resources=r'/*',supports_credentials=True) # supports_credentials=True 多加会报错,暂时不知道原因
CORS(app, resources=r'/*')

@app.route("/",methods=('GET', 'POST'))
def index():
    global handler

    if request.method == 'POST':
        print("get post request")
        question = request.form['question']
        answer = handler.question_answer_main(question)
        if answer == "非常抱歉,这个问题超出小医的能力范围!":
            valid_answer = "false"
        else:
            valid_answer = "true"

        result_text = {"statusCode": 200, "answer": answer,"valid_answer":valid_answer}

        response = make_response(jsonify(result_text)) # jsonify 返回json格式数据
        response.headers['Access-Control-Allow-Origin'] = '*'
        # response.headers['Access-Control-Allow-Credentials'] = 'true'
        response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,HEAD,GET,POST'
        response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'

        return response

    else:
        question = request.args.get('question')
        answer =  handler.question_answer_main(question)
    return answer

http://www.niftyadmin.cn/n/786455.html

相关文章

Decorator(装饰器模式)

介绍 要理解装饰器模式&#xff0c;我们来帮助pizza公司设计一个额外加顶计算器。用户可以要求给pizza加额外的顶料&#xff08;就是你吃拉面的浇头&#xff09;&#xff0c;然后我们的工作就是将顶料加上&#xff0c;然后计算相应的价格。 什么是装饰器模式 装饰器模式主要用于…

企业级实战——品优购电商系统开发 - 130 .131 .132 . 三级分类下拉框

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。 叮叮叮&#xff1a;产品已上线 —>关注 …

【得分排行】

/* 得分排行 */ #include<stdio.h> #include<stdlib.h>#define MAX 100 #define MIN 0 int main(void) {int score[MAX 1] {0};int juni[MAX 2] {0};int count 0, i;printf("输入分数&#xff0c; -1 结束&#xff1a;");do{scanf("%d",…

flask debug=True 不生效

1. 原因 1.02版本后&#xff0c;app.run()方法失效 2. 方法1 在pycharm中选择’Teminal’ 进入当前解释器环境并设置set FLASK_DEBUG1 set > set.txt 把环境变量重定向到set.txt 找到FLASK_ENV则说明设置成功&#xff0c;然后运行flask run 命令总结&#xff1a; set F…

企业级实战——品优购电商系统开发 - 133 . 134. 读取模板ID 品牌列表

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。 叮叮叮&#xff1a;产品已上线 —>关注 …

centos7 mysql安装失败_给centos7装mysql失败,服务器刚初始化的,安装教程是官网的

其实我的安装没有问题,唯一的问题就是和官方文档给出的示例不一样导致我以为自己错了..试着硬着头皮往下走没什么大问题..打扰了..服务器是刚刚初始化磁盘之后的 centos7 的阿里云服务器.所有的步骤都按照官网的安装教程:https://dev.mysql.com/doc/mys...错误出在第四步启动 m…

企业级实战——品优购电商系统开发 - 136. 拓展属性

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。 叮叮叮&#xff1a;产品已上线 —>关注 …

通俗易懂的理解 python 装饰器

举例 def play():print("小王在玩游戏")sleep(3)print("游戏结束") 我想计算play花费的时间 def play():start time.time()print("小王在玩游戏")sleep(3)print("游戏结束")end time.time()print("用时{:.2f}".format(…