在没有 Turbolink 的 AJAX 之后在 Rails 中触发 js

2023-12-11

我有一个rails4应用程序。由于我不擅长 js,所以我关闭了 TURBOLINKS。我读了很多文章,但我仍然不知道如何组织我的 javascript 文件。目前我在 AJAX 附加后触发 js 代码时遇到问题。

我有一个任务列表(索引页)。如果我加载页面,那么我可以单击任何任务(以更新它们),并且引导模式会显示+以下代码正在运行,因此时间已格式化并且日期时间选择器可用。

如果我使用 AJAX 创建一个新任务(将由 create.js.erb 附加),然后单击该特定任务,模式将显示,但以下代码不会被触发。 (如果我单击其余任务,这些任务将在页面加载后按原样工作。)

我怎样才能让它发挥作用?我希望代码也可以在页面加载和页面更改时使用。由于这是用户触发的事件,因此希望不会被触发两次。 sby 可以推荐给我一个清晰的好的解释/文章我应该如何组织我的 js 文件吗?正如我上面提到的,我读了很多,但我只是变得更加困惑。

js文件

var ready = function() {
   $('.updatetask').on('shown.bs.modal', function (e) {
     alert('haha');
     var modalId = $(this).attr('id');
     var deadlineField = $("#" + modalId).find($('.edit-task-deadline'));
     var deadlineValue = $(deadlineField).attr('value');
     var momentDeadline = moment(deadlineValue).format('MM/DD/YYYY hh:mm A');
     $(deadlineField).val(momentDeadline);
   });

   $(function () {
     $('.new-task-deadline').datetimepicker({
      sideBySide: true,
      format: 'MM/DD/YYYY hh:mm A',
      stepping: 15,
      widgetPositioning: { vertical: 'bottom' }
    });
  });
};

$(document).ready(ready);
$(document).on("page:load", ready);

_task.html.erb 部分

  ........
    <%= link_to edit_user_task_path(id: task.id), remote: true, type: "button" do %>
          <i class="fa fa-pencil" data-toggle="modal" data-target="#updatetask_<%= task.id %>"></i>
        <% end %>
        <!--Modal for updating task -->
        <%= form_for([@user, task], method: :patch, remote: true) do |f| %>
          <div class="modal fade updatetask" id="updatetask_<%= task.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
              <div class="modal-content" style="text-align:left">
                <div class="modal-header">
                  <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                  <h4 class="modal-title" id="myModalLabel">Edit Task</h4>
                </div>
                <div class="modal-body">
                  <div class="alert alert-danger" style="display:none">
                    <ul class="errors" style="display:none">
                      <%= render 'layouts/error_messages', object: f.object %>
                    </ul>
                  </div>
                  <div class="field form-group">
                    <% if current_user.id == task.assigner.id %>
                      <p><strong>Executor: <%= task.executor.profile.first_name %> <%= task.executor.profile.last_name %>, <%= task.executor.profile.company %></strong></p>
                    <% else %>
                      <p><strong>Assigner: <%= task.assigner.profile.first_name %> <%= task.assigner.profile.last_name %>, <%= task.assigner.profile.company %></strong></p>
                    <% end %>
                  </div>
                  <div class="field form-group">
                    <%= f.label :content %>
                    <%= f.text_area :content, class: "form-control edit-content" %>
                  </div>
                  <div class="field form-group">
                    <%= f.label :deadline %>
                    <%= f.text_field :deadline, class: "form-control edit-task-deadline" %>
                  </div>    
                </div>
                <div class="modal-footer">
                  <button type="button" class="btn btn-default" data-dismiss="modal" id="updatetaskclose">Close</button>
                    <%= f.submit "Update Task", class: 'btn btn-primary edit-task-submit', "data-sid" => current_user.id, "data-rip" => :executor_id %>
                </div>
              </div>
            </div>
          </div>
        <% end %>
        <!--Modal end for update task --> 
      </td>

创建.js.erb

$("ul.errors").html("");
<% if @task.errors.any? %>
  //modal error messages get inserted via AJAX
  $('.alert-danger').show();
  $('ul.errors').show();
  <% @task.errors.full_messages.each do |message| %>
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>"));
  <% end %>
<% else %>
  //hiding modal on creation and setting values to zero for optional new modal
  $('ul.errors').hide();
  $('.alert-danger').hide();
  $("#newtask").modal('hide');
  $(".task_name_company").val('');
  $(".contentarea").val('');
  $(".new-task-deadline").val('');

  //different div class for different partials + table rows get inserted into view via AJAX
  $(".newtaskinsert").prepend('<%= j render @task %>');
  $(".newtaskinsert2").prepend('<%= j render partial: "tasks/task_between", locals: { task: @task } %>');
  $("#task_<%= @task.id %>").hide().fadeIn(1000);
<% end %>

额外代码:

这是我用于新任务的示例代码(这更容易,因为只有一个没有 ID 的模态。)

我希望用它来更新文档就绪和 AJAX 添加的代码。提交必须在模态 id 上调用,而不是在表单 id 上调用。

新任务的工作代码:

$('.new-task-submit').on('click', function (e){
  e.preventDefault();
  var localMoment = moment($('.new-task-deadline').val());
  $('.new-task-deadline').val(localMoment.toISOString());
  $('#newtask').submit();
});

我尝试更新任务:

edit_task_submit($(document.body));
.....
......
function edit_task_submit($container) {
  $container.find('.edit-task-submit').on('click', function (e){
    e.preventDefault();
    var deadlineField = $(this).find($('.edit-task-deadline'));
    var localMoment = moment((deadlineField).val());
    deadlineField.val(localMoment.toISOString());
    alert(deadlineField.val());
    $(this).submit();
  });
}

更新.js.erb

<% else %>
  $('ul.errors').hide();
  $('.alert-danger').hide();
  $('#updatetask_<%= @task.id %>').modal('hide');

  $task = $('<%= j render @task %>');
  edit_task_submit($task);

  $('#task_<%= @task.id %>').fadeOut(400, function(){
      $(this).remove();
      //$(".newtaskinsert").prepend('<%= j render @task %>');
      $(".newtaskinsert").prepend('$task');
      $(".newtaskinsert2").prepend('<%= j render partial: "tasks/task_between", locals: { task: @task } %>');
  });
<% end %>

enter image description here


$(document).ready页面加载时执行一次。create.js.erb创建不应用此函数的新元素。

按如下方式重新组织您的代码:

js file:

function updatetask($container)
{
  $container.find('.updatetask').on('shown.bs.modal', function (e)
  {
    var deadlineField = $(this).find('.edit-task-deadline');
    var deadlineValue = deadlineField.val();
    var momentDeadline = moment(deadlineValue).format('MM/DD/YYYY hh:mm A');
    deadlineField.val(momentDeadline);
  });
}

function new_task_deadline($container)
{
  $container.find('.new-task-deadline').datetimepicker({
    sideBySide: true,
    format: 'MM/DD/YYYY hh:mm A',
    stepping: 15,
    widgetPositioning: { vertical: 'bottom' }
  });
}

$(function () // shortcut for $(document).ready
{
  updatetask($(document.body));
  new_task_deadline($(document.body));
});

创建.js.erb:

$("ul.errors").html("");
<% if @task.errors.any? %>
  //modal error messages get inserted via AJAX
  $('.alert-danger').show();
  $('ul.errors').show();
  <% @task.errors.full_messages.each do |message| %>
    $("ul.errors").append($("<li />").html("<%= message.html_safe %>"));
  <% end %>
<% else %>
  //hiding modal on creation and setting values to zero for optional new modal
  $('ul.errors').hide();
  $('.alert-danger').hide();
  $("#newtask").modal('hide');
  $(".task_name_company").val('');
  $(".contentarea").val('');
  $(".new-task-deadline").val('');

  // time formatting and datetimepicker for new elements
  $task = $('<%= j render @task %>');
  updatetask($task);
  new_task_deadline($task);

  //different div class for different partials + table rows get inserted into view via AJAX
  $(".newtaskinsert").prepend($task);
  $(".newtaskinsert2").prepend('<%= j render partial: "tasks/task_between", locals: { task: @task } %>');
  $("#task_<%= @task.id %>").hide().fadeIn(1000);
