ChatGPT解决这个技术问题 Extra ChatGPT

将数据传递给引导模式

我有几个超链接,每个链接都有一个 ID。当我点击这个链接时,我想打开一个模态( http://twitter.github.com/bootstrap/javascript.html#modals ),并将这个 ID 传递给模态。我在谷歌上搜索,但我找不到任何可以帮助我的东西。

这是代码:

<a data-toggle="modal" data-id="@book.Id" title="Add this item" class="open-AddBookDialog"></a>

哪个应该打开:

<div class="modal hide" id="addBookDialog">
    <div class="modal-body">
        <input type="hidden" name="bookId" id="bookId" value=""/>
    </div>
</div>

使用这段代码:

$(document).ready(function () {
    $(".open-AddBookDialog").click(function () {
        $('#bookId').val($(this).data('id'));
        $('#addBookDialog').modal('show');
    });
});

但是,当我单击超链接时,什么也没有发生。当我给出超链接 <a href="#addBookDialog" ...> 时,模式打开得很好,但它不包含任何数据。

我遵循了这个例子:How to pass values arguments to modal.show() function in Bootstrap

(我也试过这个:How to set the input value in a modal dialogue?

我们应该将代码更新为最近的代码,使用 bootstrap5 和纯 JS 作为 jquery 之外的选项。

m
mg1075

我认为您可以使用 jQuery 的 .on 事件处理程序来完成这项工作。

这是您可以测试的小提琴;只需确保尽可能多地扩展小提琴中的 HTML 框架,以便您可以查看模式。

http://jsfiddle.net/8c05pn1f/

HTML

<p>Link 1</p>
<a data-toggle="modal" data-id="ISBN564541" title="Add this item" class="open-AddBookDialog btn btn-primary" href="#addBookDialog">test</a>

<p>&nbsp;</p>


<p>Link 2</p>
<a data-toggle="modal" data-id="ISBN-001122" title="Add this item" class="open-AddBookDialog btn btn-primary" href="#addBookDialog">test</a>
    
<div class="modal hide" id="addBookDialog">
 <div class="modal-header">
    <button class="close" data-dismiss="modal">×</button>
    <h3>Modal header</h3>
  </div>
    <div class="modal-body">
        <p>some content</p>
        <input type="text" name="bookId" id="bookId" value=""/>
    </div>
</div>

JAVASCRIPT

$(document).on("click", ".open-AddBookDialog", function () {
     var myBookId = $(this).data('id');
     $(".modal-body #bookId").val( myBookId );
     // As pointed out in comments, 
     // it is unnecessary to have to manually call the modal.
     // $('#addBookDialog').modal('show');
});

当我只有一个超链接但我有多个超链接,每个超链接都有自己的 ID 时,这很好用。我添加了带有另一个 ID 的第二个超链接,但模式始终具有第一个超链接的 ID。
@LeonCullens - 我已经更新了小提琴和代码。它现在按你想要的方式工作吗?
很好的答案 - 但需要 modal('show') 吗?似乎链接上的 data-toggle="modal" 会解决这个问题。
只是 $(this).data('id'); 本身就是无价之宝!我不知道你可以用它来获取数据属性。我每天都更喜欢引导程序! =P
@Manatax - $(this).data() 是 jQuery 的一部分。 api.jquery.com/data/#data-html5
L
LostInComputer

如果您使用的是 Bootstrap 3.2.0,这是一种更简洁的方法。

链接 HTML

<a href="#my_modal" data-toggle="modal" data-book-id="my_id_value">Open Modal</a>

模态 JavaScript

//triggered when modal is about to be shown
$('#my_modal').on('show.bs.modal', function(e) {

    //get data-id attribute of the clicked element
    var bookId = $(e.relatedTarget).data('book-id');

    //populate the textbox
    $(e.currentTarget).find('input[name="bookId"]').val(bookId);
});

http://jsfiddle.net/k7FC2/


$(e.currentTarget).find('input[name="bookId"]').val(bookId);你能告诉我这是做什么的吗?因此,如果模式打开意味着输入名称 bookId 的值是单击它的值,对吗?
@treblaluch e.currentTarget 是被点击的元素,取自点击事件 e。此行查找名称为 bookIdinput 并在其上设置值。
$(e.relatedTarget) 替换 $(this) 效果很好
这应该是公认的答案。我经历了e.relatedTarget.dataset.myDataId。实际上,data-* 存储在事件相关目标的数据集中。但是,不知道哪个更快...
这应该是公认的答案,我尝试了 $(this) 但没有奏效,将其替换为 $(e.relatedTarget) 完成了工作。谢谢!
J
J W

以下是我使用@mg1075 的代码实现它的方法。我想要一些更通用的代码,以便不必为模式触发链接/按钮分配类:

在 Twitter Bootstrap 3.0.3 中测试。

HTML

<a href="#" data-target="#my_modal" data-toggle="modal" data-id="my_id_value">Open Modal</a>

JAVASCRIPT

$(document).ready(function() {

  $('a[data-toggle=modal], button[data-toggle=modal]').click(function () {

    var data_id = '';

    if (typeof $(this).data('id') !== 'undefined') {

      data_id = $(this).data('id');
    }

    $('#my_element_id').val(data_id);
  })
});

您可以使用 !! $(this).data('id') 而不是 typeof $(this).data('id') !== 'undefined'
K
Kamil Kiełczewski

Bootstrap 4.3 - 使用以下代码段中的代码 - 更多here

$('#exampleModal').on('show.bs.modal', function (event) { let bookId = $(event.relatedTarget).data('bookid') $(this).find('.modal- body input').val(bookId) }) a.btn.btn-primary.open-AddBookDialog {color: white } 打开


V
VTStampede

如果您在 bootstrap 3+ 上,如果使用 Jquery,这可以进一步缩短。

HTML

<a href="#" data-target="#my_modal" data-toggle="modal" class="identifyingClass" data-id="my_id_value">Open Modal</a>

<div class="modal fade" id="my_modal" tabindex="-1" role="dialog" aria-labelledby="my_modalLabel">
<div class="modal-dialog" role="dialog">
    <div class="modal-content">
        <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">Modal Title</h4>
        </div>
        <div class="modal-body">
            Modal Body
            <input type="hidden" name="hiddenValue" id="hiddenValue" value="" />
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
            <button type="button" class="btn btn-primary">Yes</button>
        </div>
    </div>
</div>

查询

<script type="text/javascript">
    $(function () {
        $(".identifyingClass").click(function () {
            var my_id_value = $(this).data('id');
            $(".modal-body #hiddenValue").val(my_id_value);
        })
    });
</script>

p
phil

您的代码可以使用正确的模态 html 结构。

$(function(){ $(".open-AddBookDialog").click(function(){ $('#bookId').val($(this).data('id')); $("#addBookDialog ").modal("show"); }); }); 打开模式


E
Ehsan Ahmadi

使用 jquery 很容易:

如果以下是您的锚链接:

<a data-toggle="modal" data-id="@book.Id" title="Add this item" class="open-AddBookDialog"></a>

在您的模态显示事件中,您可以访问如下所示的锚标记

//triggered when modal is shown
$('#modal_id').on('shown.bs.modal', function(event) {

    // The reference tag is your anchor tag here
    var reference_tag = $(event.relatedTarget); 
    var id = reference_tag.data('id')
    // ...
    // ...
})



s
shaurya airi

Bootstrap 4.0 提供了使用 jquery 修改模态数据的选项:https://getbootstrap.com/docs/4.0/components/modal/#varying-modal-content

这是文档上的脚本标签:

$('#exampleModal').on('show.bs.modal', function (event) {
  var button = $(event.relatedTarget) // Button that triggered the modal
  var recipient = button.data('whatever') // Extract info from data-* attributes
  // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
  // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
  var modal = $(this)
  modal.find('.modal-title').text('New message to ' + recipient)
  modal.find('.modal-body input').val(recipient)
})

它在大多数情况下都有效。仅调用 modal 不起作用。这是对我有用的脚本的修改:

$(document).on('show.bs.modal', '#exampleModal',function(event){
... // same as in above script
})

H
Herbert Van-Vliet

我使用的是引导程序 5,并且由于我无法控制的限制,我自己无法使用脚本显示()模式,所以我依赖于弹出模式的按钮的属性 data-bs-toggle 和 data-bs-target 。

Bootstrap 暴露了一些事件(https://getbootstrap.com/docs/5.0/components/modal/),我们可以像这样挂钩代码:

document.getElementById('idModal').addEventListener('show.bs.modal', (e) => {
    console.log(e.relatedTarget);
});

在relatedTarget 中,我们将在数据集中找到指定的数据属性,例如,如果我们有一个看起来像这样的元素:

<button
    class="btn btn-secondary"
    data-id="fk_articles"
    data-bs-toggle="modal"
    data-bs-target="#documentationModal">
        Documentation
</button>

然后我们可以通过以下方式到达 fk_articles:

console.log( e.relatedTarget.dataset.id )

我不得不稍微调整您的版本以使其与 TypeScript/Angular 一起使用,但它可以工作并且在我看来是最干净的答案!在我的例子中,它认为 e 是一个 NORMAL 事件,但它是一个 CustomEvent。这导致它找不到 erelatedTarget 属性。我必须写 (e as any).relatedTarget 才能访问它的 id!
U
Unicco

我发现这种方法很有用:

创建点击事件:

$( button ).on('click', function(e) {
    let id = e.node.data.id;

    $('#myModal').modal('show', {id: id});
});

创建 show.bs.modal 事件:

$('#myModal').on('show.bs.modal', function (e) {

     // access parsed information through relatedTarget
     console.log(e.relatedTarget.id);

});

额外的:

在 show.bs.modal 中创建逻辑以检查属性是否被解析,例如:id: ( e.relatedTarget.hasOwnProperty( 'id' ) ? e.relatedTarget.id : null )


D
Deyson

试试这个

$(function(){
 //when click a button
  $("#miButton").click(function(){
    $(".dynamic-field").remove();
    //pass the data in the modal body adding html elements
    $('#myModal .modal-body').html('<input type="hidden" name="name" value="your value" class="dynamic-field">') ;
    //open the modal
    $('#myModal').modal('show') 
  })
})

但是,如果您关闭对话框,然后为其他元素打开它怎么办...您将添加 2 个隐藏字段,一旦您发送对话框的表单,它将变得一团糟
M
MaieonBrix

这是您可以将 id_data 发送到 modal 的方式:

<input
    href="#"
    data-some-id="uid0123456789"
    data-toggle="modal"
    data-target="#my_modal"
    value="SHOW MODAL"
    type="submit"
    class="btn modal-btn"/>

<div class="col-md-5">
  <div class="modal fade" id="my_modal">
   <div class="modal-body modal-content">
     <h2 name="hiddenValue" id="hiddenValue" />
   </div>
   <div class="modal-footer" />
</div>

和 javascript :

    $(function () {
     $(".modal-btn").click(function (){
       var data_var = $(this).data('some-id');
       $(".modal-body h2").text(data_var);
     })
    });

d
davidauza.engineer

例如,对于更新 href 值,我会执行以下操作:

<a href="#myModal" data-toggle="modal" data-url="http://example.com">Show modal</a>

$('#myModal').on('show.bs.modal', function (e) {
    var url = $(e.relatedTarget).data('url');
    $(e.currentTarget).find('.any-class').attr("href", "url");
})

J
James Osguthorpe

发现这对我有用:

在链接中:

<button type="button" class="btn btn-success" data-toggle="modal" data-target="#message<?php echo $row['id'];?>">Message</button>

在模态中:

<div id="message<?php echo $row['id'];?>" class="modal fade" role="dialog">
  <div class="modal-dialog">

    <!-- Modal content-->
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">&times;</button>
        <h4 class="modal-title">Modal Header</h4>
      </div>
      <div class="modal-body">
        <p>Some text in the modal.</p>
        <?php echo $row['id'];?>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
      </div>
    </div>

  </div>
</div>

J
Jithin Vijayan

你可以试试simpleBootstrapDialog。在这里您可以传递标题、消息、取消和提交的回调选项等...

要使用此插件,请包含如下所示的 simpleBootstrapDialog.js 文件

<script type="text/javascript" src="/simpleDialog.js"></script>

基本用法

<script type="text/javascript>
$.simpleDialog();
</script>

自定义标题和描述

$.simpleDialog({
  title:"Alert Dialog",
  message:"Alert Message"
});

带回调

<script type="text/javascript>
$.simpleDialog({
    onSuccess:function(){
        alert("You confirmed");
    },
    onCancel:function(){
        alert("You cancelled");
    }
});
</script>

欢迎来到堆栈溢出!虽然链接是分享知识的好方法,但如果它们在未来被破坏,它们将无法真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留对原始解决方案网站的链接引用。请参阅:How do I write a good answer?