Оформить скрипт
Здравствуйте.Написал скрипт, спасибо за помощь laimas, можно как то по другому его "оформить", а то как то не красиво. Скрипт состоит из нескольких запросов.Вот два для примера
$('select[name="brend"]').change(function() {
var data = this.name + '=' + this.value;
var index = this.options.selectedIndex;
var id = this.options[index].text;
sessionStorage.setItem('type_title', id);
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
data: data,
success:function(data){
$('#bod').html(data);
}
})
});
$('select[name="mark"]').change(function() {
var data = this.name + '=' + this.value;
var index = this.options.selectedIndex;
var id = this.options[index].text;
sessionStorage.setItem('model_title', id);
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
data: data,
success:function(data){
$('#brn').html(data);
}
})
});
Может можно повторения как то систематизировать, что ли? |
Слишком много одинаковых HTTP запросов на сервер. Почему результаты не кэшируются?
|
ureech,
В select`ы добавить класс и атрибуты data- (http://htmlbook.ru/blog/atribut-data) (можно и без класса, только атрибуты data-, в т.ч. и общий для группы селектов вместо класса) В этих атрибутах задавать имя хранимого параметра, id размещения результата и т.п., например: <select data-class="group" data-name="type_title" data-resid="#bod"> При таких атрибутах для всех селектов с data-class="group" легко пишется одна универсальная функция запроса. |
Dilettante_Pro,OK, спасибо.Буду разбираться.
Цитата:
|
Цитата:
Выбрал в селекте значение A => запрос к серверу Выбрал в селекте значение B => запрос к серверу Выбрал в селекте опять значение A => опять запрос к серверу? Зачем последняя операция, если был выбор на первом шаге и её можно в каком-нибудь буфере сохранить и отдавать клиенту? |
Решил кешировать первый запрос. Переписал ф-цию так
$(function() {
var cache
callback = function (data) {
$('#brn').html(data);
};
$('select[name="mark"]').change(function() {
var data = this.name + '=' + this.value;
if (cache) {
callback(cache);
} else {
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
dataType:"html",
data: data,
cache:true,
success: function(data) {
cache = data;
callback(cache);
}
})
}
});
});
Но что то не хочет кешировать, что нужно поправить? |
Цитата:
Идея такая: Пусть на этапе инициализации cache = []. Считали значение из select[name="mark"] (например, номер опции). Номер есть в массиве cache? Достали по номеру инфу записали в #brn. Иначе выполнили HTTP запрос и в функции обратного вызова success записали инфу по номеру в массив и в #brn. И вот таким образом создается разреженный массив, который позволяет уменьшить нагрузку на сервер, да и клиенту не придется ждать, пока придет ответ с сервера, если он есть в кэше. А если есть желание, лучше юзать фичи Set/Map в ES6. Скажем в Set номера опций, а в Map - отображение их в данные. |
ОК, понял, сенкс.
|
Сделал так
$('select[name="mark"]').change(function() {
var cache =[];
var data = this.name + '=' + this.value;
if(cache[data]){
$('#brn').html(cache[data]);
//alert('11111111')
} else {
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
dataType:"html",
data: data,
success: function(data) {
$('#brn').html(data);
cache[data] = data;
// alert(cache[data])
}
})
}
});
Но не кеширует. |
потому что массив cache всегда пустой. Да и 15 строчка весьма странная, учитывая что в js нет ассоциативных массивов.
|
Блин, не выходит.Как не изголяюсь , либо ошибка, либо не кешерует.
$(function() {
var cache =[];
var url = "/modules/mod_search_auto/ajax.php";
$('select[name="mark"]').change(function() {
var m_id = this.name + '=' + this.value;
if(cache=[data]){$('#brn').html(cache);}
else{
$.ajax({
type:"POST",
url:url,
data: m_id,
success:function(data){
cache = [data];
$('#brn').html(cache);
// }
}
})
}
});
})
|
так и не смог добиться кеширования. Может кто подскажет почему.Последний вариант такой.
var cache=[];
$(function(data) {
var url = "/modules/mod_search_auto/ajax.php";
var cacheData = cache[data];
$('select[name="mark"]').change(function() {
// var cacheData = cache[data]; пробовал и сюда ставить
var mid = this.name + '=' + this.value;
if(cacheData){
$('#brn').html(cacheData);
}else{
$.ajax({
type:"POST",
url:url,
data: mid,
success:function(data){
$('#brn').html(data);
cache[data] = data;
}
})
}
})
})
|
Вернемся к варианту пост#9 (потому что последний - действительно... последний)
Цитата:
Потом, мне кажется, вы запутались с переменными data: data в строках 3 - 12 и в строках 13-16 - это разные переменные, Первая - это значение, которое вы берете из html и передаете в запросе на сервер. (но не проверяли кеш на ее наличие и не запомнили в кеш ). Вторая - определяется в строке 13 как параметр функции и представляет ответ сервера (что там - я, например, не знаю). Поэтому строка 15 cache[data] = data; - что это значит? Эту переменную, во избежание путаницы, лучше обозвать по-другому. С учетом вышеизложенного можете попробовать снова. В разных ваших вариантах есть отдельные правильные мысли, но они перемешаны с ошибками |
ureech,
(function(){
var cache ={};
$('select[name="mark"]').change(function() {
var data0 = this.name + '=' + this.value;
if(cache[data0]){
$('#brn').html(cache[data0]);
} else {
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
dataType:"html",
data: data0,
success: function(response) {
$('#brn').html(response);
cache[data0] = response;
// alert(cache[data0])
}
});
}
});
})();
|
Ни хрена не хочет, по разному пробовал и как Alex_63, написал тоже. Может где запрет на кеширование, в заголовках ответа
Cache-control:no-cache... Pragma:"no-cache" Это результат или причина? |
Цитата:
<option id='Vulcan' value='1002' >Vulcan</option><option id='Rapide S' value='1002' >Rapide S</option> |
Цитата:
Cache-control:no-cache... Pragma:"no-cache" здесь совершенно ни при чем - ваш кеш - совсем не кеш, а просто переменная типа массив. Вариант Alex_63 почти правильный, он устранил все ошибки, за исключением одной:
var data0 = this.name + '=' + this.value;
if(cache[data0]){
Индекс массива - это целое число, начиная с 0. В качестве индекса вам нужно использовать целые числа, однозначно связанные с парой this.name this.value. Пример реализации такой индексации пар this.name this.value
<head>
<title>Untitled Page</title>
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
window.onload = function () {
$('select').change(function () {
alert($(this).data("ind") + $(this)[0].selectedIndex);
});
}
</script>
<body>
mark
<select data-ind="100" name="mark">
<option >Выберите вариант</option>
<option value="11">первый</option>
<option value="22">второй</option>
<option value="33">третий</option>
<option value="44">четвертый</option>
</select>
<br />
brend
<select data-ind="200" name="brend">
<option >Выберите вариант</option>
<option value="11">первый</option>
<option value="22">второй</option>
<option value="33">третий</option>
<option value="44">четвертый</option>
</select>
</body>
</html>
|
Блин,слва Богу и Dilettante_Pro, добил, эти массивы.
$(function() {
var url = "/modules/mod_search_auto/ajax.php";
var cache ={};
$('select[name="mark"]').change(function() {
var data = this.name + '=' + this.value;
var index = this.options.selectedIndex;
if(cache[index]){
$('#brn').html(cache[index]);
}else{
$.ajax({
type:"POST",
url:url,
data: data,
success:function(response){
$('#brn').html(response);
cache[index] = response;
}
})
}
})
Всем спасибо :) |
ureech,
В таком варианте var index = this.options.selectedIndex; нужен отдельный кеш для каждого селекта а в варианте из пост№17 var index = $(this).data("ind") + $(this)[0].selectedIndex - один кеш для всех |
Понял, поправлю.
|
ureech,
(function(){
var cache ={};
$('select[name="mark"]').change(function() {
var data0 = this.name + '=' + this.selectedIndex.value;
if(cache[data0]){
$('#brn').html(cache[data0]);
} else {
$.ajax({
type:"POST",
url:"/modules/mod_search_auto/ajax.php",
dataType:"html",
data: data0,
success: function(response) {
$('#brn').html(response);
cache[data0] = response;
// alert(cache[data0])
}
});
}
});
})();
|
Alex_63,
Спасибо, за желание помочь, но твой вариант не работает, у меня по крайней мере.:) |
| Часовой пояс GMT +3, время: 21:31. |