Загрузите содержимое во всплывающем окне

#javascript #html

Вопрос:

Ниже приведен html-код, который имеет всплывающее окно, когда вы нажимаете на «открыть окно». Я добавил кнопку загрузки (внутри этого). Как только пользователь нажмет на нее, таблица должна быть загружена. Мне здесь чего-то не хватает. Кто-нибудь может мне помочь?

Я почти на завершающей стадии. Единственное, что еще предстоит сделать, — это загрузить содержимое

 <table border=1>
<tr>
<th>  </th>
<th> sub_domain </th>
<th> nReviews </th>
<th> Ratings_e </th>
<th> Text_e </th>
<th> rn </th>
<th> launcher_html </th>  
</tr>  

<tr>
<td align="right"> 1 </td>
<td> a1 </td> <td align="right">   2 </td>
<td> 1, 2 </td>
<td> asd, dfdsf </td>

<td align="left">   1 </td>
<td> <script>  

function openWindow1() {     var newtab1 = window.open("", "anotherWindow", "width=300,height=150");  
  newtab1.document.open();  
 
 
  newtab1.document.write('<table border=1> <button onclick="window.opener.exportTableToCSV('members.csv');">Export HTML Table To CSV File</button><br></br><tr><th>Ratings_e</th><th>Text_e</th></tr><tr><td>1</td><td>asd</td></tr><tr><td> 2</td><td> dfdsf</td></tr></table>');   
 function exportTableToCSV(filename) {
alert("I am an alert box!");
    var csv = [];
    var rows = document.querySelectorAll("table tr");
   
    for (var i = 0; i < rows.length; i  ) {
        var row = [], cols = rows[i].querySelectorAll("td, th");
       
        for (var j = 0; j < cols.length; j  )
            row.push(cols[j].innerText);
       
        csv.push(row.join(","));        
    }

    // Download CSV file
    alert('Hey')
    downloadCSV(csv.join("n"), filename);
}

  function downloadCSV(csv, filename) {
    var csvFile;
    var downloadLink;

    // CSV file
    csvFile = new Blob([csv], {type: "text/csv"});

    // Download link
    downloadLink = document.createElement("a");

    // File name
    downloadLink.download = filename;

    // Create a link to the file
    downloadLink.href = window.URL.createObjectURL(csvFile);

    // Hide download link
    downloadLink.style.display = "none";

    // Add the link to DOM
    document.body.appendChild(downloadLink);

    // Click download link
    downloadLink.click();
}
 
  }


  </script>  



<button onclick="openWindow1()"> Open Window </button>  
</td> </tr>   </table>

 

Ответ №1:

@пользователь11740857

Ваш код уже работает, за исключением одной глупой ошибки, заключающейся в том, что вы не туда поместили закрывающую } функцию «openWindow1».

Поскольку вы разместили его после функции «downloadCSV», это означает, что «exportTableToCSV» и «downloadCSV» находятся в области действия функции «openWindow1» и не будут определены в самом родительском окне, поэтому вы не можете использовать «window.opener» для доступа к этим функциям.

Решение 1: (и, вероятно, лучшее)

 <table border=1>
    <tr>
        <th></th>
        <th> sub_domain</th>
        <th> nReviews</th>
        <th> Ratings_e</th>
        <th> Text_e</th>
        <th> rn</th>
        <th> launcher_html</th>
    </tr>

    <tr>
        <td align="right"> 1</td>
        <td> a1</td>
        <td align="right"> 2</td>
        <td> 1, 2</td>
        <td> asd, dfdsf</td>

        <td align="left"> 1</td>
        <td>
            <script>

                function openWindow1() {
                    var newtab1 = window.open("", "anotherWindow", "width=300,height=150");
                    newtab1.document.open();


                    newtab1.document.write('<table border=1> <button onclick="window.opener.exportTableToCSV('members.csv');">Export HTML Table To CSV File</button><br></br><tr><th>Ratings_e</th><th>Text_e</th></tr><tr><td>1</td><td>asd</td></tr><tr><td> 2</td><td> dfdsf</td></tr></table>');
                }

                function exportTableToCSV(filename) {
                    alert("I am an alert box!");
                    var csv = [];
                    var rows = document.querySelectorAll("table tr");

                    for (var i = 0; i < rows.length; i  ) {
                        var row = [], cols = rows[i].querySelectorAll("td, th");

                        for (var j = 0; j < cols.length; j  )
                            row.push(cols[j].innerText);

                        csv.push(row.join(","));
                    }

                    // Download CSV file
                    alert('Hey')
                    downloadCSV(csv.join("n"), filename);
                }

                function downloadCSV(csv, filename) {
                    var csvFile;
                    var downloadLink;

                    // CSV file
                    csvFile = new Blob([csv], {type: "text/csv"});

                    // Download link
                    downloadLink = document.createElement("a");

                    // File name
                    downloadLink.download = filename;

                    // Create a link to the file
                    downloadLink.href = window.URL.createObjectURL(csvFile);

                    // Hide download link
                    downloadLink.style.display = "none";

                    // Add the link to DOM
                    document.body.appendChild(downloadLink);

                    // Click download link
                    downloadLink.click();
                }


            </script>


            <button onclick="openWindow1()"> Open Window</button>
        </td>
    </tr>
