Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
5 / 4 / 2
Регистрация: 11.12.2013
Сообщений: 168
1

MVC Javascript (часть 2 - event)

28.08.2016, 12:10. Показов 1231. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, всем. Наконец-то немного разгреб завалы работы, и снова взялся за свою тестовую программу с использованием шаблона MVC.
После предыдущего обсуждения данной темы, прочел несколько статей, среди них https://habrahabr.ru/post/117791/.
Понял (возможно я ошибаюсь), что MVC, это огромное пространство для споров и обсуждений. У каждого свое мнение и в 95% случаев, каждый из оппонентов прав.
Сейчас, прошу вашей помощи больше не по самой концепции, а по логике JS.
Такая штука: мой код получает координаты курсора мыши и передает их точке на карте (то есть точка должна помещаться, при клике на место курсора).
Все работает, но если не проскролить карту. Тогда точка становится не в то место, куда хотелось бы.
Причину знаю. И даже нашел несколько вариантов решения проблемы, но не на MVC.
Все дело в том, что координаты считываются не с моего блока с картой, хотя, я так думал, этот отрывок кода

Javascript
1
2
3
4
5
6
7
var mapField = document.getElementById( 'mapField' );
 
//...
 
mapField.onclick = 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
var e,
    pointPosX,
    pointPosY,
    pointX,
    pointY;
/* -------------------------------- begin view -------------------------------------------- */
 
var view = {    
 
    getFieldMap: function( pointX, pointY ){    
        
        var mapField = document.getElementById( 'mapField' ),
            inputX = document.getElementById( 'coordinates_x' ),
            inputY = document.getElementById( 'coordinates_y' );
 
            inputX.value = pointX;
            inputY.value = pointY;
 
    },
 
    // place a button on the map
    setPointInMap: function( pointX, pointY ){
        
        var pointInMap = document.getElementById( 'mxPoint' ),
            pointInMapX = pointInMap.style.left = pointX + 'px',
            pointInMapY = pointInMap.style.top = pointY + 'px';
 
    }
 
 
};
 
/* -------------------------------- end view -------------------------------------------- */
 
 
/* ------------------------------- begin model ------------------------------------------ */
 
var model = {
 
    pointPosX: 0,
    pointPosY: 0,
 
    eventVar: function(){
 
        e = window.event || event;
 
    },
    getPositionPointX: function(){
 
        this.eventVar();
        this.pointPosX = e.clientX; 
        return this.pointPosX;
 
    },
    getPositionPointY: function(){
 
        this.eventVar();
        this.pointPosY = e.clientY;
        return this.pointPosY;
 
    }
    
};
 
/* ------------------------------- end model ------------------------------------------ */
 
 
/* --------------------------- begin controller ---------------------------------------- */
 
var controller = {
    
    getCoordinatesPoint: function(){
 
        pointX = model.getPositionPointX(),
        pointY = model.getPositionPointY();
 
        view.getFieldMap( pointX, pointY );
 
    },
 
    // place a button on the map (CONTR)
    setCoordinatesPointInMap: function(){
 
        pointX = model.getPositionPointX(),
        pointY = model.getPositionPointY();
 
        view.setPointInMap( pointX, pointY );
    }
 
};
 
/* ---------------------------- end controller ----------------------------------------- */
 
 
/* -------------------- anonymous initialize function------------------------------------ */
 
( function(){
 
    var start = {
 
        init: function(){
 
            this.main();
            this.control();
            this.event();
 
        },
        main: function(){
            //options
        },
        control: function(){
            //controllers
        },
        event: function(){
 
            mapField.onclick = function(){
 
                controller.getCoordinatesPoint();
                controller.setCoordinatesPointInMap();
                
            }
 
        }
    };
 
    start.init();
 
} )();
/* -------------------- anonymous initialize function------------------------------------ */
Вопрос в том, как в данном шаблоне считать координаты именно с карты, а не с области экрана?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2016, 12:10
Ответы с готовыми решениями:

MVC Javascript (часть 3 - массив точек)
Доброе утро, всем. Продолжаю писать учебную программу на JS и снова уперся в невидимую (для меня)...

Что такое event в JavaScript
Здраствуйте меня интересует такой вопрос, что такое event в JavaScript? Заранее спасибо.

