Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   тривиальный вопрос: html + js (https://javascript.ru/forum/css-html/83558-trivialnyjj-vopros-html-js.html)

wolfio 13.01.2022 14:45

тривиальный вопрос: 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; ...

рони 13.01.2022 15:00

wolfio,
на всякий случай https://learn.javascript.ru/fetch

Aetae 13.01.2022 15:11

Всё не так просто, друже.)
Обращение по разным портам даже одного домена считается разными origin, а обращение к разным origin из javascript запрещено в целях безопасности. Разрешить это можно на каждом сервер добавив header Access-Control-Allow-Origin, однако с доступом к содержимому iframe это не поможет всё равно.
Можно и это решить, нагородив общение с iframe посредством postMessage, что потребует доработки с обоих сторон, либо воспользовавшись, как предложили выше, fetch и работая сразу со строками без фреймов.

Я для похожих задач давным давно не имея доступа к серверам просто использовал пользовательский скрипт через temprmonkey который для каждого домена проводил заранее нужные манипуляции, а верхняя страничка просто подключала их во фрейме как обычно.)

wolfio 13.01.2022 15:42

вы можете показать как в ячейку таблицы вставить результат респонса из фетча?
я подзастрял в экспериментах. с селекторами в js все как-то путано. функцию прямо из ячейки колонки вызывать можно?

Aetae 13.01.2022 15:48

<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>'));

wolfio 13.01.2022 15:56

Пардон, но кажется я недопонимаю вашего ответа.

Результат так должен выглядеть?

<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>

Aetae 13.01.2022 16:26

Нет, скрипт отдельно, разметка отдельно.

Но если так уж хочется, то условно так:
<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">&nbsp;</td>
  </tr>
  <tr>
    <td nowrap height=18 width=100 align="center" >bbb</td>
    <td data-href="https://myserver:8444/diag">&nbsp;</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>

wolfio 13.01.2022 17:03

ошибка если как есть.



мне кажется мы ушли в космос)
а нельзя вернуться к iframe и сабстром вытащить инфу из его значения просто? если честно, я не вижу разницы между iframe и fetch, разве что новые более неизвестные ошибки появились :)

wolfio 13.01.2022 17:13

ошибка осталась.



мне кажется мы ушли в космос)
а нельзя вернуться к iframe и сабстром вытащить инфу из его значения просто? если честно, я не вижу разницы между iframe и fetch, разве что новые более неизвестные ошибки появились :)

voraa 13.01.2022 17:15

Нельзя ничего из iframe вытащить, если он загружен с другого домена (не с того, с которого сама страница пришла)


Часовой пояс GMT +3, время: 05:27.