</table> 

Другой вариант-определить эти функции как переменные и передать их в открывшееся окно. Но приведенный выше код должен работать.

Более того, я бы посоветовал вам использовать IDE, которая высвечивает отступы в вашем коде, чтобы вы не расстраивались, но это ошибка!

Овации

отредактированный

Извините, я не видел, чтобы экспортировалось содержимое родительской таблицы. Это проблема с областями видимости. Вам необходимо определить функции, чтобы получить доступ к области действия нового окна. Вот код для этого, в котором вы можете видеть, что я объявляю функции экспорта в новом окне и что мы передаем окно области в первую функцию. Это делается для того, чтобы вы также могли использовать эти функции в окне partent.

Проверьте, соответствует ли это вашим потребностям

 <table border=1>
    <tr>
        <th></th>
        <th> sub_domain</th>
        <th> nReviews</th>
        <th> Ratings_e</th>
        <th> Text_e</th>
        <th> rn</th>
        <th> launcher_html</th>
    </tr>

    <tr>
        <td align="right"> 1</td>
        <td> a1</td>
        <td align="right"> 2</td>
        <td> 1, 2</td>
        <td> asd, dfdsf</td>

        <td align="left"> 1</td>
        <td>
            <script>

                function openWindow1() {
                    var newtab1 = window.open("", "anotherWindow", "width=300,height=150");
                    newtab1.document.open();

                    newtab1.document.write('<table border=1> <button onclick="exportTableToCSV(window,'members.csv');">Export HTML Table To CSV File</button><br></br><tr><th>Ratings_e</th><th>Text_e</th></tr><tr><td>1</td><td>asd</td></tr><tr><td> 2</td><td> dfdsf</td></tr></table>');
                    newtab1.exportTableToCSV = exportTableToCSV;
                    newtab1.downloadCSV = downloadCSV;
                }

                function exportTableToCSV(scopedWindow,filename) {
                    alert("I am an alert box!");
                    var csv = [];
                    var rows = scopedWindow.document.querySelectorAll("table tr");

                    for (var i = 0; i < rows.length; i  ) {
                        var row = [], cols = rows[i].querySelectorAll("td, th");

                        for (var j = 0; j < cols.length; j  )
                            row.push(cols[j].innerText);

                        csv.push(row.join(","));
                    }

                    // Download CSV file
                    alert('Hey')
                    scopedWindow.downloadCSV(csv.join("n"), filename);
                }

                function downloadCSV(csv, filename) {
                    var csvFile;
                    var downloadLink;

                    // CSV file
                    csvFile = new Blob([csv], {type: "text/csv"});

                    // Download link
                    downloadLink = document.createElement("a");

                    // File name
                    downloadLink.download = filename;

                    // Create a link to the file
                    downloadLink.href = window.URL.createObjectURL(csvFile);

                    // Hide download link
                    downloadLink.style.display = "none";

                    // Add the link to DOM
                    document.body.appendChild(downloadLink);

                    // Click download link
                    downloadLink.click();
                }


            </script>


            <button onclick="openWindow1()"> Open Window</button>
        </td>
    </tr>
</table> 

Ура x2

Комментарии:

1. Привет, Спасибо. но на самом деле я иду этим путем. Прямо сейчас он загружает первую таблицу (за пределами одной). Но мне нужно загрузить таблицу, которая есть во всплывающем окне

2. Смогли ли вы понять мою точку зрения 🙂 Ваш код верен, если я хочу загрузить вне таблицы, но он не будет загружаться внутри таблицы

3. Привет! Я отредактировал ответ, чтобы исправить эту проблему, я не заметил этого, извините. Там все, что нам нужно сделать, это предоставить функции окно области действия, чтобы она знала, какой документ использовать