MVC в JavaScript
Добрый день, всем. Есть такой код: function coordinatesPoint(e){ e = window.event; var...

ОПП, MVC JavaScript
Здравствуйте! 1.Подскажите пожалуйста, как в JS реализуется ОПП? 2.Подскажите пожалуйста, как...

10
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
28.08.2016, 13:22 2
Максим_М21,
Почему бы не использовать маркеры, они реализованы в самом api карт?
0
5 / 4 / 2
Регистрация: 11.12.2013
Сообщений: 168
28.08.2016, 15:50  [ТС] 3
Цитата Сообщение от XRoy Посмотреть сообщение
Почему бы не использовать маркеры, они реализованы в самом api карт?
XRoy, JS - это мечта. Очень хочу научится писать на JS. API, не для меня.
0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
28.08.2016, 16:57 4
Максим_М21,
Все дело в том, что координаты считываются не с моего блока с картой
они считываются от границ экрана
Координата экран - позиция блока = координата относительно блока
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
28.08.2016, 17:04 5
Максим_М21, наверное я что-то пропустил, но при чем тут mvc?

представь бесконечное 2d пространство(слой) у которого нет координат, но которое содержит объекты. И у этих объектов есть координаты. Мы как наблюдатель(камера) диктуем пространству в какой точке мы находимся в данное время.

Например, есть объекты

Javascript
1
[{x:100,y:100}, {x:150,y:200}, {x:310,y:50}, {x:2500,y:920}, ...]
и наблюдатель говорит "Я смотрю в координаты 200:200"

Javascript
1
cameraInstance.pos(200, 200);
в этом конкретном случае, если свойства камеры width и height предположим равны 640x480, мы увидим только первые три объекта.
0
5 / 4 / 2
Регистрация: 11.12.2013
Сообщений: 168
28.08.2016, 21:31  [ТС] 6
Цитата Сообщение от XRoy Посмотреть сообщение
Координата экран - позиция блока = координата относительно блока
К сожалению нет. Карта больше экрана.
Цитата Сообщение от Padimanskas Посмотреть сообщение
в этом конкретном случае, если свойства камеры width и height предположим равны 640x480, мы увидим только первые три объекта.
Согласен с Вами, но дело в том, что размер экрана не важен, так как точка ставится на карте. В моем случае примерно так:
HTML5
1
2
3
4
5
6
7
8
.Map{
   position: relative;
}
.Point{
   position: absolute;
   top: 200px;
   left: 160px;
}
0
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
28.08.2016, 23:16 7
Цитата Сообщение от Максим_М21 Посмотреть сообщение
но дело в том, что размер экрана не важен, так как точка ставится на карте.
Я же не про размер экрана. Точка в которую смотрит камера это мировые координаты, а указатель на странице это просто координаты вьюпорта(да, их можно и нужно переводить в мировые и локальные). То есть о чем я хотел сказать - камера утверждает "я смотрю в точку 100:100" и это верно, или объект в пространстве говорит "я нахожусь в координатах 150:200" и это тоже правильно, но само пространство ничего о координатах не знает, оно как бы посредник. Про концепцию в плане mvc (m-v-vm) я вообще, честно говоря, не въехал. Потому что все это делается, навскидку, медиатором и загрузчиком модулей. А может быть(или очень возможно) понадобится просто обсервер. как-то так..
0
5 / 4 / 2
Регистрация: 11.12.2013
Сообщений: 168
29.08.2016, 09:49  [ТС] 8
Цитата Сообщение от Padimanskas Посмотреть сообщение
А может быть(или очень возможно) понадобится просто обсервер
Вы как будто опережаете меня в моей идеи) Да, на следующем шагу обсервер станет мне в помощь, однозначно. Но сейчас у меня преграда.
Вопрос не в картах или координатах (давайте на миг забудем об этом), вопрос в том как считать ивент с блока, а не с экрана.
Javascript
1
2
3
4
5
6
mapField.onclick = function(){
 
     controller.getCoordinatesPoint();
     controller.setCoordinatesPointInMap();
                
}
В этом отрывке сказано: по клике на поле получить точку относительно экрана и передать ее. Но нужно: "получить точку относительно поля".
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
29.08.2016, 10:18 9
Лучший ответ Сообщение было отмечено Максим_М21 как решение

Решение

Максим_М21, используйте ф-цию
Javascript
1
getBoundingClientRect()
для определения границ элемента.
Для получения точных координат относительно элемента можно использовать ф-цию:

Javascript
1
2
3
4
5
6
7
var getMousePos = function (element, event) {
    var rect = element.getBoundingClientRect();
    return {
        X: (event.clientX - rect.left),
        Y: (event.clientY - rect.top)
    };
}
Пример определения координат с вызовом getBoundingClientRect и без
https://jsfiddle.net/27g57dLb/1/
1
Эксперт JSЭксперт HTML/CSS
3825 / 2675 / 1521
Регистрация: 12.07.2015
Сообщений: 6,672
Записей в блоге: 4
29.08.2016, 10:32 10
Или так:
Javascript
1
2
3
block.addEventListener('click', function() {
  console.log('X: ' + event.offsetX + ' Y:' + event.offsetY);
})
Результат
1
5 / 4 / 2
Регистрация: 11.12.2013
Сообщений: 168
29.08.2016, 11:01  [ТС] 11
pro_100_gram, mrtoxas, спасибо Вам за примеры, попробую все)
Padimanskas, эту конструкцию ( [{x:100,y:100}, {x:150,y:200}, {x:310,y:50}, {x:2500,y:920}, ...] ), обязательно возьму для составления маршрута, спасибо.
0
29.08.2016, 11:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2016, 11:01
Помогаю со студенческими работами здесь

Возможно ли на javascript написать MVC фреймворк на js-файлах?
Возможно ли на javascript написать MVC фреймворк на js-файлах? Т.е. чтобы была model.js...

event.returnValue is deprecated. Please use the standard event.preventDefault() instead
Выдаёт ошибку event.returnValue is deprecated. Please use the standard event.preventDefault()...

Как сделать паузу в JavaScript на часть кода?
Например setTimeout(function() { alert("сообщение 1"); }, 5000); alert("сообщение 2"); ...

Не работает javascript, который подгружает часть кода, только в Mozille
Чтобы лучше понять работу скрипта, пожалуйста откройте новость, и увидите значек закрытия окна. Во...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru