【问题标题】:Javascript is not working when form is rendered through AJAX通过 AJAX 呈现表单时,Javascript 不起作用
【发布时间】:2021-03-22 14:40:28
【问题描述】:

我是 AJAX 和 Javascript on rails 的新手。

当点击tab时,通过AJAX渲染对应的partial

当表单在没有 AJAX 的页面上呈现时,flatpickr 可以完美运行。

flatpickr working

但是当我使用 AJAX 渲染它时(用表单替换 div 链接),flatpickr 不再工作

flatpickr not working

task#new

<div id="single_event">
  <%= link_to "Single_event", task_new_path, remote: true %>
</div>

task#new.js.erb

$('#single_event a').parent().html("<%= j render 'single_event_form', meeting: @meeting %>")

single_event_form.html.erb

<div class="container">
  <%= form_with(model: meeting, local: true, :html => {:id => "flatpickr-form-single"} ) do |form| %>
    <div class="mb-6">
      <%= form.label :body %>
      <%= form.rich_text_area :body, class: 'form-control' %>
    </div>
    <div class="mb-6" style ="width: 30vw;">
      <%= form.label :start_time, class: 'label' %>
      <div class="flex items-center justify-between max-w-md">
        <%= form.text_field :start_time, data: { behavior: "flatpickr" }, placeholder: "Date and time select ...", class: "form-control" %>
      </div>
    </div>
    <div class="field" style ="width: 30vw;">
      <%= form.label :end_time, class: 'label' %>
      <div class="flex items-center justify-between max-w-md">
        <%= form.text_field :end_time, data: { behavior: "flatpickr" }, placeholder: "Date and time select ...", class: "form-control required" %>
      </div>
    </div>
    <%= form.submit class: "btn btn-primary text-base py-1.5 px-5", value: "Confirm" %>
  <% end %>
</div>

flatpickt.js

import flatpickr from "flatpickr"
require("flatpickr/dist/flatpickr.css")

document.querySelector('#flatpickr-form-single')
    .addEventListener("ajax:success", function(data, status, xhr) {
      flatpickr("[data-behavior='flatpickr']", {
        enableTime: false,
        altInput: true,
        altFormat: "F j, Y",
        minDate: "today"
    })
});

【问题讨论】:

    标签: javascript ruby-on-rails ajax


    【解决方案1】:

    您遇到的问题是由于初始化flatpickr仅在页面加载事件中,您还需要在 AJAX 请求完成后对其进行初始化。

    尝试使用以下内容将其添加到您的flatpickt.js,并在 querySelector 选择器中替换为您的表单 ID

    ...
    document.addEventListener('turbolinks:load', function() {
      document.querySelector('#single_event a')
        .addEventListener("ajax:success", function(data, status, xhr) {
          flatpickr("[data-behavior='flatpickr']", {
            enableTime: false,
            altInput: true,
            altFormat: "F j, Y",
            minDate: "today"
        })
      });
    });
    

    【讨论】:

    • 谢谢@plamen。我在#flatpickr-form-single 的表单中添加了一个 ID,然后按照您的步骤添加了一个 ID 作为我的查询选择器:document.querySelector('#flatpickr-form-single')。这返回了flatpickr.js:6 Uncaught TypeError: Cannot read property 'addEventListener' of null 的控制台错误
    • @Lorenzo_xavier 这样的错误意味着document.querySelector 返回 null - 这可能是由于表单标识符拼写错误或在表单进入 DOM 之前执行脚本。
    • 感谢您的回复。我在打开的 10 个选项卡之一中,没有解决潜在问题的解决方案!身份证上绝对没有拼写错误。 ajax渲染表单后如何执行脚本?
    • @Lorenzo_xavier 你能用最新的代码更新问题吗,包括表单ID? (在 HTML 和 JS 中)?
    • 我已更新问题中的代码以反映您建议的其他步骤
    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多