django 中的 Jquery:未捕获的类型错误:无法读取 null 的属性“createDocumentFragment”

Posted

技术标签:

【中文标题】django 中的 Jquery:未捕获的类型错误:无法读取 null 的属性“createDocumentFragment”【英文标题】:Jquery in django : Uncaught TypeError: Cannot read property 'createDocumentFragment' of null 【发布时间】:2021-06-18 21:34:36 【问题描述】:

在我的一生中,我无法弄清楚这段代码有什么问题。它曾经在早期版本中工作,在我重新排列页面底部的 javascript 后,它就无法正常工作。它一直给我这个错误:

它抛出错误的行如下: $('.formset_row').formset(

这是我使用的the jquery plugin。这曾经很完美,直到昨天我可能触摸了我不应该触摸的东西。

    <!-- Select2 JS -->
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>

    <!-- Semantic UI -->
    
   
    
    <script src="https://code.jquery.com/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js" integrity="sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi" crossorigin="anonymous"></script>
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
    <!-- Select2 JS -->
    <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>
    <script src="/static/js/script.js"></script>
    
    
    <script>
        /*$('body').on('focus',".my-date-picker", function()
            $('.my-date-picker').datetimepicker(
                format: 'DD/MM/YYYY',
                ignoreReadonly: true,
                showTodayButton: true
            );
        );*/
    </script>
    <script src="/static/formset/jquery.formset.js"></script>
    <script type="text/javascript">
        $('.formset_row').formset(
            addText: '<div style="color: #34C6AA;" class="my-2 text-center"><span class="oi oi-plus"></span> Add Education</div>',
            deleteText: '<div style="color: #f4816e; text-decoration: none;" class="my-2 text-center"> <span class="oi oi-x"></span> Remove Education</div> ',
            prefix: 'educations'
        );
    </script>



</body>

EDIT1:根据要求分享使用类表单集的代码

% extends '_base.html' %
% load crispy_forms_tags %
% load static %



% block content %
</br>
    <h1 class="display-4 text-responsive">Edit your education information</h1>
<h3 class="display-6 text-muted">This will be visible on your profile</h3>
<p><span style="color: #f4816e;">IMPORTANT:</span></p>
<ul>
    <li>Leave the End Date field empty if you are currently enrolled in your school/university</li>
</ul>
<hr>    
<form method="POST" action=""> 
    % csrf_token % 

     formset.management_form  # This is necessary when using formsets  #
        % for form in formset  %
            
             form.media  # This shit is responsible for showing the datepicker #
            
            
            <div class="formset_row">
            <div class="row">
                    
                    % if forloop.first %
                            % for hidden in form.hidden_fields %
                                 hidden 
                            % endfor %
                    % endif %
                    % for field in form.visible_fields %
                        
                            % if field.name == "start_date" or field.name == 'end_date' %
                                % if  field.name == 'end_date' %
                                    <div class="col-lg-2 col-sm-12 col-md-1">
                                         field.label  
                                         field  </br>
                                        
                                    </div>
                                % else %
                                    <div class="col-lg-2 col-sm-12 col-md-1">
                                         field.label 
                                         field  </br>
                                    </div>
                                % endif %
                            % elif field.name != 'DELETE' %
                                <div class="col-lg-4 col-sm-12 col-md-4">
                                     field.label 
                                     field  </br>
                                </div>
                            % else %
                                 field 
                            % endif %
                        
                        
                    % endfor %
            </div>
            </div>
        % endfor %
    
    <div class="d-block d-sm-none ">
        <input type="submit" name="save_and_next" value="Save and continue to next step" class="btn btn-success btn-block">
        <input type="submit" name="save_and_profile"value="Save and go to profile" class="btn btn-outline-info btn-block">
        <a href="% url 'recruitment:update_coach_prof_exp' %" class="btn btn-light btn-block">Skip step</a>
    </div>
    <div class="d-none d-md-block ">
        <input type="submit" name="save_and_next" value="Save and continue to next step" class="btn btn-success">
        <input type="submit" name="save_and_profile"value="Save and go to profile" class="btn btn-outline-info">
        <a href="% url 'recruitment:update_coach_prof_exp' %" class="btn btn-light">Skip step</a>
    </div>

    
</form>
<script>
    $('body').on('focus',".my-date-picker", function()
        $(this).datetimepicker(
            format: 'DD/MM/YYYY',
            ignoreReadonly: true,
            showTodayButton: true
        );
    );
</script>
<script src="% static 'formset/jquery.formset.js' %"></script>
<script type="text/javascript">
    $('.formset_row').formset(
        addText: '<div style="color: #34C6AA;" class="my-2 text-center"><span class="oi oi-plus"></span> Add Education</div>',
        deleteText: '<div style="color: #f4816e; text-decoration: none;" class="my-2 text-center"> <span class="oi oi-x"></span> Remove Education</div> ',
        prefix: ' formset.prefix '
    );
</script>

% endblock 内容 %

EDIT2:我在 jquery 插件中在 insertDeleteLink = function(row)

之后添加了 console.log(row)

EDIT3:从 jquery 插件中添加了第 76 行(及以上)的内容

最终编辑

最后我通过查找插件的更新分支并替换整个代码解决了这个问题。合并后,我发现不同之处在于 jquery 插件设置。

我实际上对 jquery 一无所知,我无法解释为什么之前它不起作用而现在它起作用了。我能说的是,在插件设置的第二行中,当formTemplate 属性为$.data 时,它不起作用。现在是null,它可以工作了。

如果有人可以在这里为我自己和其他人解释为什么会出现这个错误(而且它是凭空出现的),我会奖励他们。

这个问题给我带来了很大的困扰,虽然现在我已经克服了,我也松了口气,但我还是想了解一下到底发生了什么,以免下次措手不及.此外,我相信许多其他人将从中受益,因为这个特定的插件正在被网络上数百个甚至数千个 Django 网站使用。

【问题讨论】:

你能给我们看看有formset_row类的元素的html吗 这直到昨天才给我带来任何问题。疯狂的是,我尝试恢复旧的提交,但它仍然无法正常工作。 Heyyyy .. uhh .. 有什么消息吗?这个无法解决的错误正在占据我的生活 查看您的模板代码,&lt;div class="formset_row"&gt; 被插入到formset 上下文对象中每个form 的模板中。因为 javascript 错误显示 'cannot read property ... of null' 这意味着 jquery 找不到任何类 formset_row 的 div。这意味着 formset 对象为空。这只是一个猜测,除非您可以在页面上实际看到您的表单 我确实可以看到页面上的表格! 【参考方案1】:

如您所说,将 formTemplate 属性设置为 null 会导致您的表单正常工作。

来自插件的文档:

formTemplate

使用它来覆盖被克隆的表单,每次创建一个新表单 实例已添加。如果指定,这应该是一个 jQuery 选择器。

通过设置此值,您通过加载模板覆盖了整个表单元素。这就是为什么你得到Cannot read property 'createDocumentFragment' of null 错误,jQuery 找不到.formset_row 元素,因为你通过用模板覆盖它来删除它。通过将formTemplate 属性设置为null,插件被指示使用已经存在的元素(也就是不覆盖已经存在的元素)而不是模板(也就是用模板覆盖已经存在的元素)。

我希望这能为您解决问题。 :D

【讨论】:

以上是关于django 中的 Jquery:未捕获的类型错误:无法读取 null 的属性“createDocumentFragment”的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.browser:Javascript 未捕获的类型错误

未捕获的类型错误:无法读取 JQuery DataTable 未定义的属性“mData”

如何解决“未捕获的类型错误:无法读取未定义的属性'参数'”reactjs + django

jsonp 请求中的“未捕获的类型错误:无法读取未定义的属性‘toLowerCase’”

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

jquery:未捕获的类型错误:非法调用