我的Flask应用程序中有一个表单。我需要通过Javascript(JS)协调表单提交。所需的行为是,在提交表单后,我们立即获得重定向,然后JS与Flask进行对话,Flask发送响应,JS更新DOM。
问题:表单未提交给JS。提交后,输入框中的文本将清除,页面位于此处。没有错误记录到控制台
尽管<script>
标记顺序正确,它们在layout.html
中的位置正确,并且http://localhost:5000/static/index.js
显示了文件,但似乎忽略了我的JS。我插入了console.log
语句来测试是否触发了适当的JS函数。一无所获。我将所有内容都封装在$(document).ready()
中。依然没有。将method="post"
属性放置在<form>
标记中并将name
属性放置在表单的input
框中使我可以直接提交给Flask,但是我需要它去JS。所有这些都在我的机器上播放,所以没有CORS。我要去哪里错了?
必须先转至JS然后到烧瓶的表格
<div class="container">
<div class="display-3">
<strong>Create A Channel</strong>
</div>
<form id="channelForm" class="mt-4">
<label for="channelName">Channel Name</label>
<input id="channelName" class="form-control" type="text" placeholder="Enter Channel Name">
<input type="submit" class="btn btn-primary" value="Create Channel">
</form>
</div>
JS缩写
document.querySelector('#channelForm').onsubmit = () => {
console.log("here");
window.location.href = 'messages.html';
// other stuff that links to Flask route
};
烧瓶路线
@app.route('/channels', methods=["GET", "POST"])
def channels():
channelList = []
if request.method == "POST":
channel = request.form.get("channel")
if not (channel is None) and not (channel in channelList):
channelList.append(channel)
print(channelList)
return jsonify({"success": True, "channel":channelList})
else:
return jsonify({"success": False})
else:
return render_template("channels.html")
layout.html的头部
<head>
{% block head %}
<!-- Bootstrap 4 -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<!-- Additional CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
<!-- JS -->
<script src="{{ url_for('static', filename='index.js') }}"></script>
{% endblock %}
</head>
编辑
当我点击按钮提交表单时,我在终端中看到"GET /static/index.js HTTP/1.1" 200 -
。控制台中仍然没有任何内容,但是由于我单击了提交表单的按钮,所以我认为GET请求是不寻常的。正在期待POST。
答案 0 :(得分:1)
问题是您的表单是通过HTTP协议(传统表单提交)而不是JS提交的。为防止这种情况,您需要停止单击按钮以提交表单:
var form = document.querySelector('#channelForm'),
button = form.querySelector('input.btn-primary');
button.addEventListener('click', function(e) {
e.preventDefault();
console.log('process form data!');
})
此外,请将JavaScript包含内容放置在HTML包含内容之后,以便JS加载时,页面上将JS定位的元素显示在页面上。
答案 1 :(得分:0)
可能正在发生的是来自服务器的响应比您想象的要快。您并没有阻止默认的onsubmit功能,因此实际上可能看不到JS在控制台中运行。为此,您可以尝试在导航设置之间打开保留日志。但是您可能需要阻止默认设置,然后将请求直接发送到服务器:
document.querySelector('#channelForm').onsubmit = (event) => {
event.preventDefault()
...
// AJAX request to your server with your data
};