无法从模态内的表单捕获提交事件-获取$不是函数

问题描述 投票:0回答:1

[我正在Symfony 5框架中构建一个调度程序/花名册应用程序,其后有webpack,并与Jquery一起处理(以及其他)基于用户的操作(例如单击单元格)。

[当用户单击一个单元格时,将弹出一个模式,该模式中包含一个链接到该单元格的数据的表单。我想捕获模态中包含的表单的提交,然后向后端触发AJAX调用,以便存储数据。

请参阅下面到目前为止我拥有的当前JQUERY代码。我当前捕获了show.bs.modal事件。之后,我想保留默认的提交动作,并用我自己的动作替换。

但是,当我尝试这样做时,我得到了臭名昭著的“ $不是函数”错误。

我已经尝试了几种方法(甚至在模态本身中包括了javascript),但即使在这里它也失败了。我现在有点卡住。

有人知道我做错了吗?

我什至在函数中尝试了jquery.noconflict()方法,但这也不幸失败了。

require('../css/app.css');
require('../css/global.scss');
require('bootstrap-datepicker/dist/css/bootstrap-datepicker.css');
require('@fortawesome/fontawesome-free/css/all.min.css');

// Need jQuery? Install it with "yarn add jquery", then uncomment to require it.
const $ = require('jquery');
const routes = require('../../public/js/fos_js_routes.json');

require('bootstrap');
require('bootstrap-datepicker');

import Routing from '../../vendor/friendsofsymfony/jsrouting-bundle/Resources/public/js/router.min.js';

import dt from 'datatables.net';
import dtbs4 from 'datatables.net-bs4';
import dtbs4fh from 'datatables.net-fixedheader-bs4';
import dtbs4sel from 'datatables.net-select-bs4';

var moment = require('moment');
moment().format();
Routing.setRoutingData(routes);

$( document ).ready(function() {

    var table = $("#calendarSchedule").DataTable({
        select: {
            style: 'os',
            items: 'cell',
            info: false
        }
    });
    jQuery.noConflict(); 
    //table.on( 'select', function ( e, dt, type, indexes ) {
        //e.preventDefault();
        //if ( type === 'cell' ) {
            var clickDate = undefined;
            var dt = undefined;
            var cell = undefined;
            var colIndex = undefined;

            $('.dataTable').on('click', 'tbody td div', function() {

            var x = event.clientX;
            var y = event.clientY;
            var w = $(window).width();

            dt = $('#YearMonth').text();
            clickDate = this.id;
            console.log(clickDate);

            if(this.id.indexOf("-")== -1){
                var url = Routing.generate('schedule_viewModal', { id: this.id });
                $("#scheduleModal").load(url);
                $("#scheduleModal").find('schedule_entry').trigger('reset');
                var element = document.getElementById("scheduleModal");

                if(x + 500 > w){
                    element.style.left = w - 500 + "px";  
                } else {
                    element.style.left = x + "px";
                }        

                element.style.top = y + "px";
                $("#scheduleModal").modal('show');
            } else {
                var dayType = $(this).attr("class").split(" ")[0];
                console.log(dayType);
                var url = Routing.generate('schedule_createModal', { dt: clickDate, type: dayType });
                $("#scheduleModal").load(url);
                $("#scheduleModal").find('schedule_entry').trigger('reset');
                var element = document.getElementById("scheduleModal");

                if(x + 500 > w){
                  element.style.left = w - 500 + "px";  
                } else {
                  element.style.left = x + "px";
                }        
                element.width = 250 + "px";
                element.height = 250 + "px";
                element.style.top = y + "px";
                $("#scheduleModal").modal('show');

                if($(this).find("div").length == 0){
                    var x = event.clientX;
                    var y = event.clientY;
                    var w = $(window).width();
                }
              };
        });

     $('#scheduleModal').on('shown.bs.modal', function () {

            $('.js-new-form').on('submit', function(e){
            e.preventDefault();
            route = '{{ path("schedule_jsonNew") }}';
            var dt = document.getElementById('schedule_entry_ScheduleDate').value;
            var tp = document.getElementById('schedule_entry_ScheduleType').value;
            var cat = document.getElementById('schedule_entry_Category').value;
            var emp = document.getElementById('schedule_entry_Employee').value;

            var entry = {date: dt, type: tp, category: cat, employee: emp};
            var data = JSON.stringify(entry);
            console.log(data);
            $.ajax({
                url: route,
                type: "POST",
                dataType: "json",
                data: data,
                async: true,
                success: function () {
                    console.log('succes');
                    location.reload();
                },
                error: function () {
                    console.log('fail');
                    location.reload();
                },

            })
        });
        var $=jQuery.noConflict();
        $('#btnClose').on('click', function(e){
            //location.reload();
        });
        $(".js-close-modal").click(function(){
            console.log("bla");
          $(".modal").removeClass("visible");
        });
});   

});

下面是模态本身的树枝模板:

{# empty Twig template #}
{% trans_default_domain 'messages' %}

  <div class="modal__header">
      {% trans %}schedule.new{% endtrans %}
  </div>    
        <div class="container-fluid">


            {{ form_start(form,  {
                'attr': {
                'class': 'js-new-form',
                'id': 'js-new-form' }})}}

                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                        {{ form_label(form.ScheduleDate, 'schedule.ScheduleDate'|trans({}, 'messages')) }}
                     </div>
                    <div class="col-md-6">
                        {{ form_widget(form.ScheduleDate) }}
                    </div>
                </div>

                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                        {{ form_label(form.ScheduleType, 'schedule.ScheduleType'|trans({}, 'messages')) }}
                     </div>
                    <div class="col-md-6">
                        {{ form_widget(form.ScheduleType) }}
                    </div>
                </div>    
                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                        {{   'schedule.scheduleCategory'|trans({}, 'messages') }}
                     </div>
                    <div class="col-md-6">
                        {{ form_widget(form.scheduleCategory) }}
                     </div>     
                </div>
                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                        {{   'schedule.scheduleEmployee'|trans({}, 'messages') }}
                     </div>
                    <div class="col-md-6">
                        {{ form_widget(form.scheduleEmployee) }}
                     </div>     
                </div>          
                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                     </div>
                    <div class="col-md-6">
                        {{ form_errors ( form ) }} 
                     </div>     
                </div>        
                <div style="margin-bottom: 5px; margin-top: 5px" class="row">
                    <div class="col-md-6">
                        <button type="button" class="btn btn-secondary" data-dismiss="modal" id="btnClose">Close</button>
                     </div>
                    <div class="col-md-6">
                        {{ form_widget(form.schedulesave) }}
                     </div>     
                </div>     

            {{ form_end(form) }}


    </div>
javascript jquery forms webpack bootstrap-modal
1个回答
0
投票
推荐:

我认为绑定有问题。您可以从.on('shown.bs.modal'中删除绑定。由于jquery需要开箱即用进行绑定。当前的代码就像一次又一次地绑定。可以避免的。

$('#scheduleModal').on('shown.bs.modal', function () { }) $('.js-new-form').on('submit', function(e){ e.preventDefault(); route = '{{ path("schedule_jsonNew") }}'; var dt = document.getElementById('schedule_entry_ScheduleDate').value; var tp = document.getElementById('schedule_entry_ScheduleType').value; var cat = document.getElementById('schedule_entry_Category').value; var emp = document.getElementById('schedule_entry_Employee').value; var entry = {date: dt, type: tp, category: cat, employee: emp}; var data = JSON.stringify(entry); console.log(data); $.ajax({ url: route, type: "POST", dataType: "json", data: data, async: true, success: function () { console.log('succes'); location.reload(); }, error: function () { console.log('fail'); location.reload(); }, }) }); var $=jQuery.noConflict(); $('#btnClose').on('click', function(e){ //location.reload(); }); $(".js-close-modal").click(function(){ console.log("bla"); $(".modal").removeClass("visible"); });
© www.soinside.com 2019 - 2024. All rights reserved.