Jquery在Mac上导出csv Safari问题Mime Types& IE9导出问题

时间:2013-09-27 11:27:02

标签: jquery internet-explorer csv safari mime-types

我正在将我的html表格导出到csv,这在Chrome和Firefox中运行良好,在Windows上的Safari中它可以正常运行 - 您可以选择打开或保存文件,虽然名称为“未知”但是如果您这样做并打开下载文件在那里并正确打开。

但是,在Mac上的Safari上,它会尝试在另一个浏览器窗口中打开它并失败。

我正在研究几种选择:

  1. 创建一个单独的按钮以导出Safari MAc的CSV
  2. 使浏览器打开“打开/另存为”对话框。
  3. 关于最佳方法的其他建议..?
  4. 我已经浏览了一下,我认为第二点的答案是否定的 - 你不能强迫浏览器行为。

    然而,我无法找到一种在safari mac中导出的方法,或者是如何做到这一点的好方法。

    我用来导出csv的Jquery代码如下:

       <script type="text/javascript">
            $(document).ready(function () {
    
                function exportTableToCSV($table, filename) {
    
                    var $rows = $table.find('tr:has(td)'),
    
                        // Temporary delimiter characters unlikely to be typed by keyboard
                        // This is to avoid accidentally splitting the actual contents
                        tmpColDelim = String.fromCharCode(11), // vertical tab character
                        tmpRowDelim = String.fromCharCode(0), // null character
    
                        // actual delimiter characters for CSV format
                        colDelim = '","',
                        rowDelim = '"\r\n"',
    
                        // Grab text from table into CSV formatted string
                        csv = '"' + $rows.map(function (i, row) {
                            var $row = $(row),                            
                                $cols = $row.find('td');
    
                            return $cols.map(function (j, col) {
                                var $col = $(col),
                                    text = $col.text();
    
                                return text.replace('"', '""'); // escape double quotes
    
                            }).get().join(tmpColDelim);
    
                        }).get().join(tmpRowDelim)
                            .split(tmpRowDelim).join(rowDelim)
                            .split(tmpColDelim).join(colDelim) + '"',
    
                        // Data URI
                        csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);
    
                    $(this)
                        .attr({
                            'download': filename,
                            'href': csvData,
                            'target': '_blank'
                        });
                }
    
                // This must be a hyperlink
                $(".export").on('click', function (event) {
                    // CSV
                    exportTableToCSV.apply(this, [$('#tableContainer>table'), 'export.csv']);
    
                    // IF CSV, don't do event.preventDefault() or return false
                    // We actually need this to be a typical hyperlink
    
                });
            });
        </script>
    

    我的html表是从ajax创建的,这是一个例子:

        $.ajax({
            type: "POST",
            //contentType: "application/json; charset=utf-8",
            url: theUrl,
            data: { 'manufacturer': manufacturer, 'country': country, 'startDate': startDate, 'endDate': endDate, 'chartType': chartType },
            dataType: "json",
            success: function (data) {
                setTimeout($.unblockUI, 50);
    
                if (data.length == 0) {
                    $('#noData').show();
                    $('#chartContainer').hide();
                    $('#tableContainer').hide();
                    $('#exportData').hide();
                }
                var retailerNameArray = [];
                var impressionsArray = [];
                var intsArray = [];
                for (var i = 0; i < data.length; i++) {
                    var impRow = data[i];
    
    
                    //only display on graph if not 0
                    if (impRow.RetailerImpressionCount > 0) {
                        //put into an array
                        var retailer = impRow.RetailerDescription;
                        var imps = impRow.RetailerImpressionCount;
                        retailerNameArray.push(retailer);
                        impressionsArray.push(imps);
                        var clicks = impRow.RetailerClickCount;
                        intsArray.push(clicks);
    
                        $('#noData').hide();
                        $('#chartContainer').show();
                        $('#tableContainer').show();
                        $('#exportData').show();
    
                    }
                }
    
     var table = document.getElementById("usertable");
                var tabledata = "";
                tabledata += "<tr class =\"tableHeader\">";
                tabledata += "<td>Retailer</td>";
                tabledata += "<td>Impressions</td>";
                tabledata += "<td>Clicks</td>";
                tabledata += "<td>CTR</td>";
                tabledata += "<td>Percentage</td>";
                tabledata += "</tr>";
                for (var i = 0; i < data.length; i++) {
                    var impDataRow = data[i];
                    tabledata += "<tr>";
                    tabledata += "<td>" + impDataRow.RetailerDescription + "</td>";
                    tabledata += "<td>" + impDataRow.RetailerImpressionCount + "</td>";
                    tabledata += "<td>" + impDataRow.RetailerClickCount + "</td>";
                    tabledata += "<td>" + impDataRow.ClickThroughRate.toFixed(2) + "%</td>";
                    tabledata += "<td>" + impDataRow.Percentage.toFixed(2) + "%</td>";
                    tabledata += "</tr>";
    
                }
                    //tabledata += "<tfoot>";
                    tabledata += "<tr>";
                    tabledata += "<td>Total</td>";
                    tabledata += "<td>" + impDataRow.TotalImpressionCount + "</td>";
                    tabledata += "<td>" + impDataRow.TotalClickCount + "</td>";
                    tabledata += "<td>" + impDataRow.TotalClickThroughRate.toFixed(2) + "%</td>";
                    tabledata += "<td>" + impDataRow.TotalPercentage.toFixed(2) + "%</td>";
                    tabledata += "</tr>";
                    // tabledata += "</tfoot>";
    
                table.innerHTML = tabledata;
                $("th");
                $("tr:even");
                $("tr:odd");
            }
        }
           );
        });
    
    
        //]]>
    

    修改

    我认为(虽然不确定)这条线在safari mac中没有正常工作:

    csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);
    

    我正在进一步研究这个问题,但是应该将其设置为特别适合野生动物园的东西吗? - 我知道safari有安全的mime类型但他们有一个安全的mime类型的csv?

    修改

    虽然没有理想我已经为safari创建了一个新按钮并使用了:

     csvData = 'data:text/plain,' + encodeURIComponent(csv);
    

    因为这在safari中被认为是一种安全的mime类型,所以它在一个新的标签中打开它 - 这就是我为lokoing做的... ...

    现在我正在与IE9进行斗争,试图找到一个在aswel中工作的解决方案。

    到目前为止,这是我尝试过的双门跑车:

    http://blog.paxcel.net/blog/savedownload-file-using-html5-javascript-the-download-attribute-2/

    但是我无法让这个工作

    http://www.kunalbabre.com/projects/table2CSV.php

    此页面上的选项3.1有效,但我不熟悉php,所以不确定如何让它适合我。

    修改

    希望这可以得到答案:

    http://onwebdev.blogspot.com/2011/02/jquery-creating-csv-file.html

    修改 现在看这个:

    Export html table to excel in asp.net MVC2

    试图让它发挥作用..

    修改

    在safari和IE 10中使用上述作品

    一如既往地非常感谢任何输入!

1 个答案:

答案 0 :(得分:0)

对于IE 9,这个工作正常,请尝试:

如果您在设置的“高级”选项卡中设置了“不将加密文件保存到磁盘”,并且您的站点在HTTPS中运行,则会在IE上发生此问题。此设置主动阻止下载(当然)。卫生署!

在此处查到:https://drupal.org/node/1736296

至于IE 5 - 8,请参阅:http://support.microsoft.com/kb/323308