4. Привет, Рубен, я думаю, мы можем объявлять функции внутри скрипта в любом месте, верно?. Также я попытался добавить еще одну строку в таблицы (первая таблица). Теперь кнопка загрузки не работает. Не уверен. Должны ли мы объявить идентификатор. У меня есть код здесь. Не могли бы вы мне помочь, пожалуйста

5. Привет! Да, вы можете объявить функции в глобальной области, и, вероятно, так и должно быть, потому что они будут использоваться глобально. В примере, который вы привели в качестве ответа, он, кажется, работает правильно, в чем дело?

Ответ №2:

Для 2 рядов

 <script>

                function exportTableToCSV(scopedWindow,filename) {
                    alert("I am an alert box!");
                    var csv = [];
                    var rows = scopedWindow.document.querySelectorAll("table tr");

                    for (var i = 0; i < rows.length; i  ) {
                        var row = [], cols = rows[i].querySelectorAll("td, th");

                        for (var j = 0; j < cols.length; j  )
                            row.push(cols[j].innerText);

                        csv.push(row.join(","));
                    }

                    // Download CSV file
                    alert('Hey')
                    scopedWindow.downloadCSV(csv.join(""), filename);
                }

                function downloadCSV(csv, filename) {
                    var csvFile;
                    var downloadLink;

                    // CSV file
                    csvFile = new Blob([csv], {type: "text/csv"});

                    // Download link
                    downloadLink = document.createElement("a");

                    // File name
                    downloadLink.download = filename;

                    // Create a link to the file
                    downloadLink.href = window.URL.createObjectURL(csvFile);

                    // Hide download link
                    downloadLink.style.display = "none";

                    // Add the link to DOM
                    document.body.appendChild(downloadLink);

                    // Click download link
                    downloadLink.click();
                }

</script>


<table border=1>
    <tr>
        <th></th>
        <th> sub_domain</th>
        <th> nReviews</th>
        <th> Ratings_e</th>
        <th> Text_e</th>
        <th> rn</th>
        <th> launcher_html</th>
    </tr>

    <tr>
        <td align="right"> 1</td>
        <td> a1</td>
        <td align="right"> 2</td>
        <td> 1, 2</td>
        <td> asd, dfdsf</td>

        <td align="left"> 1</td>
        <td>
            <script>

                function openWindow1() {
                    var newtab1 = window.open("", "anotherWindow", "width=300,height=150");
                    newtab1.document.open();

                    newtab1.document.write('<table border=1> <button onclick="exportTableToCSV(window,'members.csv');">Export HTML Table To CSV File</button><br></br><tr><th>Ratings_e</th><th>Text_e</th></tr><tr><td>1</td><td>asd</td></tr><tr><td> 2</td><td> dfdsf</td></tr></table>');
                    newtab1.exportTableToCSV = exportTableToCSV;
                    newtab1.downloadCSV = downloadCSV;
                }




            </script>


            <button onclick="openWindow1()"> Open Window</button>
        </td>
    </tr>
        <tr>
        <td align="right"> 1</td>
        <td> a1</td>
        <td align="right"> 2</td>
        <td> 2, 2</td>
        <td> asd1, dfdsf1</td>

        <td align="left"> 1</td>
        <td>
            <script>

                function openWindow2() {
                    var newtab2 = window.open("", "anotherWindow", "width=300,height=150");
                    newtab2.document.open();

                    newtab2.document.write('<table border=1> <button onclick="exportTableToCSV(window,'members.csv');">Export HTML Table To CSV File</button><br></br><tr><th>Ratings_e</th><th>Text_e</th></tr><tr><td>2</td><td>asd1</td></tr><tr><td> 2</td><td> dfdsf1</td></tr></table>');
                    newtab2.exportTableToCSV = exportTableToCSV;
                    newtab2.downloadCSV = downloadCSV;
                }




            </script>


            <button onclick="openWindow2()"> Open Window</button>
        </td>
    </tr>
</table>
 

Комментарии:

1. Есть ли причина писать две функции открытого окна для нескольких строк? Кроме того, в открывшемся окне кнопка загрузки помещается как прямой дочерний элемент элемента таблицы, что не является допустимым HTML

2. Ты хочешь сказать. 2 открытые окна не требуются. Не могли бы вы, пожалуйста, попытаться помочь мне здесь

3. Этот пост в первую очередь посвящен тому, как разрешить пользователю загружать данные из открытого окна. Опубликованный код помещает код для открытия дочернего окна в ячейку данных. Чтобы обобщить это, вы должны поместить скрипт за пределы таблицы (один раз) и иметь кнопку в каждой строке (родительской таблицы), передающую строку, которая находится в функции открытия окна, в качестве аргумента. Таким образом, функция открытия окна может генерировать таблицу дочернего окна из данных в строке, кнопка загрузки которой была нажата. Мой комментарий был о том, чтобы не кодировать вручную несколько функций, которые, по сути, делали одно и то же.

Ответ №3:

Таблицы данных Jquery

 <script src="https://cdn.datatables.net/buttons/1.7.1/css/buttons.dataTables.min.css"></script>
<script src="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css"></script>
<script>
$(document).ready(function() {
    $('#example').DataTable( {
        dom: 'Bfrtip',
        buttons: [
            'copy', 'csv', 'excel', 'pdf', 'print'
        ]
    } );
} );
</script>
<table id="example" class="display nowrap" style="width:100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
                <th>Office</th>
                <th>Age</th>
                <th>Start date</th>
                <th>Salary</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
                <td>Edinburgh</td>
                <td>61</td>
                <td>2011/04/25</td>
                <td>$320,800</td>
            </tr>
            <tr>
                <td>Garrett Winters</td>
                <td>Accountant</td>
                <td>Tokyo</td>
                <td>63</td>
                <td>2011/07/25</td>
                <td>$170,750</td>
            </tr>
            <tr>
                <td>Ashton Cox</td>
                <td>Junior Technical Author</td>
                <td>San Francisco</td>
                <td>66</td>
                <td>2009/01/12</td>
                <td>$86,000</td>
            </tr>
            <tr>
                <td>Cedric Kelly</td>
                <td>Senior Javascript Developer</td>
                <td>Edinburgh</td>
                <td>22</td>
                <td>2012/03/29</td>
                <td>$433,060</td>
            </tr>
            <tr>
                <td>Airi Satou</td>
                <td>Accountant</td>
                <td>Tokyo</td>
                <td>33</td>
                <td>2008/11/28</td>
                <td>$162,700</td>
            </tr>
            <tr>
                <td>Brielle Williamson</td>
                <td>Integration Specialist</td>
                <td>New York</td>
                <td>61</td>
                <td>2012/12/02</td>
                <td>$372,000</td>
            </tr>
            <tr>
                <td>Herrod Chandler</td>
                <td>Sales Assistant</td>
                <td>San Francisco</td>
                <td>59</td>
                <td>2012/08/06</td>
                <td>$137,500</td>
            </tr>
            <tr>
                <td>Rhona Davidson</td>
                <td>Integration Specialist</td>
                <td>Tokyo</td>
                <td>55</td>
                <td>2010/10/14</td>
                <td>$327,900</td>
            </tr>
            <tr>
                <td>Colleen Hurst</td>
                <td>Javascript Developer</td>
                <td>San Francisco</td>
                <td>39</td>
                <td>2009/09/15</td>
                <td>$205,500</td>
            </tr>

    </table>
 

Ответ №4:

Я не уверен, каковы требования к вашему проекту. но если вы хотите загрузить полную таблицу. Я бы предпочел использовать Jquery Datatables . В таблицах данных Jquery есть встроенная функция загрузки таблицы в формате PDF, EXCEL, CSV, также вы можете распечатать ее. вам не нужно писать такие длинные коды. Кроме того, код очень прост в написании и понимании. Взгляните на приведенный ниже пример.

 $(document).ready(function() {
    $('#example').DataTable( {
        dom: 'Bfrtip',
        buttons: [
            'copy', 'csv', 'excel', 'pdf', 'print'
        ]
    } );
} );
 

Для дальнейшего анализа Читайте Здесь

Пожалуйста, проголосуйте, если этот ответ поможет.

Комментарии:

1. Спасибо. Но где я должен поместить это в код? Не могли бы вы, пожалуйста, помочь мне?

2. Что вам нужно сделать, так это назначить идентификатор таблице в модальном режиме. затем перейдите по указанной ссылке в ответе, вы найдете несколько ссылок CDN, которые необходимы для таблиц данных для экспорта данных. разместите их в глобальном footer.php. Поместите предоставленный код в свой глобальный файл javascript ИЛИ на ту же страницу php, на которую добавлен модал.

3. Привет, Асад, я только что попробовал твой подход с примером ниже. Вы можете это увидеть, пожалуйста

4. не могли бы вы поделиться ссылкой @user11740857

5. Только что добавлено выше. Заголовок «Таблицы данных Jquery»