【问题标题】:Prevent bootstrap popover from clearing content防止引导弹出窗口清除内容
【发布时间】:2021-04-26 03:05:43
【问题描述】:

我正在尝试在我的 bootstrap 5 弹出窗口中使用 html。我稍微更改了代码以从特定 div 获取 html 内容(不想使用 data-bs-content="" 属性)。

当前代码如下所示:

$(document).ready(function(){

// popover 
$("[data-bs-toggle=popover]").each(function(i, obj) {
 var id = $(this).attr('id')
$(this).popover({
   container: 'body',
    html: true,
    placement: 'right',
//  trigger: 'focus',
    customClass: '' + id +'-pop',
    sanitize: false,
  content: function () {
       return $('#popover-content-' + id).html(); 
    
    }
});
 

}); // popover each


// update input fields in hidden popover content div
$(document).on('keyup', ".trigger-pop input[type=text]",function () {  
  var inputid = $(this).attr('id');
 var inputdata = $(this).val();
$('#popover-content-trigger').find('#'+ inputid).val(inputdata);
});

// chkbx on/off toggle "fix"
$("#custombutton").on('change', function() {
    var id = $(this).attr("id");
   if ($(this).prop("checked")) {
                $('label[for="' + id + '"]').removeClass("btn-outline-primary").addClass("btn-primary"); 
    } else {
            $('label[for="' + id + '"]').removeClass("btn-primary").addClass("btn-outline-primary"); 
        

    }
});

});
<!doctype html>
<html lang="en">
  <head>
   
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
</head>
  <body>

   <button type="button" id="trigger" class="btn btn-secondary mt-1 mb-2 " data-bs-toggle="popover" data-bs-placement="right" >Trigger</button>


<div  id="popover-content-trigger" style="display:none;" >
  <div class="content">
    
     <div class="row popover-header mb-3" style="margin:-16px -16px 0 -16px;padding-top:8px;padding-bottom:5px;">
    <div class="col-12">
    
    <input type="checkbox" class="btn-check" id="custombutton" autocomplete="off">
    <label class="btn btn-outline-primary" for="custombutton">Some option</label>
    
    </div>
    
  </div> 
  
  
   <div class="row justify-content-around">

    <div class="col-12" >
   
   <div class="form-floating  mb-1">
  <input type="text" class="form-control" id="input1" placeholder="Input 1" autocomplete="off" >
  <label for="input1">Input 1</label>
   </div> 

  <div class="form-floating  mb-1">
  <input type="text" class="form-control" id="input2" placeholder="Input 2" autocomplete="off" >
  <label for="input2">Input 1</label>
  </div> 


    </div>

  </div>
    
    <br>

  </div>
</div>
   



<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>

    
  </body>
</html>

我想记住弹出框隐藏后的所有数据(输入值,复选框状态..)。

目前在popover关闭后它实际上“被销毁”并且在下一次初始化后输入字段为空...... 我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 以不同用户的身份提出相同的问题并不等同于获得更多答案。与#67238348 重复
  • 打算用这个设置赏金..谢谢
  • 嗨,您可以将用户在输入中输入的值存储在本地存储或您的 dom 中的某个位置,并在弹出窗口打开时检索它。
  • 这也是我的想法,但是,我遇到了问题,因为我的 html 包含一些具有 uniqe id 的不同输入类型(文本、复选框等),并且当我初始化其中一些更改时(复选框例如)它不能正常工作,因为文档包含具有相同 ID 的多个元素。我找到了解决方案并将其作为答案发布,谢谢!

标签: javascript jquery bootstrap-5


【解决方案1】:

我找到了为我“完成工作”的解决方案。我不确定它是否是最好的解决方案,但它工作正常。

在这种情况下,我结合了 shown.bs.popoverhide.bs.popover 函数。因此,在初始化弹出脚本后,会从文档中删除“内容持有者”div(以避免在文档中有多个具有相同 ID 的输入),但在实际关闭弹出脚本之前,会克隆实际的弹出内容并将其插入“弹出内容”持有人”以供将来使用/初始化。

这样可以保存在弹出框内完成的用户更改(文本、复选框等)。 此外,具有相同 ID 的输入元素总是存在于 document/DOM 中。

$(document).ready(function(){

// popover 
$("[data-bs-toggle=popover]").each(function(i, obj) {
 var id = $(this).attr('id')
$(this).popover({
   container: 'body',
    html: true,
    placement: 'right',
//  trigger: 'focus',
    customClass: '' + id +'-pop',
    sanitize: false,
  content: function () {
     actualcontent = $('#popover-content-' + id).find(".content").clone()
     return actualcontent
    }
});
 

}); // popover each


$("[data-bs-toggle=popover]").on('shown.bs.popover', function(){
 var id = $(this).attr('id')

 $('#popover-content-' + id).find(".content").remove()

}); 

$("[data-bs-toggle=popover]").on('hide.bs.popover', function(){
 var id = $(this).attr('id')

 var lastcontent = $(document).find('.'+ id +'-pop').find(".content").clone()
 $(lastcontent).appendTo('#popover-content-' + id);

}); 




});
<!doctype html>
<html lang="en">
  <head>
   
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous">
</head>
  <body>

   <button type="button" id="trigger" class="btn btn-secondary mt-1 mb-2 " data-bs-toggle="popover" data-bs-placement="right" >Trigger</button>


<div  id="popover-content-trigger" style="display:none;" >
  <div class="content">
    
     <div class="row popover-header mb-3" style="margin:-16px -16px 0 -16px;padding-top:8px;padding-bottom:5px;">
    <div class="col-12">
    
    <input type="checkbox" class="btn-check" id="custombutton" autocomplete="off">
    <label class="btn btn-outline-primary" for="custombutton">Some option</label>
    
    </div>
    
  </div> 
  
  
   <div class="row justify-content-around">

    <div class="col-12" >
   
   <div class="form-floating  mb-1">
  <input type="text" class="form-control" id="input1" placeholder="Input 1" autocomplete="off" >
  <label for="input1">Input 1</label>
   </div> 

  <div class="form-floating  mb-1">
  <input type="text" class="form-control" id="input2" placeholder="Input 2" autocomplete="off" >
  <label for="input2">Input 1</label>
  </div> 


    </div>

  </div>
    
    <br>

  </div>
</div>
   



<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js" integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf" crossorigin="anonymous"></script>

    
  </body>
</html>

如果有人对此解决方案有任何建议,请随时指出。 最好的问候。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2018-04-23
    • 2012-10-28
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多