使用jqueryui';s对话框(“销毁”)将元素放置在错误的位置?

使用jqueryui';s对话框(“销毁”)将元素放置在错误的位置?,jquery,forms,dialog,popup,Jquery,Forms,Dialog,Popup,我有一个很大的表格,有很多部分。对于每个部分,我想添加一个小按钮“弹出为对话框”,它将根据需要将该部分转换为对话框,然后(关闭对话框时)使用新输入返回表单 我正在使用jQueryUI的dialog()函数。弹出部分工作正常-子窗体转换为对话框。但是,当我对子窗体进行对话框(“销毁”)时,元素会显示回来,但会显示在DOM文档的末尾,而不是原始位置 这是dialog()的“功能”吗?有什么办法吗? 是否有更好的方法使用dialog()完成此操作?也许可以添加一些代码,否则很难判断代码可能失败的位置/

我有一个很大的表格,有很多部分。对于每个部分,我想添加一个小按钮“弹出为对话框”,它将根据需要将该部分转换为对话框,然后(关闭对话框时)使用新输入返回表单

我正在使用jQueryUI的dialog()函数。弹出部分工作正常-子窗体转换为对话框。但是,当我对子窗体进行对话框(“销毁”)时,元素会显示回来,但会显示在DOM文档的末尾,而不是原始位置

这是dialog()的“功能”吗?有什么办法吗?
是否有更好的方法使用dialog()完成此操作?

也许可以添加一些代码,否则很难判断代码可能失败的位置/原因

你可以这样做或类似的方式

<input id="text" name="textname" type="text">
<input
  type="button"
  value="Pop me up"
  onclick="$('#text').clone().dialog({
    modal:true,
    close: function(event, ui) {
        $('#text').val(this.value);
    }
  });"
>


检查样本

是的,这是一个“功能”…哈哈…不久前遇到了它。下面是一些“gotchyas”,然后是一种非常简单的处理方法(尽管如果您计划有许多子表单,这种方法非常有效):

  • 当您创建一个对话框时,jquery会记住它,并将它存储在一个单独的div中,然后再也不会将它放回原处(是的,文档中的意思是元素永远不会回到原来的位置)
  • 我的经验是,如果在此之后过多地处理隐藏元素,可能会破坏未来的对话框功能。最好只是从新内容创建一个新对话框(特别是如果您的应用程序有许多这样的内容……手工编写每个子表单会很快变得单调乏味)
  • 如果不能重用div,则必须克隆并重命名它们(这是我下面要做的)
关闭对话框后,“克隆”对话框内容下面的代码段重命名其id属性,然后将更改的内容附加到“sub_form_容器”,从而在用户每次关闭对话框时生成一个全新的对话框/表单。希望这有帮助

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <link type="text/css" href="ui.css" rel="stylesheet" />  
  <script type="text/javascript" src="j.js"></script>
  <script type="text/javascript" src='ui.js'></script>
  <script type="text/javascript">
    $(document).ready(function() {
                newDialogs(2); 
    });     
    function newDialogs(idCounter) {
      $('#d1').unbind().bind('click', function() {
        $('#d'+ idCounter.toString()).dialog({close: function(event, ui){
            var newSubForm = $('#d'+idCounter.toString()).clone();
                idCounter += 1;
                newSubForm.attr('id', 'd'+idCounter.toString()).attr('class', '').attr('style', '');
            $('#sub_form_container').append(newSubForm);
            newDialogs(idCounter);
            $('ui-dialog').remove()
          }
        });
      });
    }

  </script>

</head>
  <body>
    <h1>Element above</h1>
    <div>
      <div id='d1'>Activate dialog</div>
      <div id='sub_form_container'>
        <div id='d2'>Dialog content <input type='text' /></div>
      </div>
    </div>
    <h1>Element below</h1>
  </body>
</html>

$(文档).ready(函数(){
新对话(2);
});     
函数新建对话框(idCounter){
$('#d1').unbind().bind('click',function(){
$('#d'+idCounter.toString()).dialog({close:function(event,ui){
var newSubForm=$('#d'+idCounter.toString()).clone();
idCounter+=1;
newSubForm.attr('id','d'+idCounter.toString()).attr('class','').attr('style','');
$('#sub_form_container')。追加(newSubForm);
新建对话框(idCounter);
$('ui-dialog')。删除()
}
});
});
}
上面的元素
激活对话框
对话内容
下面的元素
这对我很有用:

  • 克隆对话框
  • 初始化克隆对话框(使原始对话框保留在页面上)
  • 完成克隆对话框后将其删除
代码示例:

$('a.popup-modal').click(function(e){
    var $modal = $(this).closest('form').find('.modal').clone();
    $modal.dialog({
        autoOpen: true, 
        close: function(event, ui){
            $(this).remove();
        }
    });
});

这太棒了。这比公认答案的方法简单。这是一个非常糟糕的“功能”,他们应该真的解决这个问题。非常有效。只需确保您没有使用
id
s关闭
div
s。您将如何使用id处理modals?除非我在不触发复制的情况下关闭它,否则一切正常。