<% end %>

对于更新:

edit_task_submit($(document.body));

function edit_task_submit($container)
{
  $container.find('.edit-task-submit').on('click', function (e)
  {
    e.preventDefault();
    var $this = $(this);
    var deadlineField = $this.closest('form').find('.edit-task-deadline');
    var localMoment = moment(deadlineField.val());
    deadlineField.val(localMoment.toISOString());
    $this.click();
  });
}

update.js.erb:

<% else %>
  $('ul.errors').hide();
  $('.alert-danger').hide();
  $('#updatetask_<%= @task.id %>').modal('hide');

  $task = $('<%= j render @task %>');
  edit_task_submit($task);

  $('#task_<%= @task.id %>').fadeOut(400, function()
  {
    $(this).remove();
    $(".newtaskinsert").prepend($task);
    $(".newtaskinsert2").prepend('<%= j render partial: "tasks/task_between", locals: { task: @task } %>');
  });
<% end %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有 Turbolink 的 AJAX 之后在 Rails 中触发 js 的相关文章

  • 空 JavaScript 数组的布尔值冲突

    谁能解释为什么以下两个陈述都评估为true false and 这个问题纯粹是出于对为什么会发生这种情况的好奇 而不是关于如何最好地测试数组是否为空 第一个 false The 运算符对其操作数进行类型转换 在这种情况下 两边都转换为 Nu
  • 按空格键后执行JS代码

    这是我的 JavaScript 代码 var changeIdValue function id value document getElementById id style height value document getElement
  • 从谷歌加载 jquery 不起作用(对我来说)

    啊 我是个可怜的菜鸟 下面的 html 文档没有提醒任何人我的求助 有人知道为什么吗 这对我有用
  • 如何通过 Javascript 获取 Bootstrap 版本?

    有没有办法通过调用函数来获取Bootstrap版本 我做了一些研究 但找不到任何方法 版本信息包含在开头的注释中 如下所示 引导程序 v3 3 7 http getbootstrap com http getbootstrap com 版权
  • 使用 ES6 从子级获取父类名?

    我想获取父类名称 Parent 但我只能使用此代码检索子类名称 Child use strict class Parent class Child extends Parent var instance new Child console
  • 使用 Javascript 基于 Cookie 的重定向

    我正在尝试根据 cookie 的存在创建重定向 所以当用户连接到我的网站时jonathanstevens org他们第一次被重定向到jonathanstevens org landing 代码部分 Global js function cr
  • selenium webdriver 管理器更新 - npm

    我尝试使用 webdriver manager 更新 selenium webdriver 但出现错误 Error Got error Error read ECONNRESET from https selenium release st
  • 使用 jQuery 检测用户何时滚动到 div 底部

    我有一个 div 框 称为 Flux 里面有可变数量的内容 此 divbox 的溢出设置为自动 现在 我想做的是 当使用滚动到此 DIV 框的底部时 将更多内容加载到页面中 我知道如何执行此操作 加载内容 但我不知道如何检测用户何时滚动到
  • JS - 文件读取器 API 获取图像文件大小和尺寸

    您好 我正在使用以下代码来使用文件读取器 API 获取上传图像
  • 如何在html5画布中向前和向后移动圆圈中的对象?

    我正在 html5 canvas 中开发一个小应用程序 我需要使用键盘按键以圆周运动移动对象 我可以使用键盘按键移动对象 但存在错误 该对象不会从同一位置向后或向前移动 任何人都可以帮助我完成此操作 请检查以下代码 任何形式的帮助将非常感激
  • 客户端与服务器端图像压缩[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在研究用户可以上传图片的东西 图像大小不受限制 现在我有两个选择使用PHP 服务器端 压缩图像或使用
  • 在 contenteditable div 中的插入符处插入 html

    我有一个带有 contenteditable 设置的 div 并且我正在使用 jquery 捕获按键 以在按下 Enter 键时调用 PreventDefault 如同这个问题 https stackoverflow com questio
  • 恢复console.log()

    由于某种原因 附带的原型框架 或其他 JavaScript 代码 Magento http en wikipedia org wiki Magento正在替换标准控制台功能 所以我无法调试任何内容 在 JavaScript 控制台中写下co
  • jquery mousewheel:检测轮子何时停止?

    我正在使用 Jquery鼠标滚轮 http plugins jquery com project mousewheel插件 我希望能够检测用户何时完成使用轮子 与可拖动内容中的 stop 事件类似的功能 有人能指出我正确的方向吗 这里真的没
  • 将 javascript 对象分配给 html 元素的最佳方法

    我通过 ajax 获取一个 javascript 对象 我需要将此对象附加到 div 以便稍后恢复 例如 在单击事件上 如果我有一个变量而不是一个对象 我会将它推入 html 标签 如下所示 div div 我会像这样恢复它的价值 var
  • 将事件处理程序分配给带括号和不带括号的方法之间的区别

    假设您有以下内容 function doStuff code 2 种说法有什么区别 window onload doStuff window onload doStuff 两个语句都立即调用该方法 但如果我使用第一个语句 我可以将 onlo
  • 使用 Figaro 和 Secrets.yml 管理环境变量

    我有一个 Rails 4 1 应用程序 我正在尝试组织我的环境变量 截至目前 我的 config 文件夹中有一个 Secrets yml 文件 我还安装了费加罗宝石 我的目标是将所有环境变量放在 application yml 未签入 gi
  • 根据 Google Apps 脚本中的另一个数组过滤数组

    我对 JavaScript 相当陌生 可能需要一些帮助来解决我在处理 Google Apps 脚本时遇到的问题 我打算做的是根据数组过滤数据 该数组是从特定工作表中的特定单元格中获取的 其中包含我不想保留在数据中的字符串元素 换句话说 包含
  • 在 Bootstrap 按钮下拉列表标题/占位符文本中显示所选项目

    这个问题已经在 Stackoverflow 上被问过几次了 但是我仍然无法弄清楚它的真相 而且我的查询正在抛出更多的下拉菜单 所以我有两个下拉菜单和一个搜索 我想从下拉列表和 选定 中进行选择以替换下拉占位符文本 但我还需要记住 点击搜索后
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i

随机推荐

  • Mac OS X 上的 boot2docker、docker、django

    我想在 Mac OS X 上的 docker 中运行 Django 应用程序 我已经使用以下命令安装了 dockerget started教程 我参考docker library中的Django文档来构建镜像 https github co
  • 如何使用 numpy 复制数组的一行?

    我想在 python 中复制数组的最后一行 并在 numpy 文档中找到了以下代码行 gt gt gt x np array 1 2 3 4 gt gt gt np repeat x 1 2 axis 0 在上面的代码中 np repeat
  • 糟糕,在使用 Paramiko 连接 SFTP 时未处理类型 3(“未实现”)

    我试图使下面的脚本工作 以便从远程服务器 服务器1 读取特定目录中的CSV文件列表 并将数据移植到另一台服务器的PostgreSQL数据库中 我已经创建了一个 rsa SSH 密钥并将其复制到远程服务器 现在我可以仅使用用户名连接服务器 我
  • Android 代码和资源混淆

    Google 推荐并打包在 ProGuard 中以进行代码混淆 然而 它附带的默认配置似乎很小 并且可以在一定程度上进行逆向工程 大多数寻求逆向工程的人并不是真正在寻找详细代码 而可能是提取逻辑 是否有任何指导方针可以更有效地配置 ProG
  • 通过 Excel VBA 修复 PowerPoint 幻灯片中的文本框(右侧)

    我使用以下代码将一个单元格的内容放在 PowerPoint 幻灯片上 Set Sh Pres Slides 1 Shapes AddLabel Orientation msoTextOrientationHorizontal Left 80
  • React.js 中的冒泡和捕获示例

    我正在寻找在 React js 中处理冒泡和捕获的示例 我发现一个使用 JavaScript 的 但我很难找到 React js 的等效项 我如何在 React js 中创建冒泡和捕获的示例 React 支持冒泡和捕获 其方式与 DOM 规
  • 如何用canvas画一条可以向左移动的曲线?

    我正在编写一个程序来绘制sine curve与画布 HTML
  • JSTL c:if 无法识别 ${} 内的字符串并导致 EL 语法错误

    为什么此代码的 POST 和 提交 部分在我的 IDE 中以不同的颜色突出显示 此外 这里的语法荧光笔不会以相同的颜色突出显示它们
  • 如何定义可以在应用程序中的任何位置访问的全局变量? [复制]

    这个问题在这里已经有答案了 可能的重复 全局 int 变量目标 c 我想创建一个全局变量 我想在任何地方访问这个变量 Java 等效项 static var score int 0 例如 如果我在 Game 类中定义一个全局变量 如何访问这
  • 为什么同源策略不阻止 POST 请求? [复制]

    这个问题在这里已经有答案了 据我所知 跨源 简单 请求 例如 GET 和 POST 始终是允许的 但您只是无法查看响应 并且 PUT DELETE 会被阻止 或者如果您的浏览器支持 CORS 则会进行预检 我明白 只要响应被阻止 允许发送
  • 如何从文本文件中回显随机行

    我的文本文件格式是 这是第一行 这是第二行 这是第三行 文本文件中可能有更多行 如何使用 php ini 在每次刷新时从文本文件中回显一行随机行 感谢所有评论 谢谢 我们谈论的文件有多大 简单的方法是将整个文件作为字符串数组加载到内存中 并
  • 方法隐藏是多态性的一种形式吗?

    多态性是采取多种形式的能力 方法重写是运行时多态性 我的问题是 Java中有静态多态之类的东西吗 方法隐藏可以被视为多态性的一种形式吗 In this 问题的答案 据说静态方法不是多态的 这是什么原因呢 如果我们运行这个测试 class A
  • 用于转置 double[][] 矩阵的紧凑流表达式

    我想转置一个double 具有最紧凑和最有效的表达方式的矩阵 现在我有这个 public static Function
  • 使用 ASP.NET MVC 打印元标记时出现问题

    我正在尝试根据模型中的数据在视图中创建元标记 我的视图代码如下所示 但我的输出看起来像这样 meta name description content lt Html Encode Model MetaDescription gt gt 我
  • 删除 SQL Server 2005 全文索引中的干扰词

    在一个非常典型的场景中 我的 Web 应用程序上有一个 搜索 文本框 其中将用户输入直接传递到存储过程 然后使用全文索引搜索两个表中的两个字段 这两个表使用适当的键连接 我正在使用 CONTAINS 谓词来搜索字段 在传递搜索字符串之前 我
  • 将多行多列值显示为单行多列值

    我必须在一行中显示单个人的多种收入 收入类型和雇主名称值 因此 如果 A 拥有来自三个不同来源的三种不同收入 id Name Employer IncomeType Amount 123 XYZ ABC Inc EarningsformJo
  • xml_parse 无内存错误 PHP

    我在使用 xml parse 时遇到了一个奇怪的错误 我的脚本通过 xml parse 函数在 XML 文件的最后一行返回 无内存 错误 仅当文件大小大于 10Mb 时才会发生这种情况 少一点也是可以接受的 但我有 3Gb 可用于 PHP
  • 将其他文件包含在数据流中

    我的数据流使用 sql文件 该文件包含一个查询 它位于名为的目录中queries 我需要将此文件与我的数据流一起上传 我发现使用了一个manifest in文件 但据我所知 它没有做任何事情 我把这个文件称为MANIFEST in在我的根目
  • Xcode 配置文件位置

    Xcode 8 3 3 中的配置文件位于项目和 或文件目录中的什么位置 对于旧版本的 Xcode 它们的位置 Library MobileDevice Provisioning Profiles 配置文件不与项目一起存储 Xcode 有一个
  • 在没有 Turbolink 的 AJAX 之后在 Rails 中触发 js

    我有一个rails4应用程序 由于我不擅长 js 所以我关闭了 TURBOLINKS 我读了很多文章 但我仍然不知道如何组织我的 javascript 文件 目前我在 AJAX 附加后触发 js 代码时遇到问题 我有一个任务列表 索引页 如