【问题标题】:Kendo Grid UI: Enable custom text copy with multiple row select featureKendo Grid UI:启用具有多行选择功能的自定义文本复制
【发布时间】:2021-07-08 08:32:32
【问题描述】:

我有一个启用多行选择的剑道网格。借助多选功能,当用户尝试像从列中复制任何值一样复制自定义文本时,它会启用多选功能,因此用户无法复制自定义文本。

下面是示例:

https://dojo.telerik.com/@erpuneet507/ivAfoFup

问题是,在上面的示例中,您可以从单个单元格中选择文本/或从单元格中选择任何部分文本。

【问题讨论】:

    标签: javascript html kendo-ui kendo-grid


    【解决方案1】:

    如果您启用了多项选择,那么您的应用必须处理将文本复制到剪贴板。为此,您将需要 clipboard.js 库并添加 Kendo ContextMenu。处理 ContextMenu select 事件中的复制文本。右键单击应弹出复制文本。

    在 Telerik DOJO 中尝试以下代码:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <title>Kendo UI Snippet</title>
    
        <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2021.2.616/styles/kendo.default-v2.min.css"/>
    
        <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
        <script src="https://kendo.cdn.telerik.com/2021.2.616/js/kendo.all.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js"></script>
    </head>
    <body>
      
    <div id="grid"></div>
    <ul id="context-menu">
      <li id="copyText">Copy Text</li>
    </ul>
      
    <script>
    $(document).ready(function() {
      $("#grid").kendoGrid({
          selectable: "multiple row",
          allowCopy: true,
          columns: [
              { field: "productName" }, 
              { field: "category" }
          ],
          dataSource: [
              { productName: "Tea", category: "Beverages" },
              { productName: "Coffee", category: "Beverages" },
              { productName: "Ham", category: "Food" },
              { productName: "Bread", category: "Food" }
          ]
      });
      
      $("#context-menu").kendoContextMenu({
          target: "#grid",
          filter: "td",
          select: function (e) {
              var cell = e.target;
              var row = $(cell).parent()[0];
              var grid = $("#grid").data("kendoGrid");
              var itemId = e.item.id;
    
              var cellText = cell.innerText;
    
              if (itemId === 'copyText') {
                  new Clipboard('#copyText', {
                      text: function (trigger) {
                          return cellText;
                      }
                  });
              };
          }
      });
    });
    </script>
    </body>
    </html>

    这是上述内容的修订版。您将不再需要clipboard.js。这将在您右键单击时显示/弹出文本(例如咖啡),以便您可以复制“ffee”。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <title>Kendo UI Snippet</title>
    
        <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2021.2.616/styles/kendo.default-v2.min.css"/>
    
        <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
        <script src="https://kendo.cdn.telerik.com/2021.2.616/js/kendo.all.min.js"></script>
    </head>
    <body>
      
    <div id="grid"></div>
    <ul id="context-menu">
      <li id="copyText">
        <input id="valueText"></input>
        <span id="closeValueText" class="k-icon k-i-close"></span>
      </li>
    </ul>
      
    <script>
    $(document).ready(function() {
      $("#grid").kendoGrid({
          selectable: "multiple row",
          allowCopy: true,
          columns: [
              { field: "productName" }, 
              { field: "category" }
          ],
          dataSource: [
              { productName: "Tea", category: "Beverages" },
              { productName: "Coffee", category: "Beverages" },
              { productName: "Ham", category: "Food" },
              { productName: "Bread", category: "Food" }
          ]
      });
      
      var closeContextMenu = false;
    
      var contextMenu = $("#context-menu").kendoContextMenu({
          target: "#grid",
          filter: "td",
          close: function(e) {
              if (!closeContextMenu) {
                  e.preventDefault();
              }  
          },
          open: function(e) {
              var cell = e.target;
              var row = $(cell).parent()[0];
              var grid = $("#grid").data("kendoGrid");
              var itemId = e.item.id;
    
              var cellText = cell.innerText;
              
              $(e.item).find("#valueText").val(cellText);
    
              closeContextMenu = false;
          }
      }).data("kendoContextMenu");
    
      $("#closeValueText").on("click", function(e) {
          closeContextMenu = true;
          contextMenu.close();
      });
    });
    </script>
    </body>
    </html>

    【讨论】:

    • 这不是我需要的。我只想复制第一列中的一部分文本让我们说咖啡中的“ffee”,我可以这样做。
    • 就像我说的:“如果您启用了多项选择,那么您的应用程序必须处理将文本复制到剪贴板。”因此,您需要在 select 事件中添加更多代码。您可以在右键单击时显示/弹出文本(例如咖啡),以便复制“ffee”。这是这里的基本思想。
    • 好的,谢谢 jpllosa。我会努力解决这个问题。
    • @PuneetGoel 除了我的第二个例子,你有没有找到另一种复制文本的方法?
    • 是的,我手动创建了这个功能。 dojo.telerik.com/@erpuneet507/ApehiTeq/4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多