【问题标题】:How to edit Tabulator dates in the cell?如何在单元格中编辑制表日期?
【发布时间】:2018-11-20 16:58:42
【问题描述】:

http://tabulator.info/examples/4.1

上面的可编辑数据示例显示了对日期字段使用自定义编辑器(链接中的示例是 DOB)。类似的例子存在于早期的制表器版本以及这里和 Github。生成的 javascript 日期选择器适用于大多数用户,但不是所有用户(即使在 Chrome 上也是如此)。因此,用户经常尝试的替代方法是尝试将日期直接输入到单元格中。但不幸的是,这是有问题的——与链接示例一样。更改月份和日期并不算太糟糕 - 但直接更改年份非常困难。有没有人有潜在的解决方案?我已经探索了从模糊/焦点/不同格式/“flatpicker”/等的所有内容 - 但我的结果是空的。

【问题讨论】:

    标签: tabulator


    【解决方案1】:

    获得完全跨浏览器支持的最佳方法是创建一个使用第 3 方日期选择器库的自定义格式化程序,例如 jQuery UI datepicker。日期选择器的正确选择取决于您的需求和您现有的前端框架。

    在 jQuery datepicker 的情况下,自定义格式化程序可能看起来像这样(此示例使用标准输入编辑器,您会在 onRendered 函数中注意到它转jQuery datepicker 的标准输入):

    var dateEditor = function(cell, onRendered, success, cancel, editorParams){
        var cellValue = cell.getValue(),
        input = document.createElement("input");
    
        input.setAttribute("type", "text");
    
        input.style.padding = "4px";
        input.style.width = "100%";
        input.style.boxSizing = "border-box";
    
        input.value = typeof cellValue !== "undefined" ? cellValue : "";
    
        onRendered(function(){
            input.style.height = "100%";
            $(input).datepicker(); //turn input into datepicker
            input.focus();
        });
    
        function onChange(e){
            if(((cellValue === null || typeof cellValue === "undefined") && input.value !== "") || input.value != cellValue){
                success(input.value);
            }else{
                cancel();
            }
        }
    
        //submit new value on blur or change
        input.addEventListener("change", onChange);
        input.addEventListener("blur", onChange);
    
        //submit new value on enter
        input.addEventListener("keydown", function(e){
            switch(e.keyCode){
                case 13:
                success(input.value);
                break;
    
                case 27:
                cancel();
                break;
            }
        });
    
        return input;
    }
    

    然后您可以将其添加到列定义中的列中: {title:"Date", field:"date", editor:dateEditor}

    【讨论】:

    • 谢谢 Oli - 非常有帮助!我使用 GAS 作为前端,因此在单击日期后,它会将我带到一个空白屏幕 ....usercodeapppanel#。但是你提供的 OnRendered 解释应该能让我顺利进行。再次感谢 - Tabulator 太棒了!
    • 感谢您的客气话,很高兴听到您喜欢使用 Tabulator。如果此答案对您有所帮助,您是否介意将其标记为正确答案以帮助其他人也找到它。干杯:)
    • 当然。我今天花了几个小时试图解决有关它转到另一个页面的问题。你有没有偶然的想法?
    • 我不需要提交任何东西,因为我稍后会通过 onEdit 处理。我只需要通过 jquery ui datepicker 选择的日期显示在制表符单元格中。我现在可以直接在单元格中输入它。我在上面的代码中遇到的问题是当我尝试使用日期选择器时,在选择一个日期时它会重定向整个页面。
    • 或许让我换个方式问我的问题。上面的代码对您有用吗?在日期选择器中单击日期后,日期在制表单元格中结束?
    【解决方案2】:

    我无法理解 Oli 建议的工作方式。再说一次,我可能会错过一些简单的东西,因为我更像是一个新手。经过大量的反复试验,这是我最终创建的一种 hack 方法——基于 Oli 的 onRender 建议,但随后使用 datepicker 的 onSelect 其余部分。

    好处:无论用户在单元格中的哪个位置单击,日期选择器都会出现——因此用户不太想尝试手动输入。如果用户碰巧尝试手动输入,他们可以这样做。 不太理想:如果用户手动输入,日期选择器不会消失,直到他/她点击其他地方。但不是炫耀。

         //Date Editor//
    var dateEditor = function(cell, onRendered, success, cancel, editorParams){
    
    var cellValue = cell.getValue(),
        input = document.createElement("input");
        input.setAttribute("type", "text");
    
        input.style.padding = "4px";
        input.style.width = "100%";
        input.style.boxSizing = "border-box";
    
        input.value = typeof cellValue !== "undefined" ? cellValue : "";
    
    
        onRendered(function(){
        $(input).datepicker({
    
        onSelect: function(dateStr) {
          var dateselected = $(this).datepicker('getDate');
          var cleandate = (moment(dateselected, "YYYY-MM-DD").format("MM/DD/YYYY"));
          $(input).datepicker( "destroy" );
          cell.setValue(cleandate,true);
          cancel();
    
         },
       });
        input.style.height = "100%"; 
    
       });
    
    
        return input;
    };
    

    【讨论】:

      【解决方案3】:

      我使用来自bootstrap 的日期选择器,这是我的代码

      var dateEditor = function (cell, onRendered, success, cancel, editorParams) {
          //create and style input
          var editor = $("<input type='text'/>");
          // datepicker
          editor.datepicker({
              language: 'ja',
              format: 'yyyy-mm-dd',
              autoclose: true,
          }).on('changeDate', function() {
              if(editorParams != 'row'){
                  editor.trigger('keyup');
              }else{
                  editor.trigger('change');
              }
          });
      
          editor.css({
              "padding": "3px",
              "width": "100%",
              "height": "100%",
              "box-sizing": "border-box",
          });
      
          editor.val(cell.getValue());
      
          onRendered(function(){
              editor.focus();
          });
      
          editor.on("blur", function (e) {
              e.preventDefault();
              if(editor.val() === '') {
                  success(cell.getValue());
              }
              else {
                  //submit new value on change
                  editor.on("change", function (e) {
                      success(editor.val());
                  });
      
              }
          });
      
          return editor;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多