From 5d22c879f562d42d64f8927027f87634abff04b9 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2022 14:40:19 +0400 Subject: [PATCH 01/33] * Refactoring, `typeof` is used instead of `jQuery.type`. --- jquery.ddYMap.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jquery.ddYMap.js b/jquery.ddYMap.js index 6f23ea5..e99ce26 100644 --- a/jquery.ddYMap.js +++ b/jquery.ddYMap.js @@ -55,7 +55,7 @@ $.extend(true, {ddYMap: { //Перебираем таблицу соответствия $.each(compliance, function(newName, oldName){ //Если старый параметр задан, а новый — нет - if ($.type(params[oldName]) != 'undefined' && $.type(params[newName]) == 'undefined'){ + if (typeof params[oldName] != 'undefined' && typeof params[newName] == 'undefined'){ //Зададим result[newName] = params[oldName]; msg.push('“' + oldName + '” must be renamed as “' + newName + '”;'); @@ -95,7 +95,7 @@ $.extend(true, {ddYMap: { ){ //Создаём метку geoObjects.add(new ymaps.Placemark(params.placemarks[i].latLng, { - balloonContent: $.type(params.placemarks[i].content) == 'string' ? $.trim(params.placemarks[i].content) : '' + balloonContent: typeof params.placemarks[i].content == 'string' ? $.trim(params.placemarks[i].content) : '' }, params.placemarkOptions)); } } From 3fa3ce8bd58e21fb2c933570ddfca20ac982756d Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2022 14:46:01 +0400 Subject: [PATCH 02/33] * Minor changes. --- jquery.ddYMap.js | 375 +++++++++++++++++++++++++++++------------------ 1 file changed, 234 insertions(+), 141 deletions(-) diff --git a/jquery.ddYMap.js b/jquery.ddYMap.js index e99ce26..c5c2bd7 100644 --- a/jquery.ddYMap.js +++ b/jquery.ddYMap.js @@ -27,167 +27,260 @@ */ (function($){ -$.extend(true, {ddYMap: { - defaults: { - placemarks: new Array(), - element: 'map', - defaultZoom: 15, - defaultType: 'map', - scrollZoom: false, - mapCenterOffset: false, - placemarkOptions: {}, - controls: [ - {name: 'zoomControl'}, - {name: 'typeSelector'}, - {name: 'fullscreenControl'}, - {name: 'geolocationControl'}, - {name: 'rulerControl'} - ], - mapOptions: { - suppressMapOpenBlock: true - } - }, - //TODO: перенести метод в $.ddTools - verifyRenamedParams: function(params, compliance){ - var result = {}, - msg = new Array(); - - //Перебираем таблицу соответствия - $.each(compliance, function(newName, oldName){ - //Если старый параметр задан, а новый — нет - if (typeof params[oldName] != 'undefined' && typeof params[newName] == 'undefined'){ - //Зададим - result[newName] = params[oldName]; - msg.push('“' + oldName + '” must be renamed as “' + newName + '”;'); - } - }); - - if (msg.length > 0){ - console.group('$.ddYMap'); - console.warn('Some of the parameters have been renamed. Please, correct the following parameters:'); - - for (var i = 0; i < msg.length; i++){ - console.warn(msg[i]); - } - - console.groupEnd(); - } - - return result; - }, - preparePlacemarks: function(params){ - var geoObjects = new ymaps.GeoObjectCollection(); - - if (!$.isArray(params.placemarks)){return geoObjects;} - - //Если передана просто пара координат - if (params.placemarks.length == 2 && $.isNumeric(params.placemarks[0]) && $.isNumeric(params.placemarks[1])){ - //Значит точка одна - geoObjects.add(new ymaps.Placemark(params.placemarks, {}, params.placemarkOptions)); - }else{ - //Переберём все точки - for (var i = 0; i < params.placemarks.length; i++){ - //Если координаты заданы - if ( - $.isPlainObject(params.placemarks[i]) && - $.isArray(params.placemarks[i].latLng) && - params.placemarks[i].latLng.length == 2 - ){ - //Создаём метку - geoObjects.add(new ymaps.Placemark(params.placemarks[i].latLng, { - balloonContent: typeof params.placemarks[i].content == 'string' ? $.trim(params.placemarks[i].content) : '' - }, params.placemarkOptions)); +$.extend( + true, + { + ddYMap: { + defaults: { + placemarks: new Array(), + element: 'map', + defaultZoom: 15, + defaultType: 'map', + scrollZoom: false, + mapCenterOffset: false, + placemarkOptions: {}, + controls: [ + {name: 'zoomControl'}, + {name: 'typeSelector'}, + {name: 'fullscreenControl'}, + {name: 'geolocationControl'}, + {name: 'rulerControl'} + ], + mapOptions: { + suppressMapOpenBlock: true } - } - } - - return geoObjects; - }, - init: function(params){ - var _this = this; - - $.extend(params, _this.verifyRenamedParams(params, { - 'defaultZoom': 'zoom', - 'placemarks': 'latLng' - })); - - params = $.extend({}, _this.defaults, params); - - ymaps.ready(function(){ - //Подготавливаем точки - var geoObjects = _this.preparePlacemarks(params), - //Количество точек - geoObjects_len = geoObjects.getLength(); + }, - //Если точки заданы - if (geoObjects_len > 0){ - params.$element = $(params.element); + //TODO: перенести метод в $.ddTools + verifyRenamedParams: function( + params, + compliance + ){ + var + result = {}, + msg = new Array() + ; - //Установим высоту у элемента, если она не задана - if (params.$element.height() == 0){ - params.$element.height(400); + //Перебираем таблицу соответствия + $.each( + compliance, + function( + newName, + oldName + ){ + //Если старый параметр задан, а новый — нет + if ( + typeof params[oldName] != 'undefined' && + typeof params[newName] == 'undefined' + ){ + //Зададим + result[newName] = params[oldName]; + msg.push('“' + oldName + '” must be renamed as “' + newName + '”;'); + } + } + ); + + if (msg.length > 0){ + console.group('$.ddYMap'); + console.warn('Some of the parameters have been renamed. Please, correct the following parameters:'); + + for ( + var i = 0; + i < msg.length; + i++ + ){ + console.warn(msg[i]); + } + + console.groupEnd(); } - //Создаём карту - var map = new ymaps.Map(params.element, { - center: geoObjects.get(0).geometry.getCoordinates(), - zoom: params.defaultZoom, - type: 'yandex#' + params.defaultType, - controls: [] - }, params.mapOptions); + return result; + }, + + preparePlacemarks: function(params){ + var geoObjects = new ymaps.GeoObjectCollection(); - //Если заданы котролы - if($.isArray(params.controls)){ - $.each(params.controls, function(index, control){ - if(control.name){ - //Добавляем их - map.controls.add(control.name, control.options); - } - }); + if (!$.isArray(params.placemarks)){ + return geoObjects; } - //Если зум не нужен - if (!params.scrollZoom){ - //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) - map.behaviors.disable('scrollZoom'); + //Если передана просто пара координат + if ( + params.placemarks.length == 2 && + $.isNumeric(params.placemarks[0]) && + $.isNumeric(params.placemarks[1]) + ){ + //Значит точка одна + geoObjects.add( + new ymaps.Placemark( + params.placemarks, + {}, + params.placemarkOptions + ) + ); + }else{ + //Переберём все точки + for ( + var i = 0; + i < params.placemarks.length; + i++ + ){ + //Если координаты заданы + if ( + $.isPlainObject(params.placemarks[i]) && + $.isArray(params.placemarks[i].latLng) && + params.placemarks[i].latLng.length == 2 + ){ + //Создаём метку + geoObjects.add( + new ymaps.Placemark( + params.placemarks[i].latLng, + { + balloonContent: + typeof params.placemarks[i].content == 'string' ? + $.trim(params.placemarks[i].content) : + '' + }, + params.placemarkOptions + ) + ); + } + } } - //Добавляем метки на карту - map.geoObjects.add(geoObjects); + return geoObjects; + }, + + init: function(params){ + var _this = this; - //Если меток несколько - if (geoObjects_len > 1){ - //Если элемент с картой скрыт - if (params.$element.is(':hidden')){ - //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) - map.events.once('sizechange', function(){ - //Надо, чтобы они все влезли - map.setBounds(geoObjects.getBounds()); - }); - }else{ - //Надо, чтобы они все влезли - map.setBounds(geoObjects.getBounds()); - } - } + $.extend( + params, + _this.verifyRenamedParams( + params, + { + 'defaultZoom': 'zoom', + 'placemarks': 'latLng' + } + ) + ); - //Если нужно смещение центра карты - if ($.isArray(params.mapCenterOffset) && params.mapCenterOffset.length == 2){ - var position = map.getGlobalPixelCenter(); - - map.setGlobalPixelCenter([position[0] - params.mapCenterOffset[0], position[1] - params.mapCenterOffset[1]]); - } + params = $.extend( + {}, + _this.defaults, + params + ); - params.$element.data('ddYMap', {map: map}).trigger('ddAfterInit'); + ymaps.ready(function(){ + var + //Подготавливаем точки + geoObjects = _this.preparePlacemarks(params), + //Количество точек + geoObjects_len = geoObjects.getLength() + ; + + //Если точки заданы + if (geoObjects_len > 0){ + params.$element = $(params.element); + + //Установим высоту у элемента, если она не задана + if (params.$element.height() == 0){ + params.$element.height(400); + } + + //Создаём карту + var map = new ymaps.Map( + params.element, + { + center: geoObjects.get(0).geometry.getCoordinates(), + zoom: params.defaultZoom, + type: 'yandex#' + params.defaultType, + controls: [] + }, + params.mapOptions + ); + + //Если заданы котролы + if($.isArray(params.controls)){ + $.each( + params.controls, + function( + index, + control + ){ + if(control.name){ + //Добавляем их + map.controls.add(control.name, control.options); + } + } + ); + } + + //Если зум не нужен + if (!params.scrollZoom){ + //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) + map.behaviors.disable('scrollZoom'); + } + + //Добавляем метки на карту + map.geoObjects.add(geoObjects); + + //Если меток несколько + if (geoObjects_len > 1){ + //Если элемент с картой скрыт + if (params.$element.is(':hidden')){ + //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) + map.events.once( + 'sizechange', + function(){ + //Надо, чтобы они все влезли + map.setBounds(geoObjects.getBounds()); + } + ); + }else{ + //Надо, чтобы они все влезли + map.setBounds(geoObjects.getBounds()); + } + } + + //Если нужно смещение центра карты + if ( + $.isArray(params.mapCenterOffset) && + params.mapCenterOffset.length == 2 + ){ + var position = map.getGlobalPixelCenter(); + + map.setGlobalPixelCenter([ + position[0] - params.mapCenterOffset[0], + position[1] - params.mapCenterOffset[1] + ]); + } + + params.$element + .data( + 'ddYMap', + {map: map} + ) + .trigger('ddAfterInit') + ; + } + }); } - }); + } } -}}); +); $.fn.ddYMap = function(params){ var _this = $.ddYMap; return $(this).each(function(){ - _this.init($.extend(params, {element: this})); + _this.init( + $.extend( + params, + {element: this} + ) + ); }); }; })(jQuery); \ No newline at end of file From a5865559a47609f5ae9bfc626d1470e70b049f47 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2022 14:54:20 +0400 Subject: [PATCH 03/33] * Refactoring, `Array.isArray` is used instead of `jQuery.isArray`. --- jquery.ddYMap.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jquery.ddYMap.js b/jquery.ddYMap.js index c5c2bd7..f6829e4 100644 --- a/jquery.ddYMap.js +++ b/jquery.ddYMap.js @@ -101,7 +101,7 @@ $.extend( preparePlacemarks: function(params){ var geoObjects = new ymaps.GeoObjectCollection(); - if (!$.isArray(params.placemarks)){ + if (!Array.isArray(params.placemarks)){ return geoObjects; } @@ -129,7 +129,7 @@ $.extend( //Если координаты заданы if ( $.isPlainObject(params.placemarks[i]) && - $.isArray(params.placemarks[i].latLng) && + Array.isArray(params.placemarks[i].latLng) && params.placemarks[i].latLng.length == 2 ){ //Создаём метку @@ -202,7 +202,7 @@ $.extend( ); //Если заданы котролы - if($.isArray(params.controls)){ + if(Array.isArray(params.controls)){ $.each( params.controls, function( @@ -246,7 +246,7 @@ $.extend( //Если нужно смещение центра карты if ( - $.isArray(params.mapCenterOffset) && + Array.isArray(params.mapCenterOffset) && params.mapCenterOffset.length == 2 ){ var position = map.getGlobalPixelCenter(); From 5bee57a7300756ca32916a58e7aff70bef5b949a Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2022 14:56:43 +0400 Subject: [PATCH 04/33] * Refactoring, `Array.prototype.forEach` is used instead of `jQuery.each`. --- jquery.ddYMap.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/jquery.ddYMap.js b/jquery.ddYMap.js index f6829e4..c9b21ea 100644 --- a/jquery.ddYMap.js +++ b/jquery.ddYMap.js @@ -62,12 +62,12 @@ $.extend( ; //Перебираем таблицу соответствия - $.each( - compliance, - function( + Object.entries(compliance).forEach( + ([ newName, oldName - ){ + ]) => + { //Если старый параметр задан, а новый — нет if ( typeof params[oldName] != 'undefined' && @@ -203,15 +203,15 @@ $.extend( //Если заданы котролы if(Array.isArray(params.controls)){ - $.each( - params.controls, - function( - index, - control - ){ + params.controls.forEach( + (control) => + { if(control.name){ //Добавляем их - map.controls.add(control.name, control.options); + map.controls.add( + control.name, + control.options + ); } } ); From 7050d24dfb26c0a5fd217353be38e706c2ec3c2d Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:13:15 +0400 Subject: [PATCH 05/33] * File names refactoring. --- jquery.ddYMap.js => jQuery.ddYMap.js | 0 jquery.ddYMap.min.js => jQuery.ddYMap.min.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename jquery.ddYMap.js => jQuery.ddYMap.js (100%) rename jquery.ddYMap.min.js => jQuery.ddYMap.min.js (100%) diff --git a/jquery.ddYMap.js b/jQuery.ddYMap.js similarity index 100% rename from jquery.ddYMap.js rename to jQuery.ddYMap.js diff --git a/jquery.ddYMap.min.js b/jQuery.ddYMap.min.js similarity index 100% rename from jquery.ddYMap.min.js rename to jQuery.ddYMap.min.js From 36de0d6841e2fe2cf016655b716897dc511cab17 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:31:59 +0400 Subject: [PATCH 06/33] + Release.sh. + Watch.sh. --- jQuery.ddYMap.min.js | 34 +--------------------------------- release.sh | 2 ++ watch.sh | 1 + 3 files changed, 4 insertions(+), 33 deletions(-) create mode 100644 release.sh create mode 100644 watch.sh diff --git a/jQuery.ddYMap.min.js b/jQuery.ddYMap.min.js index 6588a55..9d716ec 100644 --- a/jQuery.ddYMap.min.js +++ b/jQuery.ddYMap.min.js @@ -1,33 +1 @@ -/** - * jQuery ddYMap Plugin - * @version 1.4 (2015-07-23) - * - * @desc A jQuery library that allows Yandex.Maps to be rendered on a page in a simple way. - * - * @requires jQuery 1.10.2. - * @requires Yandex.Maps 2.1. - * - * Parameters of the “$.fn.ddYMap” method (transferred as plain object). - * @param placemarks {Array} - Array of placemarks to be put on the map. If there is more than one placemark, the map will be scaled to make all the placemarks visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). @required - * @param placemarks[i] {Object} - Placemark data. @required - * @param placemarks[i].latLng {Array} - Placemark coordinates (latitude and longitude). @required - * @param [placemarks[i].content=''] {string} - Balloon content. - * @param [defaultZoom=15] {number} - Default map zoom. - * @param [defaultType='map'] {'map'|'satellite'|'hybrid'|'publicMap'|'publicMapHybrid'} - Default map type: 'map' — schematic map, 'satellite' — satellite map, 'hybrid' — hybrid map, 'publicMap' — public map, 'publicMapHybrid' - hybrid public map. - * @param [scrollZoom=false] {boolean} - Allow zoom while scrolling. - * @param [mapCenterOffset=[0, 0]] {Array} - Center offset of the map with respect to the center of the map container in pixels. - * @param [placemarkOptions={}] {Object} - Placemark options. - * @param [controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Object} - An array of controls to be added onto the map. - * @param [mapOptions={suppressMapOpenBlock: true}] {Object} - Represents yandex map options to be passed to the constructor. - * - * @link http://code.divandesign.biz/jquery/ddymap/1.4 - * - * @copyright 2015, DivanDesign - * http://www.DivanDesign.biz - */ - -(function(b){b.extend(!0,{ddYMap:{defaults:{placemarks:[],element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},verifyRenamedParams:function(a,e){var c={},f=[];b.each(e,function(d,e){"undefined"!=b.type(a[e])&&"undefined"==b.type(a[d])&&(c[d]=a[e],f.push("\u201c"+e+"\u201d must be renamed as \u201c"+ -d+"\u201d;"))});if(0{void 0!==e[t]&&void 0===e[a]&&(n[a]=e[t],r.push("“"+t+"” must be renamed as “"+a+"”;"))})),r.length>0){console.group("$.ddYMap"),console.warn("Some of the parameters have been renamed. Please, correct the following parameters:");for(var t=0;t0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:r.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(r),t>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(r.getBounds())})):o.setBounds(r.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var l=o.getGlobalPixelCenter();o.setGlobalPixelCenter([l[0]-a.mapCenterOffset[0],l[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var n=e.ddYMap;return e(this).each((function(){n.init(e.extend(a,{element:this}))}))}}(jQuery); \ No newline at end of file diff --git a/release.sh b/release.sh new file mode 100644 index 0000000..bb4a1de --- /dev/null +++ b/release.sh @@ -0,0 +1,2 @@ +#!/bin/bash +terser jQuery.ddYMap.js --compress --mangle --comments false --output jQuery.ddYMap.min.js \ No newline at end of file diff --git a/watch.sh b/watch.sh new file mode 100644 index 0000000..dc5fd1f --- /dev/null +++ b/watch.sh @@ -0,0 +1 @@ +nodemon --watch "jQuery.ddYMap.js" --exec "bash release.sh" --ext js \ No newline at end of file From 3b1c4512a768ed94f1c27d4db7e80304aa3185c5 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:37:04 +0400 Subject: [PATCH 07/33] * Minor changes. --- jQuery.ddYMap.js | 57 +++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index c9b21ea..d422f2b 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -1,26 +1,27 @@ /** - * jQuery ddYMap Plugin + * jQuery.ddYMap * @version 1.4 (2015-07-23) * * @desc A jQuery library that allows Yandex.Maps to be rendered on a page in a simple way. * - * @requires jQuery 1.10.2. - * @requires Yandex.Maps 2.1. + * @requires jQuery 1.10.2 + * @requires Yandex.Maps 2.1 * - * Parameters of the “$.fn.ddYMap” method (transferred as plain object). - * @param placemarks {Array} - Array of placemarks to be put on the map. If there is more than one placemark, the map will be scaled to make all the placemarks visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). @required - * @param placemarks[i] {Object} - Placemark data. @required - * @param placemarks[i].latLng {Array} - Placemark coordinates (latitude and longitude). @required - * @param [placemarks[i].content=''] {string} - Balloon content. - * @param [defaultZoom=15] {number} - Default map zoom. - * @param [defaultType='map'] {'map'|'satellite'|'hybrid'|'publicMap'|'publicMapHybrid'} - Default map type: 'map' — schematic map, 'satellite' — satellite map, 'hybrid' — hybrid map, 'publicMap' — public map, 'publicMapHybrid' - hybrid public map. - * @param [scrollZoom=false] {boolean} - Allow zoom while scrolling. - * @param [mapCenterOffset=[0, 0]] {Array} - Center offset of the map with respect to the center of the map container in pixels. - * @param [placemarkOptions={}] {Object} - Placemark options. - * @param [controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Object} - An array of controls to be added onto the map. - * @param [mapOptions={suppressMapOpenBlock: true}] {Object} - Represents yandex map options to be passed to the constructor. + * Parameters of the `$.fn.ddYMap` method (transferred as plain object). + * @param params {objectPlain} — The parameters. + * @param params.placemarks {Array} — Array of placemarks to be put on the map. If there is more than one placemark, the map will be scaled to make all the placemarks visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). + * @param params.placemarks[i] {objectPlain} — Placemark data. + * @param params.placemarks[i].latLng {Array} — Placemark coordinates (latitude and longitude). + * @param [params.placemarks[i].content=''] {string} — Balloon content. + * @param [params.defaultZoom=15] {integer} — Default map zoom. + * @param [params.defaultType='map'] {'map'|'satellite'|'hybrid'|'publicMap'|'publicMapHybrid'} — Default map type: 'map' — schematic map, 'satellite' — satellite map, 'hybrid' — hybrid map, 'publicMap' — public map, 'publicMapHybrid' - hybrid public map. + * @param [params.scrollZoom=false] {boolean} — Allow zoom while scrolling. + * @param [params.mapCenterOffset=[0, 0]] {Array} — Center offset of the map with respect to the center of the map container in pixels. + * @param [params.placemarkOptions={}] {objectPlain} — Placemark options. + * @param [params.controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Array} — An array of controls to be added onto the map. + * @param [params.mapOptions={suppressMapOpenBlock: true}] {objectPlain} — Represents yandex map options to be passed to the constructor. * - * @link http://code.divandesign.biz/jquery/ddymap/1.4 + * @link https://code.divandesign.biz/jquery/ddymap * * @copyright 2015, DivanDesign * http://www.DivanDesign.biz @@ -190,21 +191,23 @@ $.extend( } //Создаём карту - var map = new ymaps.Map( - params.element, - { - center: geoObjects.get(0).geometry.getCoordinates(), - zoom: params.defaultZoom, - type: 'yandex#' + params.defaultType, - controls: [] - }, - params.mapOptions - ); + var + map = new ymaps.Map( + params.element, + { + center: geoObjects.get(0).geometry.getCoordinates(), + zoom: params.defaultZoom, + type: 'yandex#' + params.defaultType, + controls: [] + }, + params.mapOptions + ) + ; //Если заданы котролы if(Array.isArray(params.controls)){ params.controls.forEach( - (control) => + control => { if(control.name){ //Добавляем их From 24f9e2e894c438d7ceba4a49d9ed42748047856f Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:38:43 +0400 Subject: [PATCH 08/33] * Minor changes (fixed inactive DivanDesign.biz link). --- README.md | 2 +- jQuery.ddYMap.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d46aefa..01551e5 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,4 @@ A jQuery library that allows Yandex.Maps to be rendered on a page in a simple way. ___ -Visit the following [link](http://code.divandesign.biz/jquery/ddymap) to read the documentation, instructions & changelog. \ No newline at end of file +Visit the following [link](http://code.divandesign.ru/jquery/ddymap) to read the documentation, instructions & changelog. \ No newline at end of file diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index d422f2b..f58ccee 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -21,10 +21,9 @@ * @param [params.controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Array} — An array of controls to be added onto the map. * @param [params.mapOptions={suppressMapOpenBlock: true}] {objectPlain} — Represents yandex map options to be passed to the constructor. * - * @link https://code.divandesign.biz/jquery/ddymap + * @link https://code.divandesign.ru/jquery/ddymap * - * @copyright 2015, DivanDesign - * http://www.DivanDesign.biz + * @copyright 2013–2015 [Ronef]{@link https://Ronef.ru } */ (function($){ From d7ca2cf0c66bec5107e989507505e151d801cf8f Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:40:58 +0400 Subject: [PATCH 09/33] * Refactoring. --- jQuery.ddYMap.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index f58ccee..766ed11 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -153,11 +153,11 @@ $.extend( }, init: function(params){ - var _this = this; + var theLib = this; $.extend( params, - _this.verifyRenamedParams( + theLib.verifyRenamedParams( params, { 'defaultZoom': 'zoom', @@ -168,14 +168,14 @@ $.extend( params = $.extend( {}, - _this.defaults, + theLib.defaults, params ); ymaps.ready(function(){ var //Подготавливаем точки - geoObjects = _this.preparePlacemarks(params), + geoObjects = theLib.preparePlacemarks(params), //Количество точек geoObjects_len = geoObjects.getLength() ; @@ -274,10 +274,10 @@ $.extend( ); $.fn.ddYMap = function(params){ - var _this = $.ddYMap; + var theLib = $.ddYMap; return $(this).each(function(){ - _this.init( + theLib.init( $.extend( params, {element: this} From b543183e703bbafbcb64706d63b4ec42de03e15a Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 14:47:54 +0400 Subject: [PATCH 10/33] + Yandex Maps JS API will be included automatically if absent. --- jQuery.ddYMap.js | 22 +++++++++++++++++++++- jQuery.ddYMap.min.js | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index 766ed11..acc4b1c 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -5,7 +5,7 @@ * @desc A jQuery library that allows Yandex.Maps to be rendered on a page in a simple way. * * @requires jQuery 1.10.2 - * @requires Yandex.Maps 2.1 + * @requires Yandex.Maps 2.1 (will be included automatically if absent) * * Parameters of the `$.fn.ddYMap` method (transferred as plain object). * @param params {objectPlain} — The parameters. @@ -152,9 +152,24 @@ $.extend( return geoObjects; }, + initStatic: function(){ + var theLib = this; + + if (!theLib.isStaticInited){ + theLib.isStaticInited = true; + + //If Yandex Maps API is not included yet + if (typeof ymaps == 'undefined'){ + $('head').append(''); + } + } + }, + init: function(params){ var theLib = this; + theLib.initStatic(); + $.extend( params, theLib.verifyRenamedParams( @@ -285,4 +300,9 @@ $.fn.ddYMap = function(params){ ); }); }; + +//On document.ready +$(function(){ + $.ddYMap.initStatic(); +}); })(jQuery); \ No newline at end of file diff --git a/jQuery.ddYMap.min.js b/jQuery.ddYMap.min.js index 9d716ec..3b1148e 100644 --- a/jQuery.ddYMap.min.js +++ b/jQuery.ddYMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddYMap:{defaults:{placemarks:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},verifyRenamedParams:function(e,a){var n={},r=new Array;if(Object.entries(a).forEach((([a,t])=>{void 0!==e[t]&&void 0===e[a]&&(n[a]=e[t],r.push("“"+t+"” must be renamed as “"+a+"”;"))})),r.length>0){console.group("$.ddYMap"),console.warn("Some of the parameters have been renamed. Please, correct the following parameters:");for(var t=0;t0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:r.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(r),t>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(r.getBounds())})):o.setBounds(r.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var l=o.getGlobalPixelCenter();o.setGlobalPixelCenter([l[0]-a.mapCenterOffset[0],l[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var n=e.ddYMap;return e(this).each((function(){n.init(e.extend(a,{element:this}))}))}}(jQuery); \ No newline at end of file +!function(e){e.extend(!0,{ddYMap:{defaults:{placemarks:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},verifyRenamedParams:function(e,a){var t={},n=new Array;if(Object.entries(a).forEach((([a,r])=>{void 0!==e[r]&&void 0===e[a]&&(t[a]=e[r],n.push("“"+r+"” must be renamed as “"+a+"”;"))})),n.length>0){console.group("$.ddYMap"),console.warn("Some of the parameters have been renamed. Please, correct the following parameters:");for(var r=0;r<\/script>'))},init:function(a){var t=this;t.initStatic(),e.extend(a,t.verifyRenamedParams(a,{defaultZoom:"zoom",placemarks:"latLng"})),a=e.extend({},t.defaults,a),ymaps.ready((function(){var n=t.preparePlacemarks(a),r=n.getLength();if(r>0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:n.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),r>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-a.mapCenterOffset[0],s[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var t=e.ddYMap;return e(this).each((function(){t.init(e.extend(a,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file From 7e707ff75a90d1bab9c8f549783f02e6263bc438 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 15:42:43 +0400 Subject: [PATCH 11/33] =?UTF-8?q?-=20`jQuery.fn.ddYMap`=20=E2=86=92=20Para?= =?UTF-8?q?meters=20=E2=86=92=20`zoom`,=20`latLng`:=20The=20outdated=20nam?= =?UTF-8?q?es=20are=20no=20longer=20supported,=20use=20`defaultZoom`=20and?= =?UTF-8?q?=20`placemarks`=20instead.=20*=20Attention!=20Backward=20compat?= =?UTF-8?q?ibility=20is=20broken.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jQuery.ddYMap.js | 58 -------------------------------------------- jQuery.ddYMap.min.js | 2 +- 2 files changed, 1 insertion(+), 59 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index acc4b1c..523f451 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -51,53 +51,6 @@ $.extend( } }, - //TODO: перенести метод в $.ddTools - verifyRenamedParams: function( - params, - compliance - ){ - var - result = {}, - msg = new Array() - ; - - //Перебираем таблицу соответствия - Object.entries(compliance).forEach( - ([ - newName, - oldName - ]) => - { - //Если старый параметр задан, а новый — нет - if ( - typeof params[oldName] != 'undefined' && - typeof params[newName] == 'undefined' - ){ - //Зададим - result[newName] = params[oldName]; - msg.push('“' + oldName + '” must be renamed as “' + newName + '”;'); - } - } - ); - - if (msg.length > 0){ - console.group('$.ddYMap'); - console.warn('Some of the parameters have been renamed. Please, correct the following parameters:'); - - for ( - var i = 0; - i < msg.length; - i++ - ){ - console.warn(msg[i]); - } - - console.groupEnd(); - } - - return result; - }, - preparePlacemarks: function(params){ var geoObjects = new ymaps.GeoObjectCollection(); @@ -170,17 +123,6 @@ $.extend( theLib.initStatic(); - $.extend( - params, - theLib.verifyRenamedParams( - params, - { - 'defaultZoom': 'zoom', - 'placemarks': 'latLng' - } - ) - ); - params = $.extend( {}, theLib.defaults, diff --git a/jQuery.ddYMap.min.js b/jQuery.ddYMap.min.js index 3b1148e..d34ed6a 100644 --- a/jQuery.ddYMap.min.js +++ b/jQuery.ddYMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddYMap:{defaults:{placemarks:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},verifyRenamedParams:function(e,a){var t={},n=new Array;if(Object.entries(a).forEach((([a,r])=>{void 0!==e[r]&&void 0===e[a]&&(t[a]=e[r],n.push("“"+r+"” must be renamed as “"+a+"”;"))})),n.length>0){console.group("$.ddYMap"),console.warn("Some of the parameters have been renamed. Please, correct the following parameters:");for(var r=0;r<\/script>'))},init:function(a){var t=this;t.initStatic(),e.extend(a,t.verifyRenamedParams(a,{defaultZoom:"zoom",placemarks:"latLng"})),a=e.extend({},t.defaults,a),ymaps.ready((function(){var n=t.preparePlacemarks(a),r=n.getLength();if(r>0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:n.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),r>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-a.mapCenterOffset[0],s[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var t=e.ddYMap;return e(this).each((function(){t.init(e.extend(a,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file +!function(e){e.extend(!0,{ddYMap:{defaults:{placemarks:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},preparePlacemarks:function(a){var t=new ymaps.GeoObjectCollection;if(!Array.isArray(a.placemarks))return t;if(2==a.placemarks.length&&e.isNumeric(a.placemarks[0])&&e.isNumeric(a.placemarks[1]))t.add(new ymaps.Placemark(a.placemarks,{},a.placemarkOptions));else for(var n=0;n<\/script>'))},init:function(a){var t=this;t.initStatic(),a=e.extend({},t.defaults,a),ymaps.ready((function(){var n=t.preparePlacemarks(a),r=n.getLength();if(r>0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:n.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),r>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-a.mapCenterOffset[0],s[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var t=e.ddYMap;return e(this).each((function(){t.init(e.extend(a,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file From 51080acfa37d8792b4033813e945afe4db6a0339 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 15:44:05 +0400 Subject: [PATCH 12/33] * Minor changes. --- jQuery.ddYMap.js | 396 +++++++++++++++++++++++------------------------ 1 file changed, 198 insertions(+), 198 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index 523f451..527d966 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -27,224 +27,224 @@ */ (function($){ -$.extend( - true, - { - ddYMap: { - defaults: { - placemarks: new Array(), - element: 'map', - defaultZoom: 15, - defaultType: 'map', - scrollZoom: false, - mapCenterOffset: false, - placemarkOptions: {}, - controls: [ - {name: 'zoomControl'}, - {name: 'typeSelector'}, - {name: 'fullscreenControl'}, - {name: 'geolocationControl'}, - {name: 'rulerControl'} - ], - mapOptions: { - suppressMapOpenBlock: true - } - }, - - preparePlacemarks: function(params){ - var geoObjects = new ymaps.GeoObjectCollection(); - - if (!Array.isArray(params.placemarks)){ - return geoObjects; - } + $.extend( + true, + { + ddYMap: { + defaults: { + placemarks: new Array(), + element: 'map', + defaultZoom: 15, + defaultType: 'map', + scrollZoom: false, + mapCenterOffset: false, + placemarkOptions: {}, + controls: [ + {name: 'zoomControl'}, + {name: 'typeSelector'}, + {name: 'fullscreenControl'}, + {name: 'geolocationControl'}, + {name: 'rulerControl'} + ], + mapOptions: { + suppressMapOpenBlock: true + } + }, - //Если передана просто пара координат - if ( - params.placemarks.length == 2 && - $.isNumeric(params.placemarks[0]) && - $.isNumeric(params.placemarks[1]) - ){ - //Значит точка одна - geoObjects.add( - new ymaps.Placemark( - params.placemarks, - {}, - params.placemarkOptions - ) - ); - }else{ - //Переберём все точки - for ( - var i = 0; - i < params.placemarks.length; - i++ + preparePlacemarks: function(params){ + var geoObjects = new ymaps.GeoObjectCollection(); + + if (!Array.isArray(params.placemarks)){ + return geoObjects; + } + + //Если передана просто пара координат + if ( + params.placemarks.length == 2 && + $.isNumeric(params.placemarks[0]) && + $.isNumeric(params.placemarks[1]) ){ - //Если координаты заданы - if ( - $.isPlainObject(params.placemarks[i]) && - Array.isArray(params.placemarks[i].latLng) && - params.placemarks[i].latLng.length == 2 + //Значит точка одна + geoObjects.add( + new ymaps.Placemark( + params.placemarks, + {}, + params.placemarkOptions + ) + ); + }else{ + //Переберём все точки + for ( + var i = 0; + i < params.placemarks.length; + i++ ){ - //Создаём метку - geoObjects.add( - new ymaps.Placemark( - params.placemarks[i].latLng, - { - balloonContent: - typeof params.placemarks[i].content == 'string' ? - $.trim(params.placemarks[i].content) : - '' - }, - params.placemarkOptions - ) - ); + //Если координаты заданы + if ( + $.isPlainObject(params.placemarks[i]) && + Array.isArray(params.placemarks[i].latLng) && + params.placemarks[i].latLng.length == 2 + ){ + //Создаём метку + geoObjects.add( + new ymaps.Placemark( + params.placemarks[i].latLng, + { + balloonContent: + typeof params.placemarks[i].content == 'string' ? + $.trim(params.placemarks[i].content) : + '' + }, + params.placemarkOptions + ) + ); + } } } - } - - return geoObjects; - }, - - initStatic: function(){ - var theLib = this; - - if (!theLib.isStaticInited){ - theLib.isStaticInited = true; - //If Yandex Maps API is not included yet - if (typeof ymaps == 'undefined'){ - $('head').append(''); - } - } - }, - - init: function(params){ - var theLib = this; - - theLib.initStatic(); - - params = $.extend( - {}, - theLib.defaults, - params - ); + return geoObjects; + }, - ymaps.ready(function(){ - var - //Подготавливаем точки - geoObjects = theLib.preparePlacemarks(params), - //Количество точек - geoObjects_len = geoObjects.getLength() - ; + initStatic: function(){ + var theLib = this; - //Если точки заданы - if (geoObjects_len > 0){ - params.$element = $(params.element); + if (!theLib.isStaticInited){ + theLib.isStaticInited = true; - //Установим высоту у элемента, если она не задана - if (params.$element.height() == 0){ - params.$element.height(400); + //If Yandex Maps API is not included yet + if (typeof ymaps == 'undefined'){ + $('head').append(''); } - - //Создаём карту + } + }, + + init: function(params){ + var theLib = this; + + theLib.initStatic(); + + params = $.extend( + {}, + theLib.defaults, + params + ); + + ymaps.ready(function(){ var - map = new ymaps.Map( - params.element, - { - center: geoObjects.get(0).geometry.getCoordinates(), - zoom: params.defaultZoom, - type: 'yandex#' + params.defaultType, - controls: [] - }, - params.mapOptions - ) + //Подготавливаем точки + geoObjects = theLib.preparePlacemarks(params), + //Количество точек + geoObjects_len = geoObjects.getLength() ; - //Если заданы котролы - if(Array.isArray(params.controls)){ - params.controls.forEach( - control => - { - if(control.name){ - //Добавляем их - map.controls.add( - control.name, - control.options - ); - } - } - ); - } - - //Если зум не нужен - if (!params.scrollZoom){ - //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) - map.behaviors.disable('scrollZoom'); - } - - //Добавляем метки на карту - map.geoObjects.add(geoObjects); - - //Если меток несколько - if (geoObjects_len > 1){ - //Если элемент с картой скрыт - if (params.$element.is(':hidden')){ - //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) - map.events.once( - 'sizechange', - function(){ - //Надо, чтобы они все влезли - map.setBounds(geoObjects.getBounds()); + //Если точки заданы + if (geoObjects_len > 0){ + params.$element = $(params.element); + + //Установим высоту у элемента, если она не задана + if (params.$element.height() == 0){ + params.$element.height(400); + } + + //Создаём карту + var + map = new ymaps.Map( + params.element, + { + center: geoObjects.get(0).geometry.getCoordinates(), + zoom: params.defaultZoom, + type: 'yandex#' + params.defaultType, + controls: [] + }, + params.mapOptions + ) + ; + + //Если заданы котролы + if(Array.isArray(params.controls)){ + params.controls.forEach( + control => + { + if(control.name){ + //Добавляем их + map.controls.add( + control.name, + control.options + ); + } } ); - }else{ - //Надо, чтобы они все влезли - map.setBounds(geoObjects.getBounds()); } - } - - //Если нужно смещение центра карты - if ( - Array.isArray(params.mapCenterOffset) && - params.mapCenterOffset.length == 2 - ){ - var position = map.getGlobalPixelCenter(); - map.setGlobalPixelCenter([ - position[0] - params.mapCenterOffset[0], - position[1] - params.mapCenterOffset[1] - ]); + //Если зум не нужен + if (!params.scrollZoom){ + //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) + map.behaviors.disable('scrollZoom'); + } + + //Добавляем метки на карту + map.geoObjects.add(geoObjects); + + //Если меток несколько + if (geoObjects_len > 1){ + //Если элемент с картой скрыт + if (params.$element.is(':hidden')){ + //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) + map.events.once( + 'sizechange', + function(){ + //Надо, чтобы они все влезли + map.setBounds(geoObjects.getBounds()); + } + ); + }else{ + //Надо, чтобы они все влезли + map.setBounds(geoObjects.getBounds()); + } + } + + //Если нужно смещение центра карты + if ( + Array.isArray(params.mapCenterOffset) && + params.mapCenterOffset.length == 2 + ){ + var position = map.getGlobalPixelCenter(); + + map.setGlobalPixelCenter([ + position[0] - params.mapCenterOffset[0], + position[1] - params.mapCenterOffset[1] + ]); + } + + params.$element + .data( + 'ddYMap', + {map: map} + ) + .trigger('ddAfterInit') + ; } - - params.$element - .data( - 'ddYMap', - {map: map} - ) - .trigger('ddAfterInit') - ; - } - }); + }); + } } } - } -); - -$.fn.ddYMap = function(params){ - var theLib = $.ddYMap; + ); - return $(this).each(function(){ - theLib.init( - $.extend( - params, - {element: this} - ) - ); + $.fn.ddYMap = function(params){ + var theLib = $.ddYMap; + + return $(this).each(function(){ + theLib.init( + $.extend( + params, + {element: this} + ) + ); + }); + }; + + //On document.ready + $(function(){ + $.ddYMap.initStatic(); }); -}; - -//On document.ready -$(function(){ - $.ddYMap.initStatic(); -}); })(jQuery); \ No newline at end of file From d5b5c99f401d727070122f54a4b2a99bd7e4a6a2 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 15:55:15 +0400 Subject: [PATCH 13/33] =?UTF-8?q?*=20`jQuery.fn.ddYMap`=20=E2=86=92=20Para?= =?UTF-8?q?meters:=20The=20following=20have=20been=20renamed:=20=09*=20`pl?= =?UTF-8?q?acemarks`=20=E2=86=92=20`markers`.=20=09*=20`placemarkOptions`?= =?UTF-8?q?=20=E2=86=92=20`markerOptions`.=20*=20Attention!=20Backward=20c?= =?UTF-8?q?ompatibility=20is=20broken.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jQuery.ddYMap.js | 46 ++++++++++++++++++++++---------------------- jQuery.ddYMap.min.js | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index 527d966..6d2ff63 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -9,15 +9,15 @@ * * Parameters of the `$.fn.ddYMap` method (transferred as plain object). * @param params {objectPlain} — The parameters. - * @param params.placemarks {Array} — Array of placemarks to be put on the map. If there is more than one placemark, the map will be scaled to make all the placemarks visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). - * @param params.placemarks[i] {objectPlain} — Placemark data. - * @param params.placemarks[i].latLng {Array} — Placemark coordinates (latitude and longitude). - * @param [params.placemarks[i].content=''] {string} — Balloon content. + * @param params.markers {Array} — Array of markers to be put on the map. If there is more than one marker, the map will be scaled to make all the markers visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). + * @param params.markers[i] {objectPlain} — Marker data. + * @param params.markers[i].latLng {Array} — Marker coordinates (latitude and longitude). + * @param [params.markers[i].content=''] {string} — Balloon content. * @param [params.defaultZoom=15] {integer} — Default map zoom. * @param [params.defaultType='map'] {'map'|'satellite'|'hybrid'|'publicMap'|'publicMapHybrid'} — Default map type: 'map' — schematic map, 'satellite' — satellite map, 'hybrid' — hybrid map, 'publicMap' — public map, 'publicMapHybrid' - hybrid public map. * @param [params.scrollZoom=false] {boolean} — Allow zoom while scrolling. * @param [params.mapCenterOffset=[0, 0]] {Array} — Center offset of the map with respect to the center of the map container in pixels. - * @param [params.placemarkOptions={}] {objectPlain} — Placemark options. + * @param [params.markerOptions={}] {objectPlain} — Marker options. * @param [params.controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Array} — An array of controls to be added onto the map. * @param [params.mapOptions={suppressMapOpenBlock: true}] {objectPlain} — Represents yandex map options to be passed to the constructor. * @@ -32,13 +32,13 @@ { ddYMap: { defaults: { - placemarks: new Array(), + markers: new Array(), element: 'map', defaultZoom: 15, defaultType: 'map', scrollZoom: false, mapCenterOffset: false, - placemarkOptions: {}, + markerOptions: {}, controls: [ {name: 'zoomControl'}, {name: 'typeSelector'}, @@ -51,51 +51,51 @@ } }, - preparePlacemarks: function(params){ + prepareMarkers: function(params){ var geoObjects = new ymaps.GeoObjectCollection(); - if (!Array.isArray(params.placemarks)){ + if (!Array.isArray(params.markers)){ return geoObjects; } //Если передана просто пара координат if ( - params.placemarks.length == 2 && - $.isNumeric(params.placemarks[0]) && - $.isNumeric(params.placemarks[1]) + params.markers.length == 2 && + $.isNumeric(params.markers[0]) && + $.isNumeric(params.markers[1]) ){ //Значит точка одна geoObjects.add( new ymaps.Placemark( - params.placemarks, + params.markers, {}, - params.placemarkOptions + params.markerOptions ) ); }else{ //Переберём все точки for ( var i = 0; - i < params.placemarks.length; + i < params.markers.length; i++ ){ //Если координаты заданы if ( - $.isPlainObject(params.placemarks[i]) && - Array.isArray(params.placemarks[i].latLng) && - params.placemarks[i].latLng.length == 2 + $.isPlainObject(params.markers[i]) && + Array.isArray(params.markers[i].latLng) && + params.markers[i].latLng.length == 2 ){ //Создаём метку geoObjects.add( new ymaps.Placemark( - params.placemarks[i].latLng, + params.markers[i].latLng, { balloonContent: - typeof params.placemarks[i].content == 'string' ? - $.trim(params.placemarks[i].content) : + typeof params.markers[i].content == 'string' ? + $.trim(params.markers[i].content) : '' }, - params.placemarkOptions + params.markerOptions ) ); } @@ -132,7 +132,7 @@ ymaps.ready(function(){ var //Подготавливаем точки - geoObjects = theLib.preparePlacemarks(params), + geoObjects = theLib.prepareMarkers(params), //Количество точек geoObjects_len = geoObjects.getLength() ; diff --git a/jQuery.ddYMap.min.js b/jQuery.ddYMap.min.js index d34ed6a..901991c 100644 --- a/jQuery.ddYMap.min.js +++ b/jQuery.ddYMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddYMap:{defaults:{placemarks:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,placemarkOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},preparePlacemarks:function(a){var t=new ymaps.GeoObjectCollection;if(!Array.isArray(a.placemarks))return t;if(2==a.placemarks.length&&e.isNumeric(a.placemarks[0])&&e.isNumeric(a.placemarks[1]))t.add(new ymaps.Placemark(a.placemarks,{},a.placemarkOptions));else for(var n=0;n<\/script>'))},init:function(a){var t=this;t.initStatic(),a=e.extend({},t.defaults,a),ymaps.ready((function(){var n=t.preparePlacemarks(a),r=n.getLength();if(r>0){a.$element=e(a.element),0==a.$element.height()&&a.$element.height(400);var o=new ymaps.Map(a.element,{center:n.get(0).geometry.getCoordinates(),zoom:a.defaultZoom,type:"yandex#"+a.defaultType,controls:[]},a.mapOptions);if(Array.isArray(a.controls)&&a.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),a.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),r>1&&(a.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(a.mapCenterOffset)&&2==a.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-a.mapCenterOffset[0],s[1]-a.mapCenterOffset[1]])}a.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(a){var t=e.ddYMap;return e(this).each((function(){t.init(e.extend(a,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file +!function(e){e.extend(!0,{ddYMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},prepareMarkers:function(t){var r=new ymaps.GeoObjectCollection;if(!Array.isArray(t.markers))return r;if(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1]))r.add(new ymaps.Placemark(t.markers,{},t.markerOptions));else for(var n=0;n<\/script>'))},init:function(t){var r=this;r.initStatic(),t=e.extend({},r.defaults,t),ymaps.ready((function(){var n=r.prepareMarkers(t),a=n.getLength();if(a>0){t.$element=e(t.element),0==t.$element.height()&&t.$element.height(400);var o=new ymaps.Map(t.element,{center:n.get(0).geometry.getCoordinates(),zoom:t.defaultZoom,type:"yandex#"+t.defaultType,controls:[]},t.mapOptions);if(Array.isArray(t.controls)&&t.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),t.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),a>1&&(t.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(t.mapCenterOffset)&&2==t.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-t.mapCenterOffset[0],s[1]-t.mapCenterOffset[1]])}t.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(t){var r=e.ddYMap;return e(this).each((function(){r.init(e.extend(t,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file From a01af12fbca6dfd5eb5f663203fe7e6504c927d2 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 20 May 2023 16:03:18 +0400 Subject: [PATCH 14/33] * Refactoring. --- jQuery.ddYMap.js | 48 +++++++++++++++++++++----------------------- jQuery.ddYMap.min.js | 2 +- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/jQuery.ddYMap.js b/jQuery.ddYMap.js index 6d2ff63..b4b95db 100644 --- a/jQuery.ddYMap.js +++ b/jQuery.ddYMap.js @@ -74,32 +74,30 @@ ); }else{ //Переберём все точки - for ( - var i = 0; - i < params.markers.length; - i++ - ){ - //Если координаты заданы - if ( - $.isPlainObject(params.markers[i]) && - Array.isArray(params.markers[i].latLng) && - params.markers[i].latLng.length == 2 - ){ - //Создаём метку - geoObjects.add( - new ymaps.Placemark( - params.markers[i].latLng, - { - balloonContent: - typeof params.markers[i].content == 'string' ? - $.trim(params.markers[i].content) : - '' - }, - params.markerOptions - ) - ); + params.markers.forEach( + markerData => { + //Если координаты заданы + if ( + $.isPlainObject(markerData) && + Array.isArray(markerData.latLng) && + markerData.latLng.length == 2 + ){ + //Создаём метку + geoObjects.add( + new ymaps.Placemark( + markerData.latLng, + { + balloonContent: + typeof markerData.content == 'string' ? + $.trim(markerData.content) : + '' + }, + params.markerOptions + ) + ); + } } - } + ); } return geoObjects; diff --git a/jQuery.ddYMap.min.js b/jQuery.ddYMap.min.js index 901991c..1b618d3 100644 --- a/jQuery.ddYMap.min.js +++ b/jQuery.ddYMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddYMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},prepareMarkers:function(t){var r=new ymaps.GeoObjectCollection;if(!Array.isArray(t.markers))return r;if(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1]))r.add(new ymaps.Placemark(t.markers,{},t.markerOptions));else for(var n=0;n<\/script>'))},init:function(t){var r=this;r.initStatic(),t=e.extend({},r.defaults,t),ymaps.ready((function(){var n=r.prepareMarkers(t),a=n.getLength();if(a>0){t.$element=e(t.element),0==t.$element.height()&&t.$element.height(400);var o=new ymaps.Map(t.element,{center:n.get(0).geometry.getCoordinates(),zoom:t.defaultZoom,type:"yandex#"+t.defaultType,controls:[]},t.mapOptions);if(Array.isArray(t.controls)&&t.controls.forEach((e=>{e.name&&o.controls.add(e.name,e.options)})),t.scrollZoom||o.behaviors.disable("scrollZoom"),o.geoObjects.add(n),a>1&&(t.$element.is(":hidden")?o.events.once("sizechange",(function(){o.setBounds(n.getBounds())})):o.setBounds(n.getBounds())),Array.isArray(t.mapCenterOffset)&&2==t.mapCenterOffset.length){var s=o.getGlobalPixelCenter();o.setGlobalPixelCenter([s[0]-t.mapCenterOffset[0],s[1]-t.mapCenterOffset[1]])}t.$element.data("ddYMap",{map:o}).trigger("ddAfterInit")}}))}}}),e.fn.ddYMap=function(t){var r=e.ddYMap;return e(this).each((function(){r.init(e.extend(t,{element:this}))}))},e((function(){e.ddYMap.initStatic()}))}(jQuery); \ No newline at end of file +!function(e){e.extend(!0,{ddYMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},prepareMarkers:function(t){var n=new ymaps.GeoObjectCollection;return Array.isArray(t.markers)?(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1])?n.add(new ymaps.Placemark(t.markers,{},t.markerOptions)):t.markers.forEach((a=>{e.isPlainObject(a)&&Array.isArray(a.latLng)&&2==a.latLng.length&&n.add(new ymaps.Placemark(a.latLng,{balloonContent:"string"==typeof a.content?e.trim(a.content):""},t.markerOptions))})),n):n},initStatic:function(){this.isStaticInited||(this.isStaticInited=!0,"undefined"==typeof ymaps&&e("head").append(''); + var apiSrc = '//api-maps.yandex.ru/2.1/?lang=' + navigator.language; + + if (params.apiKey.length > 0){ + apiSrc += '&apikey=' + params.apiKey; + } + + $('head').append(''); } } }, @@ -119,14 +127,16 @@ init: function(params){ var theLib = this; - theLib.initStatic(); - params = $.extend( {}, theLib.defaults, params ); + theLib.initStatic({ + apiKey: params.apiKey + }); + ymaps.ready(function(){ var //Подготавливаем точки @@ -240,9 +250,4 @@ ); }); }; - - //On document.ready - $(function(){ - $.ddMap.initStatic(); - }); })(jQuery); \ No newline at end of file diff --git a/jQuery.ddMap.min.js b/jQuery.ddMap.min.js index 2200a0a..ade4032 100644 --- a/jQuery.ddMap.min.js +++ b/jQuery.ddMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0}},prepareMarkers:function(t){var n=new ymaps.GeoObjectCollection;return Array.isArray(t.markers)?(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1])?n.add(new ymaps.Placemark(t.markers,{},t.markerOptions)):t.markers.forEach((a=>{e.isPlainObject(a)&&Array.isArray(a.latLng)&&2==a.latLng.length&&n.add(new ymaps.Placemark(a.latLng,{balloonContent:"string"==typeof a.content?e.trim(a.content):""},t.markerOptions))})),n):n},initStatic:function(){this.isStaticInited||(this.isStaticInited=!0,"undefined"==typeof ymaps&&e("head").append(' + + + +``` + +You may not to think about including Yandex Map script, the library will do it automatically. + + +### 2. Add a map container wherever you like on a page + +```html + +
+ +``` + +You don't even have to worry about the container size, the lib will set default size if it is zero. + + +### 3. Run `jQuery.fn.ddMap` + +```js +$('.map').ddMap({ + //You can add several markers if you want + markers: [ + //At least one marker is required + { + //Geo position is required + latLng: [ + 51.532098, + -0.178100 + ], + //Content is optional, you can avoid it + content: '

Some marker text.

' + } + ] +}); +``` + +That's all! + + ## Links * [Home page](https://code.divandesign.ru/jquery/ddmap) diff --git a/README_ru.md b/README_ru.md index f7b2982..1620f96 100644 --- a/README_ru.md +++ b/README_ru.md @@ -11,6 +11,56 @@ * [JS API Яндекс Карт](https://yandex.ru/dev/maps/jsapi/doc/2.1/) >= 2.1 (подключится автоматически, если отсутствует на странице) +## Usage + + +### 1. Подключаем JS на странице + +```html + + + + + +``` + +Можно не думать о подключении скрипта Яндекс Карт, библиотека сделает это автоматически. + + +### 2. Добавляем контейнер карты в любое удобное место на странице + +```html + +
+ +``` + +Вам даже не нужно беспокоиться о размере контейнера, библиотека поставит размер по умолчанию, если он нулевой. + + +### 3. Запускаем `jQuery.fn.ddMap` + +```js +$('.map').ddMap({ + //Маркеров на карту можно добавить несколько + markers: [ + //Как минимум один обязателен + { + //Координаты обязательны + latLng: [ + 51.532098, + -0.178100 + ], + //Контент опционален, можно опустить + content: '

Some marker text.

' + } + ] +}); +``` + +Вот и всё! + + ## Ссылки * [Home page](https://code.divandesign.ru/jquery/ddmap) From 7be623d02bf07be4dc3887b71cac7c4289683957 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sun, 21 May 2023 16:24:44 +0400 Subject: [PATCH 25/33] =?UTF-8?q?+=20README=20=E2=86=92=20Parameters=20des?= =?UTF-8?q?cription.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ README_ru.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++- jQuery.ddMap.js | 17 +---------- 3 files changed, 157 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c8d7b0d..982886c 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ You don't even have to worry about the container size, the lib will set default ```js $('.map').ddMap({ //You can add several markers if you want + //If there is more than one marker, the map will be auto-scaled to make all the markers visible markers: [ //At least one marker is required { @@ -61,6 +62,83 @@ $('.map').ddMap({ That's all! +## Parameters description + + +### `jQuery.fn.ddMap(params)` + +* `params` + * Desctription: The parameters. + * Valid values: `objectPlain` + * **Required** + +* `params.markers` + * Desctription: Array of markers to be put on the map. + * If there is more than one marker, the map will be auto-scaled to make all the markers visible. + * Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). + * Valid values: `array` + * **Required** + +* `params.markers[i]` + * Desctription: A marker data. + * Valid values: `objectPlain` + * **Required** + +* `params.markers[i].latLng` + * Desctription: Marker coordinates (latitude and longitude). + * Valid values: `array` + * **Required** + +* `params.markers[i].content` + * Desctription: Content of marker popup. HTML tags are supported. + * Valid values: `string` + * Default value: `''` + +* `params.apiKey` + * Desctription: Yandex Maps API key. + _For now it is working without key, but Yandex mark it as required, so it is recommended to set it._ + * Valid values: `string` + * Default value: — + +* `params.defaultZoom` + * Desctription: Default map zoom. + * Valid values: `integer` + * Default value: `15` + +* `params.defaultType` + * Desctription: Default map type. + * Valid values: + * `'map'` — schematic map + * `'satellite'` — satellite map + * `'hybrid'` — hybrid map + * Default value: `'map'` + +* `params.scrollZoom` + * Desctription: Allow zoom by mouse wheel. + * Valid values: `boolean` + * Default value: `false` + +* `params.mapCenterOffset` + * Desctription: Center offset of the map with respect to the center of the map container in pixels. + * Valid values: `array` + * Default value: `[0, 0]` + +* `params.markerOptions` + * Desctription: Marker options. + * Valid values: `objectPlain` + * Default value: `{}` + +* `params.controls` + * Desctription: An array of controls to be added onto the map. + * Valid values: `array` + * Default value: `[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]` + +* `params.mapOptions` + * Desctription: Represents Yandex map options to be passed to the constructor. + * Valid values: `objectPlain` + * Default value: `{suppressMapOpenBlock: true}` + + ## Links * [Home page](https://code.divandesign.ru/jquery/ddmap) diff --git a/README_ru.md b/README_ru.md index 1620f96..71a2908 100644 --- a/README_ru.md +++ b/README_ru.md @@ -42,7 +42,7 @@ ```js $('.map').ddMap({ - //Маркеров на карту можно добавить несколько + //Маркеров на карту можно добавить несколько markers: [ //Как минимум один обязателен { @@ -61,6 +61,83 @@ $('.map').ddMap({ Вот и всё! +## Описание параметров + + +### `jQuery.fn.ddMap(params)` + +* `params` + * Описание: Параметры. + * Допустимые значения: `objectPlain` + * **Обязателен** + +* `params.markers` + * Описание: Массив маркеров для размещения на карте. + * Если задать несколько маркеров, карта будет автоматически смаштабирована, чтобы они все были видны. + * Кроме того, вместо массива маркеров по-прежнему можно передавать простую пару координат (как это было в 1.2 и более ранних версиях). + * Допустимые значения: `array` + * **Обязателен** + +* `params.markers[i]` + * Описание: Данные маркера. + * Допустимые значения: `objectPlain` + * **Обязателен** + +* `params.markers[i].latLng` + * Описание: Координаты маркера (широта и долгота). + * Допустимые значения: `array` + * **Обязателен** + +* `params.markers[i].content` + * Описание: Содержимое всплывающего окна маркера. HTML-теги поддерживаются. + * Допустимые значения: `string` + * Значение по умолчанию: `''` + +* `params.apiKey` + * Описание: API-ключ Яндекс Карт. + _Пока что работает и без ключа, но Яндекс декларирует его обязательным, так что рекомендуется использовать._ + * Допустимые значения: `string` + * Значение по умолчанию: — + +* `params.defaultZoom` + * Описание: Дефолтный масштаб карты. + * Допустимые значения: `integer` + * Значение по умолчанию: `15` + +* `params.defaultType` + * Описание: Дефолтный тип карты. + * Допустимые значения: + * `'map'` — схема + * `'satellite'` — спутник + * `'hybrid'` — гибрид + * Значение по умолчанию: `'map'` + +* `params.scrollZoom` + * Описание: Разрешить масштабирование колесом мыши? + * Допустимые значения: `boolean` + * Значение по умолчанию: `false` + +* `params.mapCenterOffset` + * Описание: Смещение центра карты относительно центра контейнера карты в пикселях. + * Допустимые значения: `array` + * Значение по умолчанию: `[0, 0]` + +* `params.markerOptions` + * Описание: Опции маркеров. + * Допустимые значения: `objectPlain` + * Значение по умолчанию: `{}` + +* `params.controls` + * Описание: Массив контролов карты. + * Допустимые значения: `array` + * Значение по умолчанию: `[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]` + +* `params.mapOptions` + * Описание: Опции, которые будут переданы в конструктор Яндекс карты. + * Допустимые значения: `objectPlain` + * Значение по умолчанию: `{suppressMapOpenBlock: true}` + + ## Ссылки * [Home page](https://code.divandesign.ru/jquery/ddmap) diff --git a/jQuery.ddMap.js b/jQuery.ddMap.js index 9c123bf..1e14cda 100644 --- a/jQuery.ddMap.js +++ b/jQuery.ddMap.js @@ -2,22 +2,7 @@ * jQuery.ddMap * @version 1.4 (2015-07-23) * - * @see README.md - * - * Parameters of the `$.fn.ddMap` method (transferred as plain object). - * @param params {objectPlain} — The parameters. - * @param params.markers {Array} — Array of markers to be put on the map. If there is more than one marker, the map will be scaled to make all the markers visible. Also, a pair of coordinates still can be passed (like it was in 1.2 and earlier). - * @param params.markers[i] {objectPlain} — Marker data. - * @param params.markers[i].latLng {Array} — Marker coordinates (latitude and longitude). - * @param [params.markers[i].content=''] {string} — Balloon content. - * @param [params.defaultZoom=15] {integer} — Default map zoom. - * @param [params.defaultType='map'] {'map'|'satellite'|'hybrid'|'publicMap'|'publicMapHybrid'} — Default map type: 'map' — schematic map, 'satellite' — satellite map, 'hybrid' — hybrid map, 'publicMap' — public map, 'publicMapHybrid' - hybrid public map. - * @param [params.scrollZoom=false] {boolean} — Allow zoom while scrolling. - * @param [params.mapCenterOffset=[0, 0]] {Array} — Center offset of the map with respect to the center of the map container in pixels. - * @param [params.markerOptions={}] {objectPlain} — Marker options. - * @param [params.controls=[{name: 'zoomControl'},{name: 'typeSelector'},{name: 'fullscreenControl'},{name: 'geolocationControl'},{name: 'rulerControl'}]] {Array} — An array of controls to be added onto the map. - * @param [params.mapOptions={suppressMapOpenBlock: true}] {objectPlain} — Represents yandex map options to be passed to the constructor. - * @param [params.apiKey] {string} — Yandex Maps API key. For now it is working without key, but Yandex mark it as required, so it is recommended to set it. + * @see {@link README.md} * * @link https://code.divandesign.ru/jquery/ddmap * From ebba0c54ced9673a080102e06995932a469a2e11 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sun, 21 May 2023 16:33:59 +0400 Subject: [PATCH 26/33] =?UTF-8?q?+=20README=20=E2=86=92=20Events=20descrip?= =?UTF-8?q?tion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++++ README_ru.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index 982886c..761efbf 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,13 @@ That's all! * Default value: `{suppressMapOpenBlock: true}` +## Events description + +All events are triggered at the main element to which `jQuery.fn.ddMap` has been applied. + +* `ddAfterInit` — After initialisation. + + ## Links * [Home page](https://code.divandesign.ru/jquery/ddmap) diff --git a/README_ru.md b/README_ru.md index 71a2908..268443c 100644 --- a/README_ru.md +++ b/README_ru.md @@ -138,6 +138,13 @@ $('.map').ddMap({ * Значение по умолчанию: `{suppressMapOpenBlock: true}` +## Описание событий + +Все события срабатывают на основном элементе, к которому был применен `jQuery.fn.ddMap`. + +* `ddAfterInit` — После инициализации. + + ## Ссылки * [Home page](https://code.divandesign.ru/jquery/ddmap) From ca641e66be768c8a7512792320d5912d15a97793 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sun, 21 May 2023 16:52:27 +0400 Subject: [PATCH 27/33] =?UTF-8?q?+=20Events=20=E2=86=92=20`ddBeforeInit`:?= =?UTF-8?q?=20The=20new=20event.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + README_ru.md | 1 + jQuery.ddMap.js | 2 ++ jQuery.ddMap.min.js | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 761efbf..d018876 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ That's all! All events are triggered at the main element to which `jQuery.fn.ddMap` has been applied. +* `ddBeforeInit` — Before initialisation (when the map API is ready, immediately before the map constructor is called). * `ddAfterInit` — After initialisation. diff --git a/README_ru.md b/README_ru.md index 268443c..a79d486 100644 --- a/README_ru.md +++ b/README_ru.md @@ -142,6 +142,7 @@ $('.map').ddMap({ Все события срабатывают на основном элементе, к которому был применен `jQuery.fn.ddMap`. +* `ddBeforeInit` — Перед инициализацией (когда API карты готов, непосредственно перед вызовом конструктора карты). * `ddAfterInit` — После инициализации. diff --git a/jQuery.ddMap.js b/jQuery.ddMap.js index 1e14cda..b2be10e 100644 --- a/jQuery.ddMap.js +++ b/jQuery.ddMap.js @@ -150,6 +150,8 @@ if (geoObjects_len > 0){ params.$element = $(params.$element); + params.$element.trigger('ddBeforeInit'); + //Установим высоту у элемента, если она не задана if (params.$element.height() == 0){ params.$element.height(400); diff --git a/jQuery.ddMap.min.js b/jQuery.ddMap.min.js index b149179..4755da1 100644 --- a/jQuery.ddMap.min.js +++ b/jQuery.ddMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0},apiKey:""},isStaticInited:!1,apiConnectionAttempts:0,prepareMarkers:function(t){var n=new ymaps.GeoObjectCollection;return Array.isArray(t.markers)?(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1])?n.add(new ymaps.Placemark(t.markers,{},t.markerOptions)):t.markers.forEach((a=>{e.isPlainObject(a)&&Array.isArray(a.latLng)&&2==a.latLng.length&&n.add(new ymaps.Placemark(a.latLng,{balloonContent:"string"==typeof a.content?e.trim(a.content):""},t.markerOptions))})),n):n},initStatic:function(t){if(!this.isStaticInited&&(this.isStaticInited=!0,"undefined"==typeof ymaps)){var n="//api-maps.yandex.ru/2.1/?lang="+navigator.language;t.apiKey.length>0&&(n+="&apikey="+t.apiKey),e("head").append(''); + } + } + } + + constructor(props){ + var + theInstance = this, + theClass = theInstance.constructor + ; + + theInstance.markers = new Array(); + theInstance.$element = 'map'; + theInstance.defaultZoom = 15; + theInstance.defaultType = 'map'; + theInstance.scrollZoom = false; + theInstance.mapCenterOffset = false; + theInstance.markerOptions = {}; + theInstance.controls = [ + {name: 'zoomControl'}, + {name: 'typeSelector'}, + {name: 'fullscreenControl'}, + {name: 'geolocationControl'}, + {name: 'rulerControl'} + ]; + theInstance.mapOptions = { + suppressMapOpenBlock: true + }; + + theInstance.apiConnectionAttempts = 0; + + theInstance.setProps(props); + + theClass.initStatic({ + apiKey: + typeof props.apiKey == 'undefined' ? + '' : + props.apiKey + }); + + theInstance.constructor_init(); + } + + constructor_init(){ + var theInstance = this; + + //If Yandex map API is not loaded yet + if (typeof ymaps == 'undefined'){ + theInstance.apiConnectionAttempts++; - initStatic: function(params){ - var theLib = this; + //Try again later but 10 attempts as maximum + if (theInstance.apiConnectionAttempts < 10){ + setTimeout( + theInstance.constructor_init.bind(theInstance), + ( + 500 + + //Await + 100 ms after each attempt + theInstance.apiConnectionAttempts * 100 + ) + ); + } + }else{ + ymaps.ready(function(){ + var + //Подготавливаем точки + geoObjects = theInstance.prepareMarkers(), + //Количество точек + geoObjects_len = geoObjects.getLength() + ; - if (!theLib.isStaticInited){ - theLib.isStaticInited = true; + //Если точки заданы + if (geoObjects_len > 0){ + theInstance.$element = $(theInstance.$element); - //If Yandex Maps API is not included yet - if (typeof ymaps == 'undefined'){ - var apiSrc = '//api-maps.yandex.ru/2.1/?lang=' + navigator.language; - - if (params.apiKey.length > 0){ - apiSrc += '&apikey=' + params.apiKey; - } - - $('head').append(''); + theInstance.$element.trigger('ddBeforeInit'); + + //Delete all children + theInstance.$element.empty(); + + //Установим высоту у элемента, если она не задана + if (theInstance.$element.height() == 0){ + theInstance.$element.height(400); } - } - }, - - init: function(params){ - var theLib = this; - - params = $.extend( - {}, - theLib.defaults, - params - ); - - theLib.initStatic({ - apiKey: params.apiKey - }); - - //If Yandex map API is not loaded yet - if (typeof ymaps == 'undefined'){ - theLib.apiConnectionAttempts++; - //Try again later but 10 attempts as maximum - if (theLib.apiConnectionAttempts < 10){ - setTimeout( - theLib.init.bind(theLib, params), - ( - 500 + - //Await + 100 ms after each attempt - theLib.apiConnectionAttempts * 100 - ) + //Создаём карту + var + map = new ymaps.Map( + theInstance.$element.get(0), + { + center: geoObjects.get(0).geometry.getCoordinates(), + zoom: theInstance.defaultZoom, + type: 'yandex#' + theInstance.defaultType, + controls: [] + }, + theInstance.mapOptions + ) + ; + + //Если заданы котролы + if(Array.isArray(theInstance.controls)){ + theInstance.controls.forEach( + control => + { + if(control.name){ + //Добавляем их + map.controls.add( + control.name, + control.options + ); + } + } ); } - }else{ - ymaps.ready(function(){ - var - //Подготавливаем точки - geoObjects = theLib.prepareMarkers(params), - //Количество точек - geoObjects_len = geoObjects.getLength() - ; - - //Если точки заданы - if (geoObjects_len > 0){ - params.$element = $(params.$element); - - params.$element.trigger('ddBeforeInit'); - - //Delete all children - params.$element.empty(); - - //Установим высоту у элемента, если она не задана - if (params.$element.height() == 0){ - params.$element.height(400); - } - - //Создаём карту - var - map = new ymaps.Map( - params.$element.get(0), - { - center: geoObjects.get(0).geometry.getCoordinates(), - zoom: params.defaultZoom, - type: 'yandex#' + params.defaultType, - controls: [] - }, - params.mapOptions - ) - ; - - //Если заданы котролы - if(Array.isArray(params.controls)){ - params.controls.forEach( - control => - { - if(control.name){ - //Добавляем их - map.controls.add( - control.name, - control.options - ); - } - } - ); - } - - //Если зум не нужен - if (!params.scrollZoom){ - //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) - map.behaviors.disable('scrollZoom'); - } - - //Добавляем метки на карту - map.geoObjects.add(geoObjects); - - //Если меток несколько - if (geoObjects_len > 1){ - //Если элемент с картой скрыт - if (params.$element.is(':hidden')){ - //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) - map.events.once( - 'sizechange', - function(){ - //Надо, чтобы они все влезли - map.setBounds(geoObjects.getBounds()); - } - ); - }else{ + + //Если зум не нужен + if (!theInstance.scrollZoom){ + //Выключим масштабирование колесом мыши (т.к. в 2.1 по умолчанию он включён) + map.behaviors.disable('scrollZoom'); + } + + //Добавляем метки на карту + map.geoObjects.add(geoObjects); + + //Если меток несколько + if (geoObjects_len > 1){ + //Если элемент с картой скрыт + if (theInstance.$element.is(':hidden')){ + //При первом изменении размера (иначе, если карта была скрыта, выйдет плохо) + map.events.once( + 'sizechange', + function(){ //Надо, чтобы они все влезли map.setBounds(geoObjects.getBounds()); } + ); + }else{ + //Надо, чтобы они все влезли + map.setBounds(geoObjects.getBounds()); + } + } + + //Если нужно смещение центра карты + if ( + Array.isArray(theInstance.mapCenterOffset) && + theInstance.mapCenterOffset.length == 2 + ){ + var position = map.getGlobalPixelCenter(); + + map.setGlobalPixelCenter([ + position[0] - theInstance.mapCenterOffset[0], + position[1] - theInstance.mapCenterOffset[1] + ]); + } + + theInstance.$element + .on( + 'resize', + () => { + map.container.fitToViewport(); } - - //Если нужно смещение центра карты - if ( - Array.isArray(params.mapCenterOffset) && - params.mapCenterOffset.length == 2 - ){ - var position = map.getGlobalPixelCenter(); - - map.setGlobalPixelCenter([ - position[0] - params.mapCenterOffset[0], - position[1] - params.mapCenterOffset[1] - ]); - } - - params.$element - .on( - 'resize', - () => { - map.container.fitToViewport(); - } - ) - .data( - 'ddMap', - {map: map} - ) - .trigger('ddAfterInit') - ; + ) + .data( + 'ddMap', + {map: map} + ) + .trigger('ddAfterInit') + ; + } + }); + } + } + + prepareMarkers(){ + var + theInstance = this, + geoObjects = new ymaps.GeoObjectCollection() + ; + + if (!Array.isArray(theInstance.markers)){ + return geoObjects; + } + + //Если передана просто пара координат + if ( + theInstance.markers.length == 2 && + $.isNumeric(theInstance.markers[0]) && + $.isNumeric(theInstance.markers[1]) + ){ + //Значит точка одна + geoObjects.add( + new ymaps.Placemark( + theInstance.markers, + {}, + theInstance.markerOptions + ) + ); + }else{ + //Переберём все точки + theInstance.markers.forEach( + markerData => { + //Если координаты заданы + if ( + $.isPlainObject(markerData) && + Array.isArray(markerData.latLng) && + markerData.latLng.length == 2 + ){ + //Создаём метку + geoObjects.add( + new ymaps.Placemark( + markerData.latLng, + { + balloonContent: + typeof markerData.content == 'string' ? + $.trim(markerData.content) : + '' + }, + theInstance.markerOptions + ) + ); + } + } + ); + } + + return geoObjects; + } + + //This method from jQuery.ddUI + /** + * @method setProps + * @version 1.1 (2023-04-22) + * + * @desc Sets the ojbect properties. + * + * @param [props] {objectPlain} — Object props values. + * @param props[propName] {mixed} — Key is property name, value is value. + * + * @returns {void} + */ + setProps(props){ + var theInstance = this; + + if ($.isPlainObject(props)){ + Object.entries(props).forEach( + ([ + propName, + propValue + ]) => + { + //If the property exists + if (typeof theInstance[propName] != 'undefined'){ + //Plain objects are extended, others are owerwrited + if ($.isPlainObject(theInstance[propName])){ + $.extend( + theInstance[propName], + propValue + ); + }else{ + theInstance[propName] = propValue; } - }); + } } - } + ); } } - ); + }; $.fn.ddMap = function(params){ - var theLib = $.ddMap; - return $(this).each(function(){ - theLib.init( + new ddMap( $.extend( params, { $element: this } ) - ); + ) }); }; })(jQuery); \ No newline at end of file diff --git a/jQuery.ddMap.min.js b/jQuery.ddMap.min.js index 20b6cb3..b1d1db0 100644 --- a/jQuery.ddMap.min.js +++ b/jQuery.ddMap.min.js @@ -1 +1 @@ -!function(e){e.extend(!0,{ddMap:{defaults:{markers:new Array,element:"map",defaultZoom:15,defaultType:"map",scrollZoom:!1,mapCenterOffset:!1,markerOptions:{},controls:[{name:"zoomControl"},{name:"typeSelector"},{name:"fullscreenControl"},{name:"geolocationControl"},{name:"rulerControl"}],mapOptions:{suppressMapOpenBlock:!0},apiKey:""},isStaticInited:!1,apiConnectionAttempts:0,prepareMarkers:function(t){var n=new ymaps.GeoObjectCollection;return Array.isArray(t.markers)?(2==t.markers.length&&e.isNumeric(t.markers[0])&&e.isNumeric(t.markers[1])?n.add(new ymaps.Placemark(t.markers,{},t.markerOptions)):t.markers.forEach((a=>{e.isPlainObject(a)&&Array.isArray(a.latLng)&&2==a.latLng.length&&n.add(new ymaps.Placemark(a.latLng,{balloonContent:"string"==typeof a.content?e.trim(a.content):""},t.markerOptions))})),n):n},initStatic:function(t){if(!this.isStaticInited&&(this.isStaticInited=!0,"undefined"==typeof ymaps)){var n="//api-maps.yandex.ru/2.1/?lang="+navigator.language;t.apiKey.length>0&&(n+="&apikey="+t.apiKey),e("head").append('