14.01.2021, 22:11
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Как правильно создать новый таб с html?
Добрый день,
есть клиент на JS, в котором формируются данные. На основе этих данных я хочу сгенерить html и по евенту разместить этот html в новый таб.
То есть грубо говоря, у меня есть где-то что-то примерно как
<a href="XXX" target="_blank">Ссылка откроется в новом окне</a>
и при нажатии на нее, вызывается моя функция в JS, которая генирирует текст для XXX и этот текст в виде html+js+css открывается в новом табе.
Понимаю, что я могу послать на мой сервер ссылку-запрос для генерации такой страницы, далее на клиенте создать ссылку и показать ее пользователю, а далее пользователь может тыкнуться на эту ссылку или нет. Но это приведет к тому, что мне надо будет хранить номер ссылки в зависимости от пользователя, и пользователь может забыть или не захотеть тыкнуться.
Запутался и не понимаю разумно это или нет, или есть какие-то более правильные методы, пожалуйста, посоветуйте, как это принято делать!!!
Для чего это мне, имею самопально написанную базу молекулярных структур https://www.elegant-nmr.com/mdb/ (форучанам - огромное спасибо за помощь!!!) . От пользователей появилась хотелка, чтобы пользователь мог сохранить одну молекулу себе в виде отдельного html и, возможно вставил бы себе на сайт со ссылкой на меня.
Спасибо!
|
|
16.01.2021, 08:16
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Что должен получить пользователь, страницу (текст HTML), или ссылку, по которой он должен будет получать страницу? Что он должен вставлять на свой сайт прямо страницу или ссылку, по которой он должен будет получать страницу от вашего сервера?
Просто сгенерить страницу (как текст) и перейти на нее несложно.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
</div>
<a id=link target="_blank" >Открыть новую вкладку</a>
<script>
// Это текст новой страницы
let page=`
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
<style>
h3 {
color:red;
}
</style>
<s`+`cript>
window.onload = function () {
alert ('Вот. Сгенегили, открыли, вывели!')
}
</`+`script>
</head>
<body>
<h3>New page</h3>
Всякое бла-бла-бла<br>
Очень много бла-бла-бла<br>
Опять бла-бла-бла<br>
</body>
</html>
`; // конец текста сраницы
// По клику на <a> формируем ему href
document.getElementById('link').addEventListener('click', function () {
let blob = new Blob([page], {type : 'text/html'});
this.href = window.URL.createObjectURL(blob)
})
</script>
</body>
</html>
(С тегами <script></script> приходится поступать так. Иначе они распознаются парсером html как часть текущей страницы, а не как часть строки)
Но если нужна ссылка, то надо сгенерить URL в виде GET запроса к серверу со всеми параметрами. И давать ее
Последний раз редактировалось voraa, 16.01.2021 в 08:43.
|
|
16.01.2021, 13:29
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Огромное-преогромное спасибо!!!
Во, как раз то, что хотел!
У меня есть два варианта, если пользователь хочет вставить что-то стандартное, то проще сгенерировать на сервере страницу и дать на нее ссылку (это я понимаю как сделать), но есть случаи, когда пользователь хочет сделать специальную страничку на основании им отредактированных данных, и Ваш вариант, как раз и решает мою вторую задачу. СПАСИБО ОГРОМНОЕ!!!
|
|
20.04.2021, 18:59
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Позвольте, пожалуйста, поднять эту же тему.
Обсуждаемый пример классно работает, но от юзеров пришел отзыв, что они ассоциируют линк со внешним ресурсом, а у меня новый ТАБ генерится внутри JS и без необходимости что-то качать по интернету.
То есть теперь хочется, чтобы ТАБ открывался не по нажатию ссылки, а по нажатию кнопки.
А попробовал в лоб заменить, и у меня не получилось, попробовал поместить линк внутрь кнопки - тоже как-то не красиво...
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
</div>
<button><a id=link target="_blank" >Открыть новую вкладку</a></button>
<script>
// Это текст новой страницы
let page=`
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
<style>
h3 {
color:red;
}
</style>
<s`+`cript>
window.onload = function () {
alert ('Вот. Сгенегили, открыли, вывели!')
}
</`+`script>
</head>
<body>
<h3>New page</h3>
Всякое бла-бла-бла<br>
Очень много бла-бла-бла<br>
Опять бла-бла-бла<br>
</body>
</html>
`; // конец текста сраницы
// По клику на <a> формируем ему href
document.getElementById('link').addEventListener('click', function () {
let blob = new Blob([page], {type : 'text/html'});
this.href = window.URL.createObjectURL(blob)
})
</script>
</body>
</html>
Пожалуйста, подскажите, можно ли у кнопки как-то свойство href создать, чтобы такой ТАБ открыть?
Спасибо!
|
|
20.04.2021, 19:05
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,227
|
|
Was-Ja, тебя кто такое "научил" ваять?
|
|
20.04.2021, 19:22
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Сообщение от ksa
|
Was-Ja, тебя кто такое "научил" ваять?
|
здесь на форуме научили, я еще в сентябре прошлого года жаву от жавасткипта отличить не мог, а сейчас самописанный клиент на своей же базе: https://www.elegant-nmr.com/mdb.html?rm
А разве моя хотелка не логична - мне несколько бета тестеров именно это заметила.
|
|
20.04.2021, 19:42
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
</div>
<button id='but'>Открыть новую вкладку</button>
<script>
// Это текст новой страницы
let page=`
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" lang="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0" >
<style>
h3 {
color:red;
}
</style>
<s`+`cript>
window.onload = function () {
alert ('Вот. Сгенегили, открыли, вывели!')
}
</`+`script>
</head>
<body>
<h3>New page</h3>
Всякое бла-бла-бла<br>
Очень много бла-бла-бла<br>
Опять бла-бла-бла<br>
</body>
</html>
`; // конец текста сраницы
// По клику на <a> формируем ему href
document.getElementById('but').addEventListener('click', function () {
let blob = new Blob([page], {type : 'text/html'});
window.open(window.URL.createObjectURL(blob), '_blank')
})
</script>
</body>
</html>
|
|
20.04.2021, 19:53
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,227
|
|
Сообщение от Was-Ja
|
А разве моя хотелка не логична
|
Хотеть заменить ссылку на кнопку - это одно...
А вот хранить некую страницу в переменной - это уже какой-то трэш.
|
|
20.04.2021, 20:29
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Супер, СПАСИБО огромное, voraa!!!
|
|
20.04.2021, 20:35
|
Кандидат Javascript-наук
|
|
Регистрация: 20.09.2020
Сообщений: 130
|
|
Сообщение от ksa
|
Хотеть заменить ссылку на кнопку - это одно...
А вот хранить некую страницу в переменной - это уже какой-то трэш.
|
не, не треш. Тут смысл такой, у меня в базе почти миллиард геометрий молекул. Юзер долго и упорно ищет то, что он хочет, и, потом ему хочется запомнить результат поиска. А еще взять и послать результат поиска по мейлу своему знакомому. Вот тут я втыкаю найденную геометрию (она маленькая, килобайты примерно) и добавляю JS по отрисовке (70 килобайт), и, вуаля, человек имеет статический HTML, который ни на что не ссылается, но позволяет показывать найденную молекулу или набор молекул и, при необходимости сохранять пространственные координаты в общераспространенных форматах.
Я сам 30 лет назад о таком мечтал, но тогда у меня не было под рукой базы с миллиардом молекул, да и JS я тогда не знал, а на тикле такое нарисовать было очень не удобно.
|
|
|
|