Bootstrap(实际上是JQuery)DatePicker在Wicket模态中不会隐藏模糊

我在模态内部的面板上有一个检票口引导。当从单击中显示日期选取器时,日期选取器将附加到根页面,而不是模式。DateTextField

这会导致一个问题:如果不向 datepicker 添加一些 z 索引,我就无法在模态之上看到它。

当我与选取器模糊时,它应该关闭。不知何故,由于选取器不是模态的子项,因此,如果在模式外部单击它,则单击外部日期选取器只会关闭它。模态内部没有任何反应。

我可以通过自动关闭来调整这一点,但是当您转到输入并手动使用backSpace来清除值时,没有办法通过单击模式内的某个位置来关闭datepicker。

一些html来说明:

 <html>
   <panel>
     <modal>
       <input>datefield is here</input>
     </modal>
   <panel>
   <datepicker comes here>
 </html>

如何将日期拾取器附加到模态,或者以某种方式解决模态内部的模糊问题?

我曾尝试将面板附加一个隐藏日期拾取器的单击事件,但它在打开时会立即隐藏日期拾取器。

编辑:

单击模式不执行任何操作,尽管 html 被人为地移动到那里并正确放置在 DOM 树中。不过,由于@Gavriel关于在DOM元素之间移动东西的洞察力。

编辑2:

重现情况代码:

class MyPanel extends Panel {
    DateTextField field = new DateTextField("foo");
    (...)
    add(field);   
}

class MyPage extends WebPage {
     (...)
     ModalWindow modal = new ModalWindow("modal");
     modal.add(new MyPanel());
     (...)
}

html for the panel, containing the dateTextField

<html>
   ..
   <input wicket:id="foo"></input>
   ..
</html>

从代码片段中可以看出,java 代码生成 jQuery 部分。

编辑3:

我说的是这个生物:

[日期文本字段源]https://github.com/l0rdn1kk0n/wicket-bootstrap/blob/master/bootstrap-extensions/src/main/java/de/agilecoders/wicket/extensions/markup/html/bootstrap/form/DateTextField.java

编辑4:

嗯。。我在Javascript中以模态在输入中添加了一个模糊事件侦听器,而该模糊甚至不起作用。因此,事实证明,手头的真正问题是如何在模态内获得onblur工作。因为那是破碎的!

编辑5:

对不起,不能给小提琴。从 Edit3 中,您可以看到我用于选取器的源,我真正调用的是此函数:

protected CharSequence createScript(final DateTextFieldConfig config) {
    return $(this).chain("datepicker", config).get();
}

这是在java类内部,所以根本不是JavaScript,尽管语法看起来非常相似。根据我的理解,小提琴内部不需要Java代码。Wicket需要java部分,我很抱歉。

对于小提琴提问者,我在这个小提琴上发现了类似的情况:http://jsfiddle.net/VytfY/227/ - 工作100%正常,我在这里提到的类似技术,对我的问题没有用。

上次编辑:

$('html').on('click',function(e){
        if(e.target.className.indexOf('datepicker') == -1 && 
           e.target.className != 'next' && e.target.className != 'prev' && 
           e.target.className != 'year' && e.target.className != 'month'){
            if ($('.datepicker').get(0) != undefined){
                $('.datepicker').get(0).remove();
            }
        }
     });

谢谢你@Mathew让我的一天,以上是它结束的样子。我向输入元素添加了一个类,因此单击它不会隐藏选取器。datepickerContainer

谢谢大家,这已经完成了!

还有一个:对于IE,请使用:

 var canvas =  $('.datepicker').get(0);
 canvas.parentNode.removeChild(canvas);

而不是直接 . 尚不支持,甚至IE11。removeRemove


答案 1

这个想法是移动由datepicker创建的div。

使用 http://api.jqueryui.com/datepicker/#option-beforeShow 您可以看到一个示例,即如何在略有不同的用例中使用它:如何将自定义类添加到我的JQuery UI Datepicker

当您将元素追加到 DOM 中已位于 DOM 内部时,它将从原始位置删除,换句话说,如果您使用 ,则 src 元素将移动到 dst。$("#dst").append("#src")

更新:我认为有一种更直接的方法:您提供希望它使用的div的ID。这样,您就可以在模式对话框中拥有此 div。

     
$("#button").on('click', function(){
    $("#datepicker").datepicker();
});
<link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<button id="button">choose date</button>
<div id="datepicker"></div>
<div>footer</div>

答案 2

   
$("#button").on('click', function(){
     var dt=$("#datepicker").show();
     dt.datepicker().on('change', function (ev) {
          $(dt).hide();
    });
   $('html').on('click',function(e){
         if(e.target.id !='button'){
               $(dt).hide();
           }
      });
});
<link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<button id="button">choose date</button>
<div id="datepicker"></div>
<div>footer</div>

推荐