【问题标题】:Materialize Datepicker Only Update if Done button clicked物化日期选择器仅在单击完成按钮时更新
【发布时间】:2018-09-21 12:17:36
【问题描述】:

我正在使用 materializecss Datepicker (https://materializecss.com/pickers.html),这看起来应该非常简单,所以我有点失去理智了。简而言之,我试图仅在单击“确定”按钮时触发事件,但无法在提供的 onClose() 函数中识别该事件。如果我尝试监听特定的按钮点击,我会丢失 onClose() 函数附带的所有内容(它很好地打包了我需要的关于该事件的所有信息)。

有什么方法可以通过 onClose() 函数确定是哪个按钮导致 onClose() 触发?

当谈到 javascript 和 jquery 时,我无疑是个新手,因此感谢您提供任何帮助。

HTML

<input type="text" class="datepicker" value="8/4/2018" job="533">

用于初始化日期选择器的 Javascript 代码

$(document).ready(function(){
    $('.datepicker').datepicker({
      "format": "m/d/yyyy",
      onClose() {
          // only do something if this was fired from the "Done" button
      }
    })
});

已创建日期选择器模式

<div class="modal datepicker-modal" id="modal-a5a43c91-2426-5565-c216-1d8ccd0cfc1d" tabindex="0">
    <div class="modal-content datepicker-container">
        <div class="datepicker-date-display">
            <span class="year-text">
            </span>
            <span class="date-text">
            </span>
        </div>
        <div class="datepicker-calendar-container">
            <div class="datepicker-calendar">
            </div>
            <div class="datepicker-footer">
                <button class="btn-flat datepicker-clear waves-effect" style="visibility: hidden;" type="button">
                </button>
                <div class="confirmation-btns">
                    <button class="btn-flat datepicker-cancel waves-effect" type="button">
                        Cancel
                    </button>
                    <button class="btn-flat datepicker-done waves-effect" type="button">
                         Ok
                    </button>
                </div>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 您是指“确定”按钮而不是“完成”按钮吗?我在您的代码中看不到“完成”按钮,所以我假设您的意思是“确定”按钮。
  • “如果我尝试监听特定的按钮点击,我会丢失 onClose() 函数附带的所有内容(它很好地打包了我在该事件中需要的所有信息)。” 你确定不能只使用普通的click 处理程序吗?您对onClose 活动有什么特别需要?
  • @david 抱歉,我的意思是“确定”按钮。
  • @David 我正在寻找的具体部分是日期选择器输入中的job id。如果我只听按钮点击,我不会轻易获得该作业 ID,并且该按钮是动态生成的,因此我也无法轻松地将作业 ID 分配给按钮本身。

标签: javascript jquery materialize


【解决方案1】:

下面的这段代码可以帮助你找到想要用它做一些事情的正确按钮。在 onOpen() 中将 2 个侦听器添加到该打开模式的完成和取消按钮,并删除侦听器 onClose()。 这对你有用。

<script>
    $(document).ready(function() {
        function Cancel() {
            if(!this.hasEvent) {
                this.hasEvent = true;
                console.log('Clicked on cancel btn:', this.cancelBtn);
            }
        }
        function Done() {
            if(!this.hasEvent) {
                this.hasEvent = true;
                console.log('Clicked on done btn:', this.doneBtn);
            }
        }
        $('.datepicker').datepicker({
            "format": "m/d/yyyy",
            onOpen: function(e) {
                var that = this;
                that.hasEvent = false;
                this.cancelBtn.addEventListener('click', Cancel.bind(that))
                this.doneBtn.addEventListener('click', Done.bind(that))
            },               
            onClose: function(e) {
                var that = this;
                this.cancelBtn.removeEventListener('click', Cancel.bind(that))
                this.doneBtn.removeEventListener('click', Done.bind(that))
            }
        })
    });
</script>

【讨论】:

  • 感谢 SaJadJaf 的建议!但是,我认为这仍然存在问题,即无论我单击Cancel 按钮还是Ok 按钮,我都会得到data-whitch 属性。还是我误解了你的建议?
  • 嗨,很抱歉,我觉得这让你有点困惑。我在上面编辑了我的答案。再看最后一部分。希望对你有所帮助。
  • 感谢您提供更多信息,但我认为我们仍在谈论不同的事情。我想知道 哪个 按钮导致了onClose(),我能够很好地找到这些按钮。我想看看,当onClose() 发生时,是什么动作负责(无论是单击.cancel-button 还是.ok-button)。这有意义吗?
  • 哦,伙计。我有你的答案。对不起,我太忙了,没能早点回复你。无论如何,我为你写了另一个答案。
  • 我编辑了我的答案(删除了所有以前的细节)以清除它。
【解决方案2】:

首先你可以使用vanillaJS初始化Datepicker,然后如果你检查materialize.css文件,你会发现Ok按钮的class name,即.datepicker-done。您可以将 addEventListener 附加到此按钮并调用您想要的任何函数。

document.addEventListener('DOMContentLoaded', function () {
    var elems = document.querySelector('.datepicker'); 
    var instance = M.Datepicker.init(elems);
    var doneBtn = document.querySelector('.datepicker-done');
    doneBtn.addEventListener('click', callThis); //Attaching a 'click' event to done button

    function callThis() {
        console.log('Done Button clicked only!'); //Checking the done button click
        console.log(elems.getAttribute('job')); //To get the job attribute value
    }
});

【讨论】:

  • 感谢 Germa 的建议,对于延迟回复我深表歉意!我认为这是正确的想法,但是当我尝试将 addEventListener 绑定到 doneBtn 时,它似乎不起作用。当我单击Ok 按钮时,它不会触发 callThis 事件
  • 我想我明白这里发生了什么,我认为这是由于我的解释不佳(再次道歉!)。这适用于 single 日期选择器,但我有一个包含许多日期选择器的页面。 querySelectorAll 和 forloop 会代替吗?
【解决方案3】:

所有的回复都对解决这个问题非常有帮助,感谢那些做出贡献的人!

我不知道这是否是最优雅的解决方案,但它对我有用。我保留 jquery 调用来初始化页面上的所有日期选择器,然后使用 forEach 循环添加事件侦听器。为了获得我想要的值,我不得不进行一系列看起来很疯狂的.parent() 电话,但它始终能让我得到正确的信息。希望这有助于将来处理相同问题的人(或者它可以帮助其他人提供更有效的答案!)。

$(document).ready(function(){
    $('.datepicker').datepicker({
      "format": "m/d/yyyy",
    })
  });
  document.addEventListener('DOMContentLoaded', function () {
    var doneBtn = document.querySelectorAll('.datepicker-done');
    doneBtn.forEach(function(elem) {
        elem.addEventListener('click', callThis)
    });
  });

function callThis() { 
    var update = $(this).parent().parent().parent().parent().parent().siblings('input');
    // do the thing I want with that input value
};

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多