Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表单提交未被Javascript捕获_Javascript_Jquery_Html_Ajax_Django - Fatal编程技术网

表单提交未被Javascript捕获

表单提交未被Javascript捕获,javascript,jquery,html,ajax,django,Javascript,Jquery,Html,Ajax,Django,我试图捕获HTML表单(由Django呈现)的提交,并使用ajax处理它,而不是重定向到新页面,但是javascript函数似乎从未被调用。以下是我的呈现html: <form action="" id="id_create_review" method="post"> <div id="div_id_session" class="form-group"> <label for="id_session" class="control-label ">

我试图捕获HTML表单(由Django呈现)的提交,并使用ajax处理它,而不是重定向到新页面,但是javascript函数似乎从未被调用。以下是我的呈现html:

<form action="" id="id_create_review" method="post">

<div id="div_id_session" class="form-group">
    <label for="id_session" class="control-label ">
        Session
    </label>
    <div class="controls ">
        <select class="select form-control" id="id_session" name="session">
            <option value="" selected="selected">---------</option>
            <option value="1">Rocky Balboa Boxing Club</option>
            <option value="2">All about the Box...ing</option>
        </select>
    </div>
</div>

<div id="div_id_rating" class="form-group">
    <label for="id_rating" class="control-label  requiredField">
        Rating<span class="asteriskField">*</span>
    </label>
    <div class="controls ">
        <select class="select form-control" id="id_rating" name="rating">
            <option value="0.0">0.0</option>
            <option value="0.5">0.5</option>
            <option value="1.0">1.0</option>
            <option value="1.5">1.5</option>
            <option value="2.0">2.0</option>
            <option value="2.5" selected="selected">2.5</option>
            <option value="3.0">3.0</option>
            <option value="3.5">3.5</option>
            <option value="4.0">4.0</option>
            <option value="4.5">4.5</option>
            <option value="5.0">5.0</option>
       </select>
   </div>
</div>

<div id="div_id_comments" class="form-group">
    <label for="id_comments" class="control-label  requiredField">
                    Comments<span class="asteriskField">*</span>
    </label>
    <div class="controls ">
        <textarea class="textarea form-control" cols="40" id="id_comments" name="comments" rows="10"></textarea>
    </div>
</div>

<div class="form-group">
    <div id="div_id_would_recommend" class="checkbox">
        <label for="id_would_recommend" class="">
            <input checked="checked" class="checkboxinput checkbox" id="id_would_recommend" name="would_recommend" type="checkbox">
            Would recommend
        </label>
    </div>
</div>

<div class="form-group">
    <div id="div_id_anonymous" class="checkbox">
        <label for="id_anonymous" class="">
            <input checked="checked" class="checkboxinput checkbox" id="id_anonymous" name="anonymous" type="checkbox">
             Anonymous
        </label>
    </div>
</div>

<div class="form-actions">
    <input type="submit" name="submit" value="Send Review" class="btn btn-primary" id="submit-id-submit"> 
</div>

</form>

一场
---------
洛基巴尔博亚拳击俱乐部
所有关于盒子的事…都很有趣
评级*
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
评论*
会推荐
匿名的
下面是我的javascript:

<script type="text/javascript">
$(document).ready(function() {
    $('#id_create_review').submit(function() { // catch the form's submit event
        console.log('Yeah, no?');
        $.ajax({ // create an AJAX call...
            data: $(this).serialize(), // get the form data
            type: $(this).attr('method'), // GET or POST
            url: $(this).attr('action'), // the file to call
            success: function(response) { // on success..
                $('#success_div').html(response); // update the DIV
            },
            error: function(e, x, r) { // on error..
                $('#error_div').html(e); // update the DIV
            }
        });
        return false;
    });
});
</script>

$(文档).ready(函数(){
$('#id_create_review').submit(函数(){//捕获表单的提交事件
console.log('是,否?');
$.ajax({//创建一个ajax调用。。。
数据:$(this).serialize(),//获取表单数据
类型:$(this.attr('method'),//GET或POST
url:$(this.attr('action'),//要调用的文件
成功:函数(响应){//on success。。
$('#success_div').html(response);//更新div
},
错误:函数(e,x,r){//出错。。
$('#error_div').html(e);//更新div
}
});
返回false;
});
});
编辑

所以现在发生的是,我得到一个403错误,因为CSRF保护失败。我有一些javascript应该可以防止这个403错误,如果请求是用ajax发出的,我也没有看到“Yeah,no?”登录到控制台,所以我认为表单必须通过标准Http提交

也许我的问题是表单正在被javascript处理,但是ajax请求仍然导致403错误?但是为什么我在JS中看不到控制台日志呢

如果问题是我的ajax请求导致了403错误,为什么我的保护代码无法发送csrf令牌?我不能说我百分之百地理解它。。。我主要是从使用django处理ajax请求的在线教程中获得的。代码如下:

<script>
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');

/*
The functions below will create a header with csrftoken
*/

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
function sameOrigin(url) {
    // test that a given url is a same-origin URL
    // url could be relative or scheme relative or absolute
    var host = document.location.host; // host + port
    var protocol = document.location.protocol;
    var sr_origin = '//' + host;
    var origin = protocol + sr_origin;
    // Allow absolute or scheme relative URLs to same origin
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
        (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
        // or any other URL that isn't scheme relative or absolute i.e relative.
        !(/^(\/\/|http:|https:).*/.test(url));
}

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url)) {
            // Send the token to same-origin, relative URLs only.
            // Send the token only if the method warrants CSRF protection
            // Using the CSRFToken value acquired earlier
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
</script>

函数getCookie(名称){
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i
尝试一下:

$(document).ready(function() {
    $('#id_create_review').submit(function() { // catch the form's submit event
        console.log('Yeah, no?');
        console.log($(this).serialize());
        var postdata = $(this).serializeArray();
        var url = $(this).attr('action');
        $.post(url , postdata, function(){
            //
        })
        return false;
    });
});

尝试创建一个隐藏的输入字段,并将csrftoken放入其值中…如下所示:

<input type="hidden" value="{% csrf_token %}">


如果您的错误是由csrf保护引起的,那么这就足够了。

感谢所有提供解决方案的人。我最终解决了这个问题,将脚本移动到表单所在的django模板中

我有一个主django模板,其中包括一个使用{%include%}标记的较小的django模板,表单就在这个包含的模板中。最初,我使用javascript在主模板底部捕获表单的提交。我认为这很好,因为所有模板都将被呈现到一个大的HTML文件中,所以它不会真正影响哪个代码在哪个模板中,但显然它确实。。。当我把我的脚本移动到我的小模板中时,问题就消失了。不知道为什么会发生这种情况。

Django文档

include标记应被视为“呈现此子模板并包含HTML”的实现,而不是“解析此子模板并包含其内容,就好像它是父模板的一部分”。这意味着包含的模板之间没有共享状态–每个包含都是一个完全独立的渲染过程


这就是为什么你必须移动脚本。我以前没有意识到这一点。

您试过调试脚本吗?代码看起来似乎有道理。。。很可能是与您显示的代码无关的东西(如重复ID或脚本中的语法错误)…我创建了这个。代码似乎工作正常,请检查控制台。如果不正常,请检查jQuery库脚本标记