Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.11.2021, 18:56
Аспирант
Отправить личное сообщение для Alexander3928 Посмотреть профиль Найти все сообщения от Alexander3928
 
Регистрация: 19.05.2021
Сообщений: 75

Пытаюсь повторить route на новом макете, но дает ошибку
Привет всем! Сразу к тебе решил повторить маршрутизацию для сайта которую я делал раньше. Оно на другом проекте работает ну и я решил попробывать опять его сделать на другом макете проекта. Повторил все как было на другом макете и в итоге получил ошибки Cannot set property 'innerHTML' of null
at all_pain_fun
. Может быть кто-то знает в чем ошибка? Из-за нее я даже не вижу страницы которые должны за счет маршрутизации грузится, типо изначальной страницой должно быть с функцией [page_1 тоесть первая ну и за счет маршрутизации передвигатся по 3 функциям page 1, page 2 и page_3

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./dist/styles.css">
    <title>Route</title>
</head>
<body>
    <!-- <script src="./dist/bundle.js"></script> -->
    <script type="module" src="./src/header/header.js"></script>
    <script type="module" src="./src/page_1/page_1.js"></script>
    <script type="module" src="./src/page_2/page_2.js"></script>
    <script type="module" src="./src/page_3/page_3.js"></script>
    <script type="module" src="./src/route/route.js"></script>
    <script type="module" src="./src/main/main.js"></script>
</body>
</html>


route

import {page_1 as index} from '../page_1/page_1.js';
import {page_2} from '../page_2/page_2.js'; 
import {page_3} from '../page_3/page_3.js';

const m = document.querySelector('main') 

const all_pain = { 
    index,
    page_2,
    page_3,
}

let history_ = location.search.slice(1)

const all_pain_fun = (first,pathname = location.search.slice(1)) => {

   if(first &&  history_ === pathname) return

   pathname.length > 10 && (pathname = 'index')

  !pathname &&  (pathname = 'index')

    m.innerHTML = '';

    all_pain[pathname](m)

    history.pushState('', {}, '?'+pathname) 
    
    history_ = location.search.slice(1)
}

all_pain_fun(false) 

document.querySelector('.header__menu').addEventListener('click', e=>{ 
    if(e.target.tagName !== 'A')return 
all_pain_fun(true, e.target.title) 
})


script с подключением все js файлы

import "./header/header.js"
import "./page_1/page_1.js"
import "./page_2/page_2.js"
import "./page_3/page_3.js"
import "./main/main.js"


тег main типо главная оболочка

function main(root) {
    const globalMain = document.createElement('main');
    globalMain.classList.add('global-main'); 
    root.append(globalMain);
}
main(document.querySelector('body'));


страница 1 (код у всех страниц одинаковый кроме названий)

function page_1(root) {
    const main_1 = document.createElement("div")
    main_1.classList.add("page_2")
    root.append(main_1)
}
export { page_1 }


header

const item_menu = [
    ["index", "Page_1"],
    ["page_2", "Page_2"],
    ["page_3", "Page_3"],
]

function header(root) {
    const header = document.createElement("header")
    header.classList.add("header")
    const header__wrapper = document.createElement("div")
    header__wrapper.classList.add("header__wrapper")
    const header__content = document.createElement("div")
    header__content.classList.add("header__content")
    const header__menu = document.createElement("ul")
    header__menu.classList.add("header__menu")

    let srt = "";
    for(let e of item_menu) {
        srt += `
            <li class="header__item">
                <a class="header__link" title="${e[0]}">${e[1]}</a>
            </li>
        `;
    }

    header__menu.innerHTML += srt;
    header__content.append(header__menu)
    header__wrapper.append(header__content)
    header.append(header__wrapper)
    root.append(header)
}

header(document.querySelector('body'));


index

import "./script.js"
import "./header/header.scss"
import "./page_1/page_1.scss"
import "./page_2/page_2.scss"
import "./page_3/page_3.scss"


P.S надеюсь тему обьяснил
Ответить с цитированием
  #2 (permalink)  
Старый 19.11.2021, 19:02
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

main.js должен подключаться до route.js, потому что route.js просит document.querySelector('main'), а его там нет.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 19.11.2021, 19:16
Аспирант
Отправить личное сообщение для Alexander3928 Посмотреть профиль Найти все сообщения от Alexander3928
 
Регистрация: 19.05.2021
Сообщений: 75

Да я вот заметил что даже просто найти такой элемент который я пытаюсь достать const m = document.querySelector("main")(или класс его) оно выдает null. хотя файл route подключен к index.html
Ответить с цитированием
  #4 (permalink)  
Старый 19.11.2021, 20:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

Alexander3928, страница загружается не сразу, а последовательно, а скрипты выполняются сразу как загрузились. На момент запуска route.js никакого main.js ещё не существует.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 19.11.2021, 21:06
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Сообщение от Aetae
а скрипты выполняются сразу как загрузились.
Нет. Скрипты с type=module выполняются после построения DOM, с учетом import
Надо в route сделать
import '../main/main.js';
Тогда route будет выполняться после main
Ответить с цитированием
  #6 (permalink)  
Старый 19.11.2021, 21:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

voraa, а module, ну да после загрузки страницы, ток оно всё равно следует правилам defer, а значит при прочих равных выполняется в порядке подключения.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 19.11.2021, 21:43
Аспирант
Отправить личное сообщение для Alexander3928 Посмотреть профиль Найти все сообщения от Alexander3928
 
Регистрация: 19.05.2021
Сообщений: 75

я разобрался. Неправильно просто выставил скрипты
Ответить с цитированием
  #8 (permalink)  
Старый 19.11.2021, 21:44
Аспирант
Отправить личное сообщение для Alexander3928 Посмотреть профиль Найти все сообщения от Alexander3928
 
Регистрация: 19.05.2021
Сообщений: 75

не обизательно. Я переставил скрипт то-есть main после header и заработало
Ответить с цитированием
  #9 (permalink)  
Старый 19.11.2021, 22:07
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Сообщение от Aetae
ток оно всё равно следует правилам defer, а значит при прочих равных выполняется в порядке подключения.
Вот только что попробовал
index.html
<head>
<script type=module src='./m1.js'></script>
<script type=module src='./m2.js'></script>
</head>
<body>
</body>


m1.js
import './m2.js'
console.log('m1');


m2.js
console.log('m2');


Выводит
m2 m2.js:1
m1 m1.js:2

Тут просто
<script type=module src='./m2.js'></script> вообще не будет работать.
Потому, что при обработке
import './m2.js'
отмечается, что надо скачать m2.js и выполнить его до m1.js
А второй раз модуль скачиваться и выполняться не будет

Так, что в примере с route
<script type="module" src="./src/page_1/page_1.js"></script>
<script type="module" src="./src/page_2/page_2.js"></script>
<script type="module" src="./src/page_3/page_3.js"></script>
вообще лишние.

import {page_1 as index} from '../page_1/page_1.js';
import {page_2} from '../page_2/page_2.js';
import {page_3} from '../page_3/page_3.js';
Уже достаточно, что бы они загрузились и выполнились перед route

Последний раз редактировалось voraa, 19.11.2021 в 22:15.
Ответить с цитированием
  #10 (permalink)  
Старый 19.11.2021, 22:23
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Сообщение от voraa
<script type=module src='./m2.js'></script> вообще не будет работать.
Ну тут я ошибся. Работает как раз он (посмотрел на сеть - кто там источник запроса)
Но все равно, когда дело касается модулей ES6, все модули сначала анализируются на то, кто из кого импортирует, и выполнение происходит с учетом этого.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск