前言
上篇文章为大家展现了好看的信息窗口,接下来我们跟着流程图看下一步
之前我们的带点击事件已经添加完毕,下一步就是当用户点击的时候,渲染锻炼形式,当然这是一个标签,可以提供给用户输入锻炼形式
实例
● 我们的表单在HTML中已经写好了,其实这个表单有一个隐藏类
● 当我们去除这个隐藏类的时候,我们就可以让表单展现出来,当然这个表单的类名已经在js存储到变量中,我们可以直接去使用
map.on('click', function (mapEvent) {
form.classList.remove('hidden');
map.on('click', function (mapEvent) {
form.classList.remove('hidden');
// const { lat, lng } = mapEvent.latlng;
// L.marker([lat, lng])
// .addTo(map)
// .bindPopup(
// L.popup({
// maxWidth: 250,
// minWidth: 100,
// autoClose: false,
// closeOnClick: false,
// className: 'running-popup',
// })
// )
// .setPopupContent('跑步')
// .openPopup();
});
},
});
},
● 让我们刚开始点击的时候,光标就锁定在锻炼距离上,这样会提升用户体验
inputDistance.focus();
● 当表单生成并且填写完毕后,我们回车就会将标记渲染到地图上,很明显,这就要使用监听事件了
form.addEventListener('submit', function () {
//展现标记
const { lat, lng } = mapEvent.latlng;
L.marker([lat, lng])
.addTo(map)
.bindPopup(
L.popup({
maxWidth: 250,
minWidth: 100,
autoClose: false,
closeOnClick: false,
className: 'running-popup',
})
)
.setPopupContent('跑步')
.openPopup();
});
但是,我们发现这里的map,和mapEvent好像无法访问到,因为这个是在另一个函数内部的,所以我们需要在全局上进行宣告;宣告完成后,不要忘记修改函数中的变量声明;
let map, mapEvent;
if (navigator.geolocation)
navigator.geolocation.getCurrentPosition(
function (position) {
const { latitude } = position.coords;
const { longitude } = position.coords;
const coords = [latitude, longitude];
map = L.map('map').setView(coords, 13); //去除const声明
L.tileLayer('https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', {
attribution:
'© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
}).addTo(map);
map.on('click', function (mapE) { //这个的Event需要修改
mapEvent = mapE; //将这里的变量赋予到全局去
form.classList.remove('hidden');
inputDistance.focus();
});
},
function () {
alert('无法获取你的位置!');
}
);
● 但是这样并不会生效哦,不要忘记,表单的默认行为提交后会刷新网页;所以我们要阻止表单的默认行为;
form.addEventListener('submit', function (e) {
e.preventDefault(); //组织表单默认行为
//展现标记
const { lat, lng } = mapEvent.latlng;
L.marker([lat, lng])
.addTo(map)
.bindPopup(
L.popup({
maxWidth: 250,
minWidth: 100,
autoClose: false,
closeOnClick: false,
className: 'running-popup',
})
)
.setPopupContent('跑步')
.openPopup();
});
● 这个标签在输入提交之后并不会清楚里面的内容,所以我们使用我们之前经常使用方式,当表格提交后,清理输入选项;
form.addEventListener('submit', function (e) {
e.preventDefault(); //组织表单默认行为
//将表格输入内容置空
inputDistance.value =
inputDuration.value =
inputCadence.value =
inputElevation.value =
'';
//展现标记
const { lat, lng } = mapEvent.latlng;
L.marker([lat, lng])
.addTo(map)
.bindPopup(
L.popup({
maxWidth: 250,
minWidth: 100,
autoClose: false,
closeOnClick: false,
className: 'running-popup',
})
)
.setPopupContent('跑步')
.openPopup();
});
● 下面,当表单输入为骑行的时候将锻炼配置改变为骑行海拔。
● 这样在HTML里面也写好了,同样,这个也是隐藏类
● 其实这个实现非常的简单,我们只需要在监听事件监听到选择改变的时候,改变一下隐藏类就行了,实际我们只需要确保这两个必须保持有一个有隐藏类
inputType.addEventListener('change', function () {
//改变的时候判断是否存在隐藏类,有就去除,没有就添加
inputElevation.closest('.form__row').classList.toggle('form__row--hidden');
inputCadence.closest('.form__row').classList.toggle('form__row--hidden');
});
这还没有写多少的功能,我们似乎发现我们的代码已经非常的乱了,下篇文章我们需要提前考虑一下我们的项目架构,以便我们可以更换的规划我们的代码,使得代码的管理更加的好;