|
04.12.2024, 11:30
|
Новичок на форуме
|
|
Регистрация: 05.06.2013
Сообщений: 8
|
|
Установка события из класса
Добрый день!
Реализую простенький календарь под свои нужды. Сделал класс календаря, есть методы класса по отрисовки календаря в передаваемый снаружи div. Есть генерируемых стрелочки перехода на соседние месяцы. Есть метод перехода. Но как эти методы перехода привязать к кликам стрелочек изнутри класса? Мы ведь не знаем имени внешней переменной объекта созданного.
Можно сделать класс-обертку и объект календаря сделать глобальным. Но это кажется не совсем правильным решением.
Подскажите как правильно сделать функционал в этом случае?
|
|
05.12.2024, 10:25
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Какой класс вы имеете в виду? class в javascript?
Сообщение от Beer75
|
Мы ведь не знаем имени внешней переменной объекта созданного.
|
В классах для этого this есть.
|
|
05.12.2024, 17:48
|
Новичок на форуме
|
|
Регистрация: 05.06.2013
Сообщений: 8
|
|
Мы же не можем, например на div, навесить OnClick="this.nextMonth();", снаружи this не привязан ни к чему. Если делать обертку, то можно создать глобальный объект и уже оберткой привязать к событию globalCalendar.addEventListener("click", globalObject.nextMonth). А хочется к генерируемой DOM-разметке привязать внутренний метод.
|
|
05.12.2024, 19:59
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Beer75, пока ты не начнешь делать тестовые примеры - дело не сдвинется с места.
Ты все про Фому... А тебе про Ерему.
|
|
06.12.2024, 08:08
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от Beer75
|
Мы же не можем, например на div, навесить OnClick="this.nextMonth();", снаружи this не привязан ни к чему.
|
Так, как я понял, обработчик должен назначаться внутри класса, а не снаружи.
Хотя, не видя ваше класса и остального кода ничего сказать нельзя.
|
|
08.12.2024, 20:47
|
Новичок на форуме
|
|
Регистрация: 05.06.2013
Сообщений: 8
|
|
Ок. Код. =о)
calendar.html
...
<div id="myCalendar_div"></div>
...
<script>
function onLoad(){
myCalendar=new myCalendar();
myCalendar.renderCalendar('myCcalendar_div');
}
</script>
myCalendar.js
class MyCalendar{
outputDiv=null;
constructor(){
// вычисляем текущую дату, необходимые параметры
}
renderCalendar(oDiv){
this.outputDiv=document.querySelector("#"+oDiv);
// вывод сетки календаря
...
// вывод двух ссылок, на следующий месяц и предыдущий
this.outputDiv.innerHTML=this.outputDiv.innerHTML+ '<span id="prevMonth">пред</span><span id="nextMonth">след</span>';
}
nextMonth(){
// вычисляем необходимые параметры
this.renderCalendar();
}
prevMonth(){
// вычисляем необходимые параметры
this.renderCalendar();
}
}
Вопрос: можно ли внутри функции renderCalendar повесить на span обработчики с вызовом nextMonth() и prevMonth()?
Если ставить this.nextMonth(), то ошибка, естественно. А название переменной myCalendar, определяемой в onLoad() недоступно внутри класса.
Или я что-то не так делаю в принципе?
|
|
09.12.2024, 10:59
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от Beer75
|
Вопрос: можно ли внутри функции renderCalendar повесить на span обработчики с вызовом nextMonth() и prevMonth()?
|
Разумеется можно.
Вот только вся "логика" и ее реализация у тебя весьма неудачные...
|
|
09.12.2024, 11:10
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Beer75,если немного переделать твои фантазии
<div id="myCalendar_div"></div>
<script>
class MyCalendar {
outputDiv = null;
constructor(oDiv){
// вычисляем текущую дату, необходимые параметры
this.outputDiv = document.querySelector("#"+oDiv);
}
renderCalendar(){
// вывод сетки календаря
// вывод двух ссылок, на следующий месяц и предыдущий
this.outputDiv.innerHTML = '<span id="prevMonth">пред</span> <span id="nextMonth">след</span>';
prevMonth.addEventListener('click', e => this.prevMonth())
nextMonth.addEventListener('click', e => this.nextMonth())
}
nextMonth(){
alert('nextMonth')
// вычисляем необходимые параметры
this.renderCalendar();
}
prevMonth(){
alert('prevMonth')
// вычисляем необходимые параметры
this.renderCalendar();
}
}
//
function onLoad(){
const o = new MyCalendar('myCalendar_div');
o.renderCalendar();
}
onLoad()
</script>
|
|
09.12.2024, 20:10
|
Новичок на форуме
|
|
Регистрация: 05.06.2013
Сообщений: 8
|
|
Сообщение от ksa
|
Разумеется можно.
Вот только вся "логика" и ее реализация у тебя весьма неудачные...
|
А как сделать удачные?
|
|
09.12.2024, 20:16
|
Новичок на форуме
|
|
Регистрация: 05.06.2013
Сообщений: 8
|
|
ksa, спасибо!
понял, в чем была моя ошибка. Пытался запихать обработчик в параметр тэга onClick="". Учусь, торможу. =о)
|
|
|
|