【问题标题】:Javascript not triggering on modal open with Twig Template使用 Twig 模板打开模态时 Javascript 未触发
【发布时间】:2019-02-20 21:51:08
【问题描述】:

注意:我已经尝试了针对我的问题在网上找到的各种解决方案,但都没有奏效。

我正在尝试传递表格中的内容,其中每一行都有自己的按钮来编辑该行中的内容。该按钮会打开一个 Twitter Bootstrap 下拉菜单,其中有两个按钮,一个是“编辑”按钮。编辑按钮打开一个具有文本区域输入的模式。我希望文本区域在表格中显示当前文本以进行编辑。我将 PHP 与 Symfony 一起用于表单和 Twig 用于页面渲染。

触发模态的按钮

<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
   <button class="btn btn-sm dropdown-item edit-button" data-toggle="modal" data-target="#announcementEditModal" data-id="{{ announcement.id }}" data-content="{{ announcement.content }}" type="button">
       <div class="announcement-actions">
          <span class="fas fa-pencil-alt"></span> Edit announcement
       </div>
  </button>

模态

<div class="modal fade" id="announcementEditModal" tabindex="-1" role="dialog" aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header announcement-header">
                <h5 class="modal-title" id="exampleModalLabel"><span class="fas fa-edit"></span> Edit new announcement</h5>
            </div>
            <div class="announcement-card-header card m-3 border-0">
                <div class="announcement-card-header card-body border-0 p-1">
                    <span class="fa fa-info-circle fa-lg header-icon"></span>
                    <h5 class="align-header">ANNOUNCEMENT TEXT</h5>
                </div>
                <div class="announcement-card-body modal-body card border-0">
                    {{ form_start(editForm) }}
                    <div class="announcement-card-body">
                        <label for="exampleInputEmail1">ANNOUNCEMENT (SUPPORTS MARKDOWN)</label>
                        <textarea class="form-control" id="announcementText" rows="5" name="content"></textarea>
                    </div>
                </div>
            </div>
            <div class="card-footer border-0 bg-white pt-0">
                <div>
                    {{ form_widget(editForm.edit, {'left_icon': 'fas fa-check'}) }}
                    <button type="button" class="btn btn-light" data-dismiss="modal" aria-label="Close">
                        Cancel
                    </button>
                </div>
            </div>
            {{ form_end(editForm) }}
        </div>
    </div>
</div>

JavaScript

<script type="text/javascript">
    $(".edit-button").click(function(){
        var content = $(this).data("content");
        alert(content);
    });

    $('#announcementEditModal').on('shown.bs.modal', function () {
        alert("modal open");
        document.getElementById("#announcementText").val(content);
    })
</script>

alert("modal open") does not fire.I have tried'shown.bs.modal'and'show.bs.modal'`。我正在使用 Bootstrap 4.12

编辑:解决方案:一旦我将 JS 移到了一个通知文件。

【问题讨论】:

标签: javascript jquery html twig


【解决方案1】:

您的 html 代码似乎不完整,或者没有与我们共享。

  • 下拉菜单没有结束 div。
  • 将下拉菜单包裹在下拉菜单或 btn 组中。
  • var 内容在您的 shown.bs.modal 函数中不可用,因此请全局声明它,这不是一个很好的建议,但为了简单起见。

修复 Javascript 错误,因为你使用的是 jQuery,所以使用它。

    document.getElementById("#announcementText").val(content); // val is not function

替换为

document.getElementById("#announcementText").value = content;  
$("#announcementText").val(content); // or jQuery way

这是小提琴:https://jsfiddle.net/7onyuw9f/1/

尝试 2

下面是一个揭示模块模式的示例,以展示如何避免全局变量并且更简洁。您可以阅读有关此模式的更多信息here

 // Revealing Module Pattern
  var MyProject = MyProject || {}; // Your global object
  MyProject.Modal = function() { // Namespacing to Modal

    var content = ""; // now content is local to this function;

    var onEditClick = function() {
      $(".edit-button").click(function() {
        content = $(this).data("content");
        alert(content);
      });
    };

    var onModalShow = function() {
      $('#announcementEditModal').on('shown.bs.modal', function() {
        alert("modal open");
        // $("#announcementText").val(content); <-- jQuery way
        document.getElementById("announcementText").value = content;
      });
    };

    var init = function() {
      onEditClick();
      onModalShow();
    };

    return {
      init: init // expose this for other functions to call
    }

  }();

  $(document).ready(function() {
     MyProject.Modal.init();

 });

还有小提琴https://jsfiddle.net/x28s3uc9/1/

【讨论】:

  • 代码应该是完整的我只是省略了很多以节省空间
  • 感谢您的回复,抱歉耽搁了。因此,在单击按钮时打开它是可行的,但是如何在不使用全局变量的情况下将其传递给模态?另外,我将您的代码复制粘贴在我的树枝文档的底部,并且当模式(您创建的那个)打开时警报不会触发。我更改了您制作的模态的ID
  • 您可以将整个代码包装在一个闭包中以避免全局代码。您的代码是否包含在 $(document).ready(function(){ }); 中?
  • 这不是我要补充的。然而,模态打开触发器的警报仍然没有触发
  • 您是否收到任何控制台错误?您的代码实际上有效,我怀疑还有其他问题
猜你喜欢
  • 2017-01-06
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多