Как использовать элемент документа и окна в astro JS?
Я хочу использовать окно или документ для возврата пути к текущей странице по умолчанию. Astro.site.pathname работает неправильно или отсутствует соответствующая документация.
Мой вопрос: как правильно использовать документ или окно в Astro JS?
Заранее спасибо!
4 ответа
Вам нужно написать скрипт внутри
<script is:inline></script>
если вы хотите использовать такие вещи, как
window
или же
document
. Таким образом, Astro не будет касаться вашего JS и включит его прямо в HTML. JS расположен в верхней части страницы между
--- ---
будет выполняться во время сборки.
Вы также можете получить доступ к текущему имени пути из компонента Astro, используяconst { pathname } = Astro.url
.
Тег скрипта
<script>
Тег, упомянутый в документации, достаточен для использования документа и окна, поскольку он предназначен для Javascript на стороне клиента.
https://docs.astro.build/en/guides/client-side-scripts/#using-script-in-astro
Встроенный скрипт
<script is:inline>
не рекомендуется, если он вам не нужен, потому что он предназначен для того, чтобы избежать связывания вашего скрипта, который редко требуется. И если вы используете компонент, содержащий этот сценарий, скажем, в 10 экземплярах (например, 10 карт), у вас будет 10 дублирований этого сценария, что приведет к снижению производительности при загрузке.
https://docs.astro.build/en/guides/client-side-scripts/#script-bundling
Пример
В этом примере показано, как создать несколько счетчиков на стороне клиента в чистом Astro, который похож на чистый html. Обратите внимание на использованиеdocument
вdocument.querySelectorAll(".card")
подробнее в https://docs.astro.build/en/core-concepts/astro-components/
---
//Astro Front matter => Javascript
---
<!-- html -->
<!-- style -->
<!-- script -->
<script>
console.log("int cards")
const cards = document.querySelectorAll(".card")
cards.forEach(card => {
const plus = card.querySelector('button.plus')
const minus = card.querySelector('button.minus')
const value = card.querySelector(".value")
plus.onclick = ()=>{value.textContent = parseInt(value.textContent) + 1}
minus.onclick = ()=>{value.textContent = parseInt(value.textContent) - 1}
});
</script>
здесь ссылка на полный пример проекта репо:
https://github.com/MicroWebStacks/astro-examples#04_client-counters
а здесь ссылка на прямой проект StackBlitz указывала на это репо
https://stackblitz.com/github/MicroWebStacks/astro-examples/tree/main/04_client-counters
По умолчанию Astro будет обрабатывать, оптимизировать и объединять любые теги и теги, которые он увидит на странице. Вы можете отказаться от такого поведения с помощью директивы is:inline.
Вы можете использоватьis:inline
такая директива в вашем.astro
компоненты:
---
// static build only
---
<script is:inline>
console.log(document, window)
</script>