Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514

Как устранить ошибку Uncaught TypeError: btnLeft.onclick is not a function?

10.08.2020, 20:05. Показов 3682. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как устранить ошибку Uncaught TypeError: btnLeft.onclick is not a function без потери правильной работы слайдера?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
let init = () => {
  blocks = document.querySelectorAll('.slider__item');
  Slider = document.querySelector('.slider');
  btnLeft = document.getElementById('btnLeft');
  btnRight = document.getElementById('btnRight');
  SafeSrc = [];
  gapRight = 0;
  step = 0;
  CoordsBlocks = [...blocks].map((curentV, index, array) => {
    return array[index].getBoundingClientRect();
  });
 
  for (let i = 0; i < blocks.length; i++) {
    blocks[i].remove();
  }
  for (let i = 0; i < blocks.length; i++) {
    blocks[i].remove();
  }
  Slider.append(blocks[0]);
 
  btnLeft.onclick = () => {
    drawRight();
    moveLeft();
 
    let y = btnRight.onclick;
    btnRight.onclick = null;
    setTimeout(() => {
      btnRight.onclick = y;
    }, 1000);
  }
 
  btnRight.onclick = () => {
    drawLeft();
    moveRight();
 
    let y = btnLeft.onclick;
    btnLeft.onclick = null;
    setTimeout(() => {
      btnLeft.onclick = y;
    }, 1000);
  }
  let ty = setInterval(() => {
    btnLeft.onclick();
  }, 1000);
 
}//end of init
let drawRight = () => {
  ++step;
  if (step >= blocks.length) {
    step = 0;
  }
  let gapRight = CoordsBlocks[step].width;
  blocks[step].style.left = gapRight + 'px';
  Slider.append(blocks[step]);
}
let drawLeft = () => {
  --step;
  if (step < 0) {
    step = blocks.length - 1;
  }
  let gapRight = CoordsBlocks[step].width;
  blocks[step].style.left = -gapRight + 'px';
  Slider.append(blocks[step]);
}
let moveLeft = () => {
  let x = btnLeft.onclick;
  btnLeft.onclick = null;
  let twoElems = document.querySelectorAll('.slider__item');
  let offset = -1;
 
  CoordstwoElems = [...twoElems].map((curentV, index, array) => {
    return array[index].getBoundingClientRect();
  });
 
  for (let i = 0; i < twoElems.length; i++) {
    twoElems[i].style.left = offset * CoordstwoElems[i].width + 'px';
    offset++;
  }
  setTimeout(() => {
    twoElems[0].remove();
    btnLeft.onclick = x;
  }, 1000);
}
 
let moveRight = () => {
  let x = btnRight.onclick;
  btnRight.onclick = null;
  let twoElems = document.querySelectorAll('.slider__item');
  let offset = 0;
  twoElems = Array.from(twoElems);
  twoElems = twoElems.reverse();
 
  CoordstwoElems = [...twoElems].map((curentV, index, array) => {
    return array[index].getBoundingClientRect();
  });
  CoordstwoElems.reverse();
 
  for (let i = 0; i < twoElems.length; i++) {
    twoElems[i].style.left = offset * CoordstwoElems[i].width + 'px';
    offset++;
  }
  setTimeout(() => {
    twoElems[twoElems.length - 1].remove();
    btnRight.onclick = x;
  }, 1000);
}
window.addEventListener('load', init);
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
    <div class="slider">
        <div class="slider__item slider__img1"></div>
        <div class="slider__item slider__img2"></div>
        <div class="slider__item slider__img3"></div>
        <div class="slider__item slider__img4"></div>
        <div class="slider__item slider__img5"></div>
        <div class="slider__item slider__img6"></div>
    </div>
    <div class="buttons">
        <button id="btnLeft">left</button>
        <button id="btnRight">Right</button>
    </div>
 
    <script src="script.js"></script>
