Прелоадер пока выполняется скрипт
Добрый день!
Есть сайт с поиском дилеров. Пользователь выбирает параметры, жмет "поиск" и на страницу выгружается список дилеров, соответствующих заданным параметрам. Выгрузка занимает немалое время, поэтому нужно повесить прелоадер. Код формы поиска:
<form name="search" method="get" onsubmit="return (this.q.value == '') ? false : true;" action="/">
<div class="corvax-col3">
<label>Страна:</label>
<select id="countrySelect">
<?
$arFilter = Array(
"IBLOCK_ID"=>1,
"ACTIVE"=>"Y",
);
$arSelect = Array(
"IBLOCK_ID",
"ID",
"NAME",
);
$request = CIBlockElement::GetList(
array("SORT"=>"ASC"),
$arFilter,
false,
false,
$arSelect
);
while($ob = $request->GetNext()):
?>
<option value="<?=$ob['ID']?>"><?=$ob['NAME']?></option>
<?endwhile;?>
</select>
</div>
<div class="corvax-col3">
<label>Регион:</label>
<select id="citySelect">
<option value="0">Любой</option>
</select>
</div>
<div class="corvax-col3">
<label>Город:</label>
<input id="pac-input" class="controls" type="text" placeholder="Введите название города">
</div>
<div class="corvax-col3">
<label>Радиус:</label>
<select id="rad_range">
<option value="20">20км</option>
<option value="50">50км</option>
<option value="100">100км</option>
<option value="150">150км</option>
<option value="200">200км</option>
<option value="250">250км</option>
<option value="500">500км</option>
</select>
</div>
<div class="clearfix"></div>
<div class="corvax-col3 pad-top-col">
<label>Тип:</label>
<select id="typeSelect">
<option value="0">Любой</option>
<?
$arFilter = Array(
"IBLOCK_ID"=>3,
"ACTIVE"=>"Y",
);
$arSelect = Array(
"IBLOCK_ID",
"ID",
"NAME",
);
$request = CIBlockSection::GetList(
array("SORT"=>"ASC"),
$arFilter,
false,
$arSelect,
false
);
while($ob = $request->GetNext()):
?>
<option value="<?=$ob['ID']?>"><?=$ob['NAME']?></option>
<?endwhile;?>
</select>
</div>
<div class="corvax-col8 pad-top-col">
<label>Товар/услуги:</label>
<div class="multiselect">
<div class="selectBox">
<select id="categorySelect" disabled>
<option value="0">Любой</option>
</select>
<div class="overSelect"></div>
</div>
<div id="checkboxes">
</div>
</div>
</div>
<script>
var expanded = false;
$('.selectBox').click(function(){
if($('#categorySelect').prop('disabled')) {
expanded = true;
}
var checkboxes = document.getElementById("checkboxes");
if (!expanded) {
checkboxes.style.display = "block";
expanded = true;
} else {
checkboxes.style.display = "none";
expanded = false;
}
});
$('#checkboxes').click(function(){
var result = [];
$('#checkboxes input[type=checkbox]').each(function(indx, element){
if($(element).prop("checked")) {
result.push($(element).val());
}
});
if(result.length == 0)
$('#categorySelect option').html('Любая');
else
$('#categorySelect option').html('Выбранные');
});
$(document).mouseup(function (e) {
var elem = $('#checkboxes');
if ($(e.target).hasClass('overSelect')){ } else { expanded = false;}
if (e.target != elem[0] && !elem.has(e.target).length){
elem.hide();
} else { expanded = true;}
});
$('form[name=search]').click(function(e){
if(e.target.id == 'resetSearchForm') {
$('#categorySelect').prop('disabled', 'disabled');
expanded = false;
$('#categorySelect option').html('Любая');
}
});
</script>
<style>
#categorySelect, .multiselect, .selectBox {
max-width: 100%;
width: 95%;
}
#pac-input {
width: 178px;
}
.pad-top-col {
padding-top: 10px;
}
.corvax-col8 {
width: 75%;
float: left;
}
.selectBox {
position: relative;
}
.overSelect {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
}
#checkboxes {
display: none;
border: 1px #1e90ff solid;
background-color: white;
position: absolute;
z-index: 100;
height: 83px;
width: 619px;
overflow-y: scroll;
}
#checkboxes label {
display: block;
font-size: 11px;
padding-left: 7px;
padding-right: 10px;
margin-right: 0px;
}
#checkboxes label input {
margin-left: 0px;
}
#checkboxes label:hover {
background-color: #1e90ff;
}
</style>
<div class="corvax-dealer-buttons">
<button type="button" onclick="searchLocations(false)">Показать</button>
<button type="reset" id="resetSearchForm">Сбросить</button>
</div>
</form>
</div>
Можно ли повесить прелоадер на событие онклик: searchLocations ? |
Вот часть скрипта, которая по моему мнению имеет отношение к проблеме:
if(!dealers.length){
$.getJSON("/include/data.php", {
lat: map.getCenter().lat(),
lng : map.getCenter().lng(),
radius: radius,
type: $('#typeSelect').val(),
category: categorySelect
}, function(json){
dealers = json;
if (json == null) {
$("#sidebar").html('Ничего не найдено.');
$('#numberFoundDealers').text('(Найдено: 0)');
return;
}
var counter = 0;
for (i = 0; i < json.length; i++) {
category_count = 0;
if(json[i].lat == null || json[i].lng == null){
continue;
}
var point = new google.maps.LatLng(json[i].lat, json[i].lng);
// console.log("karta sol`");
if(distHaversine(point, center) < radius && fromUser == true){
}else{
if(fromUser == true){continue};
}
if(json[i].country != cur_country && fromUser == false && frommap == false){
continue;
}
if (distHaversine(point, center) < radius || ($('#citySelect').val() == "0" && frommap == false)) {
var canUse = 1;
if(categorySelect[0] != "0")
{
canUse = 0;
for(var j in json[i].categories){
for(var n in categorySelect){
if(json[i].categories[j] == categorySelect[n]){
category_count++;
}
}
if(category_count == categorySelect.length){
canUse = 1;
category_count = 0;
}
}
}
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
json[i].distance = calculateTheDistance(json[i].lat,json[i].lng,map.getCenter().lat(),map.getCenter().lng());
}
if(!canUse)
continue;
canUse = 1;
if(parseInt($('#typeSelect').val()))
{
canUse = 0;
for(j in json[i].types)
if(json[i].types[j] == $('#typeSelect').val())
canUse = 1;
}
if(!canUse)
continue;
counter++;
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
dealers[i].point = point;
locdata.push(json[i]);
}else{
dealers[i].point = point;
locdata.push(json[i]);
//createMarker(point, dealers[i]);
}
}
}
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
locdata.sort(function(a,b){
if(parseFloat(a.distance) < parseFloat(b.distance))
return -1;
if(parseFloat(a.distance) > parseFloat(b.distance))
return 1;
return 0;
});
}
if($('#typeSelect').val()== "2"){
if(locdata.length > 1){
locdata = bdcsort(locdata);
}
}
$.each(locdata,function(_,val){
if(val){
createMarker(val.point, val);
}
});
$('#numberFoundDealers').text('(Найдено: ' + counter + ')');
$("#sidebar").append(side_bar_html);
});
}
if(dealers.length)
{
var counter = 0;
for (i = 0; i < dealers.length; i++) {
category_count = 0;
if(dealers[i].lat == null || dealers[i].lng == null){
continue;
}
var point = new google.maps.LatLng(dealers[i].lat, dealers[i].lng);
if(distHaversine(point, center) < radius && fromUser == true){
}else{
if(fromUser == true){continue};
}
if(dealers[i].country != cur_country && fromUser == false && frommap == false){
continue;
}
if (distHaversine(point, center) < radius || ($('#citySelect').val() == "0" && frommap == false)) {
var canUse = 1;
if(categorySelect[0] != "0")
{
canUse = 0;
for(var j in dealers[i].categories)
for(var n in categorySelect){
if(dealers[i].categories[j] == categorySelect[n]){
category_count++;
}
}
if(category_count == categorySelect.length){
canUse = 1;
category_count = 0;
}
}
if(dealers[i].distance){
delete dealers[i].distance;
}
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
dealers[i].distance = calculateTheDistance(dealers[i].lat,dealers[i].lng,map.getCenter().lat(),map.getCenter().lng());
}
if(!canUse)
continue;
canUse = 1;
if(parseInt($('#typeSelect').val()))
{
canUse = 0;
for(j in dealers[i].types)
if(dealers[i].types[j] == $('#typeSelect').val())
canUse = 1;
}
if(!canUse)
continue;
counter++;
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
dealers[i].point = point;
locdata.push(dealers[i]);
}else{
dealers[i].point = point;
locdata.push(dealers[i]);
//createMarker(point, dealers[i]);
}
}
}
if($('#citySelect').val() != "0" || frommap != false || fromUser == true){
locdata.sort(function(a,b){
if(parseFloat(a.distance) < parseFloat(b.distance))
return -1;
if(parseFloat(a.distance) > parseFloat(b.distance))
return 1;
return 0;
});
}
if($('#typeSelect').val()== "2"){
if(locdata.length > 1){
locdata = bdcsort(locdata);
}
}
$.each(locdata,function(_,val){
if(val){
createMarker(val.point, val);
}
});
$('#numberFoundDealers').text('(Найдено: ' + counter + ')');
$("#sidebar").append(side_bar_html);
}
}
sidebar - это область, в которой выводится список |
agr, вот это как раз тот случай, который показывает уровень знаний тех программистов, которые везде суют JQuery и без неё не могут обойтись. Зачем пытаться писать страницы, если нет основополагающих знаний? И уж тем более через JQuery! И сам ничего понимать не будешь, и другим очень сильно затруднишь понимание твоего скрипта. Или как ты думаешь - почему тебе никто не ответил? Более того ещё и пользователи будут вынуждены ждать загрузки страницы.
В русском языке также нет слова dealer'ы! Ведь не трудно же по-русски написать "Продавцы"? Надо изучить основы языка и тогда таких вопросов вообще не будет! В этом помогут последние 2 ссылки в моей подписи - это книги от Netscape (создателей JS). Вот как работают заставки при ожидании на чистом JS:
<html><head>
<style type="text/css">
#preloader
{
width:32px;
height:32px;
background:url('preloader.gif') no-repeat
}
</style>
<script type="text/javascript">
var httpRequest = getXmlHttp();
function getXmlHttp()
{
//...........
//return XMLHttpRequest
}
function searchLocations()
{
var p = document.getElementById('preloader');
//добавляем картинку ожидания:
p.style.display = 'block';
//отправляем AJAX запрос:
httpRequest.onreadystatechange = updateSidebar;
httpRequest.open('GET', url, true);
httpRequest.send('');
}
function updateSidebar()
{
try
{
if(httpRequest.readyState == 4)
{
if(httpRequest.status == 200)
document.getElementById('sidebar').innerHTML = httpRequest.responseText;
else
document.getElementById('sidebar').innerHTML = 'Возникли трудности при запросе.';
//убираем картинку ожидания:
var p = document.getElementById('preloader');
p.style.display = 'none'
}
}
catch (e)
{
console.log('Ошибка: ' + e.description)
}
}
</script>
</head><body>
<button type="button" onclick="searchLocations(false)">Показать</button>
<div id="preloader"></div>
</body></html>
|
| Часовой пояс GMT +3, время: 12:02. |