тривиальный вопрос: html + js
Здравствуйте.
не работаю с js, поэтому прошу помощи. у меня есть кластер с серверами приложений, каждый из которых умеет отдавать диагностическую информацию о себе через встренную jsp. я пытаюсь собрать простую агреггированную страницу со всеми диаг-страницами всех серверов кластера. для этого нарисовал простенькую страницу, которая через iframe опрашивает каждый сервер. однако, захотелось усложнить страницу, и сделать не просто колонку со всей инфой из результата страницы диагностики, а вырезать оттуда что-то через split + substr. пожалуйста помогите с накидыванием "скелета". как работать с сабстром и сплитом мне понятно, а вот как вызвать функцию из html и вставить ее результат в отдельную колонку - мне не очень фантазии хватает. <html class="DiagPage"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body > <script type = "text/javascript"> function getSubColumn(columnIndex){ var subColumn = document.getElementById('sp').innerHTML.split(';')[columnIndex]; return subColumn; } </script> Тест <table style="text-align: left; width: 1100px;" border="1" cellpadding="0" cellspacing="0" bgcolor="#cccccc" leftmargin="50" topmargin="0"> <tbody> <tr align="center"> <td nowrap height=18 width=100>Имя схемы</td> <td>Диагностическая информация</td> </tr> <tr> <td nowrap height=18 width=100 align="center" >aaa</td> <td> <iframe id = "sp" frameborder = "false" src="https://myserver:8443/diag" height=18 width=1750/> </td> </tr> <tr> <td nowrap height=18 width=100 align="center" >bbb</td> <td> <iframe id = "sp" frameborder = "false" src="https://myserver:8445/diag" height=18 width=1750/> </td> </tr> </tbody> </table> </body> </html> upd#1 по ссылкам https://myserver:8445/diag возвращается простой html, тело которого выглядит как текстовая строка типа: status: valid; run: 13.01.2022 12:00:00; ... |
wolfio,
на всякий случай https://learn.javascript.ru/fetch |
Всё не так просто, друже.)
Обращение по разным портам даже одного домена считается разными origin, а обращение к разным origin из javascript запрещено в целях безопасности. Разрешить это можно на каждом сервер добавив header Access-Control-Allow-Origin, однако с доступом к содержимому iframe это не поможет всё равно. Можно и это решить, нагородив общение с iframe посредством postMessage, что потребует доработки с обоих сторон, либо воспользовавшись, как предложили выше, fetch и работая сразу со строками без фреймов. Я для похожих задач давным давно не имея доступа к серверам просто использовал пользовательский скрипт через temprmonkey который для каждого домена проводил заранее нужные манипуляции, а верхняя страничка просто подключала их во фрейме как обычно.) |
вы можете показать как в ячейку таблицы вставить результат респонса из фетча?
я подзастрял в экспериментах. с селекторами в js все как-то путано. функцию прямо из ячейки колонки вызывать можно? |
<table id="table" ... fetch('https://myserver:8443/diag') .then(body => body.text()) .then(text => text.split(';')) .then(array => table.rows[0].cells[0].innerHTML = array.join('<br>')); |
Пардон, но кажется я недопонимаю вашего ответа.
Результат так должен выглядеть? <html class="DiagPage"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body > <script type = "text/javascript"> function getSSData(URL){ return fetch(URL).then(body => body.text()).then(text => text.split(';')).then(array => table.rows[0].cells[0].innerHTML = array.join('<br>')); } </script> Тест <table style="text-align: left; width: 1100px;" border="1" cellpadding="0" cellspacing="0" bgcolor="#cccccc" leftmargin="50" topmargin="0"> <tbody> <tr align="center"> <td nowrap height=18 width=100>Имя схемы</td> <td>Диагностическая информация</td> </tr> <tr> <td nowrap height=18 width=100 align="center" >aaa</td> <td> <iframe id = "sp" frameborder = "false" src="https://myserver:8443/diag" height=18 width=1750/> </td> </tr> <tr> <td nowrap height=18 width=100 align="center" >bbb</td> <td> getSSData('https://myserver:8443/diag'); </td> </tr> </tbody> </table> </body> </html> |
Нет, скрипт отдельно, разметка отдельно.
Но если так уж хочется, то условно так: <html class="DiagPage"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> Тест <table style="text-align: left; width: 1100px;" border="1" cellpadding="0" cellspacing="0" bgcolor="#cccccc" leftmargin="50" topmargin="0"> <tbody> <tr align="center"> <td nowrap height=18 width=100>Имя схемы</td> <td>Диагностическая информация</td> </tr> <tr> <td nowrap height=18 width=100 align="center" >aaa</td> <td data-href="https://myserver:8443/diag"> </td> </tr> <tr> <td nowrap height=18 width=100 align="center" >bbb</td> <td data-href="https://myserver:8444/diag"> </td> </tr> </tbody> </table> <script type = "text/javascript"> function getText(url) { return fetch(url).then(body => body.text()) } document.querySelectorAll('td[data-href]').forEach(td => { getText(td.getAttribute('data-href')).then(text => { const html = text.split(';').join('<br>'); td.innerHTML = html; }); }) </script> </body> </html> |
ошибка если как есть.
мне кажется мы ушли в космос) а нельзя вернуться к iframe и сабстром вытащить инфу из его значения просто? если честно, я не вижу разницы между iframe и fetch, разве что новые более неизвестные ошибки появились :) |
ошибка осталась.
мне кажется мы ушли в космос) а нельзя вернуться к iframe и сабстром вытащить инфу из его значения просто? если честно, я не вижу разницы между iframe и fetch, разве что новые более неизвестные ошибки появились :) |
Нельзя ничего из iframe вытащить, если он загружен с другого домена (не с того, с которого сама страница пришла)
|
Часовой пояс GMT +3, время: 22:18. |