</body>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
*{
    margin:0px;
    padding:0px;
    box-sizing: border-box;
}
.slider{
    width:700px;
    height:400px;
    border:1px solid blue;
    margin:100px auto 0px auto;
    position: relative;
    /* overflow: hidden; */
}
.slider__item{
    width: 700px;
    height:400px;
    position: absolute;
    top:0px;
    left:0px;
    background-repeat: no-repeat;
    background-size: cover;
    transition:all 1s ease-in-out 0s;
}
.slider__item > img{
    width:100%;
    height:100%;
}
.slider__img1{
    background-image: url(imgs/1.jpg);
}
.slider__img2{
    background-image: url(imgs/2.jpg);
}
.slider__img3{
    background-image: url(imgs/3.jpg);
}
.slider__img4{
    background-image: url(imgs/4.jpg);
}
.slider__img5{
    background-image: url(imgs/5.jpg);
}
.slider__img6{
    background-image: url(imgs/6.jpg);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2020, 20:05
Ответы с готовыми решениями:

Почему возникает ошибка Uncaught TypeError: btnLeft.onclick is not a function?
Почему возникает ошибка Uncaught TypeError: btnLeft.onclick is not a function? let init = () =&gt; { blocks =...

Uncaught TypeError: Cannot set property 'onclick' of null(anonymous function)
пробовал произвести расчет.Но консоль пишет-Benzin.html:27 Uncaught TypeError: Cannot set property 'onclick' of null(anonymous function) ...

Как исправить такую ошибку Uncaught TypeError: num.split is not a function?
Заранее спасибо!!!! Написать функцию, входным параметром которой является строка ,содержащая символьную запись числа в двоично -...

6
Эксперт JS
 Аватар для Iverycool
1586 / 796 / 362
Регистрация: 01.02.2019
Сообщений: 1,047
10.08.2020, 20:19
AlexKOR5, нельзя просто так взять и вызвать onclick!
Замените строку 43 на btnLeft.click();

Не по теме:

У вас в коде полно и других ошибок, например нажатие кнопок смены кадра "перекрывается" постоянным листанием

1
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
10.08.2020, 20:37  [ТС]
Спасибо за ответ.
Уточните пожалуйста за ошибки.
0
Эксперт JS
 Аватар для Iverycool
1586 / 796 / 362
Регистрация: 01.02.2019
Сообщений: 1,047
10.08.2020, 20:59
AlexKOR5, причина ошибок кроется в "перенакосячении" логики работы вашей программы.
Ошибку исправлять у меня сейчас нет времени, обращу внимание лишь на явно видимые "проблемы":
1. В функции init переменные не объявлены, тем самым загрязняя глобальную область
2. SafeSrc и CoordsBlocks с большой буквы, зачем? Только конструкторы классов должны начинаться с большой буквы
Про ваши переменные говорить можно много, лучше почитайте https://learn.javascript.ru/variables
Цитата Сообщение от AlexKOR5 Посмотреть сообщение
}//end of init
Вспоминаю ооочень старые добрые времена лучше просто после окончании функции ставить пустую строку, а ещё лучше разбить проект на отдельные файлы.
Цитата Сообщение от AlexKOR5 Посмотреть сообщение
[...blocks].map((curentV, index, array) => {
return array[index].getBoundingClientRect();
});
Зачем так мудрить?
JavaScript
1
[...blocks].map(block => block.getBoundingClientRect());
https://learn.javascript.ru/array-methods#map
Постарайтесь прочитать учебник
1
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
10.08.2020, 22:06  [ТС]
Спасибо большое.
Если все же будет время то напишите в чем именно ошибка, я бы хотел это исправить сам.
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
11.08.2020, 09:33
Цитата Сообщение от AlexKOR5 Посмотреть сообщение
в чем именно ошибка
Вы управляете состоянием своего слайдера используя атрибуты элементов.
При клике на btnRight(32), вы устанавливаете btnLeft.onclick = null и вызываете этот null в интервале btnLeft.onclick();(43), там много у вас таких мест.

В двух словах: ваш слайдер должен быть независим от кнопок, то есть у него есть слайды, он знает как и в какую сторону их менять (или не менять, то есть слайдер сам "должен решать" что ему делать, в зависимости от своего состояния), и есть у него "интерфейс" с методами, которые вы можете вызывать в любое время (в данном случае при нажатии на кнопку), а тут ваши кнопки "слишком много знают" и получается мешанина, что тоскливо становится в этой простыне разбираться.
1
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
12.08.2020, 08:53  [ТС]
В двух словах: ваш слайдер должен быть независим от кнопок, то есть у него есть слайды, он знает как и в какую сторону их менять (или не менять, то есть слайдер сам "должен решать" что ему делать, в зависимости от своего состояния), и есть у него "интерфейс" с методами, которые вы можете вызывать в любое время (в данном случае при нажатии на кнопку), а тут ваши кнопки "слишком много знают" и получается мешанина, что тоскливо становится в этой простыне разбираться.
Я не знаю как сделать независимый слайдер от кнопок чтобы все прекрасно работало.
Помогите.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
let leftBtn = document.getElementById('btnLeft');
let rightBtn = document.getElementById('btnRight');
const slider = document.querySelector('.slider');
let slides = document.querySelectorAll('.slider__item');
let slidesWidth = [...slides].map(currentV => { return currentV.getBoundingClientRect() });
let step = 0;
let interval;
 
let init = () => {
    for (let i = 1; i < slides.length; i++) {
        slides[i].remove();
    }
    leftBtn.addEventListener('click', actionLeftbtn);
    rightBtn.addEventListener('click', actionRightbtn);
    interval = setInterval(() => {
        leftBtn.click();
    }, 1000);
    window.onblur = () => {
        clearInterval(interval);
    }
    window.onfocus = () => {
        interval = setInterval(() => {
            leftBtn.click();
        }, 1000);
    }
}//end of init
 
let actionLeftbtn = () => {
    drawRight(moveLeft);
    rightBtn.removeEventListener('click', actionRightbtn);
    setTimeout(() => {
        rightBtn.addEventListener('click', actionRightbtn);
    }, 500);
}
 
let actionRightbtn = () => {
    drawLeft(moveRight);
    leftBtn.removeEventListener('click', actionLeftbtn);
    setTimeout(() => {
        leftBtn.addEventListener('click', actionLeftbtn);
    }, 500);
}
 
let drawRight = (callback) => {
    step++;
    step > slides.length - 1 ? step = 0 : false;
    slides[step].style.left = slidesWidth[step].width + 'px';
    slider.append(slides[step]);
    callback();
}
 
let drawLeft = (callback) => {
    step--;
    step < 0 ? step = slides.length - 1 : false;
    slides[step].style.left = -slidesWidth[step].width + 'px';
    slider.append(slides[step]);
    callback();
}
 
let moveLeft = () => {
    leftBtn.removeEventListener('click', actionLeftbtn);
    let twoElems = document.querySelectorAll('.slider__item');
    let twoElemsWidth = [...twoElems].map(currentV => { return currentV.getBoundingClientRect() });
    let offset = -1;
    for (let i = 0; i < twoElems.length; i++) {
        twoElems[i].style.left = offset * twoElemsWidth[i].width + 'px';
        ++offset;
    }
    setTimeout(() => {
        twoElems[0].remove();
        leftBtn.addEventListener('click', actionLeftbtn);
    }, 500);
}
 
let moveRight = () => {
    rightBtn.removeEventListener('click', actionRightbtn);
    let twoElems = document.querySelectorAll('.slider__item');
    twoElems = Array.from(twoElems);
    twoElems = twoElems.reverse();
    let twoElemsWidth = [...twoElems].map(currentV => { return currentV.getBoundingClientRect() });
    let offset = 0;
    for (let i = 0; i < twoElems.length; i++) {
        twoElems[i].style.left = offset * twoElemsWidth[i].width + 'px';
        ++offset;
    }
    setTimeout(() => {
        twoElems[twoElems.length - 1].remove();
        rightBtn.addEventListener('click', actionRightbtn);
    }, 500);
}
 
window.addEventListener('load', init, false);
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
    <div class="slider">
        <div class="slider__item slider__img1"></div>
        <div class="slider__item slider__img2"></div>
        <div class="slider__item slider__img3"></div>
        <div class="slider__item slider__img4"></div>
        <div class="slider__item slider__img5"></div>
        <div class="slider__item slider__img6"></div>
    </div>
    <div class="buttons">
        <button id="btnLeft" class="button-style">Left</button>
        <button id="btnRight" class="button-style">Right</button>
    </div>
 
    <script src="script.js"></script>
</body>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
*{
    margin:0px;
    padding:0px;
    box-sizing: border-box;
}
.buttons{
    width:200px;
    margin:20px auto 0px auto;
    display: flex;
    flex-flow: row wrap;
}
.button-style{
    width:50%;
    height:50px;
}
.slider{
    width:1141px;
    height:331px;
    border:1px solid blue;
    margin:10px auto;
    position: relative;
}
.slider__item{
    width:1141px;
    height:331px;
 
    background-repeat: no-repeat;
    background-size: cover;
    position: absolute;
    top:0px;
    left:0px;
    transition:all 0.5s ease-in-out 0s;
}
.slider__img1{
    background-image: url('imgs/img-1.png');
}
.slider__img2{
    background-image: url('imgs/img-2.png');
}
.slider__img3{
    background-image: url('imgs/img-3.png');
}
.slider__img4{
    background-image: url('imgs/img-4.png');
}
.slider__img5{
    background-image: url('imgs/img-5.png');
}
.slider__img6{
    background-image: url('imgs/img-6.png');
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2020, 08:53
Помогаю со студенческими работами здесь

Как разобраться с ошибка Uncaught TypeError: jQuery(.).ready(.) is not a function
Помогите разобраться новичку с ошибкой &lt;script type=&quot;text/javascript&quot;&gt; jQuery(document).ready(function($) { var...

Uncaught TypeError: $ is not a function
Не работает код: &lt;script type=&quot;text/javascript&quot;&gt; function reg() { $('#status').html('&lt;img...

Uncaught TypeError: $ is not a function
Вот мой HTML &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt;&lt;title&gt; Review Collection Settings &lt;/title&gt; &lt;script...

Uncaught TypeError: $ is not a function
решил проверить скрипт одной баннерной сети, но столкнулся с проблемой так-как баннер не показывался. Браузер вывел ошибку &quot;Uncaught...

Uncaught TypeError: undefined is not a function
Всем добрый день! Есть код: &lt;script type=&quot;text/javascript&quot;&gt; /** Функция отправляет ajax-запрос ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru