Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Оформить скрипт (https://javascript.ru/forum/dom-window/62171-oformit-skript.html)

ureech 28.03.2016 08:59

Оформить скрипт
 
Здравствуйте.Написал скрипт, спасибо за помощь 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);
               			
              }
         })

    });

Может можно повторения как то систематизировать, что ли?

destus 28.03.2016 09:36

Слишком много одинаковых HTTP запросов на сервер. Почему результаты не кэшируются?

Dilettante_Pro 28.03.2016 10:30

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" легко пишется одна универсальная функция запроса.

ureech 28.03.2016 11:49

Dilettante_Pro,OK, спасибо.Буду разбираться.

Цитата:

Сообщение от destus
Слишком много одинаковых HTTP запросов на сервер. Почему результаты не кэшируются?

Только адрес одинаковый, но там разные параметры передаются и обрабтываются по разному.

destus 28.03.2016 11:55

Цитата:

Только адрес одинаковый, но там разные параметры передаются и обрабтываются по разному.
Вы меня не поняли. Допустим у вас в селекте 200 значений. В вашем случае при каждом изменении селекта будет запрос к серверу.

Выбрал в селекте значение A => запрос к серверу
Выбрал в селекте значение B => запрос к серверу
Выбрал в селекте опять значение A => опять запрос к серверу?

Зачем последняя операция, если был выбор на первом шаге и её можно в каком-нибудь буфере сохранить и отдавать клиенту?

ureech 28.03.2016 19:50

Решил кешировать первый запрос. Переписал ф-цию так

$(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); 
        }

         })
	}
    });
 });

Но что то не хочет кешировать, что нужно поправить?

destus 28.03.2016 20:12

Цитата:

что нужно поправить?
Да много всего. Почему переменная callback создается в глобальном пространстве? Зачем строка 16?

Идея такая: Пусть на этапе инициализации cache = []. Считали значение из select[name="mark"] (например, номер опции).
Номер есть в массиве cache? Достали по номеру инфу записали в #brn. Иначе выполнили HTTP запрос и в функции обратного вызова success записали инфу по номеру в массив и в #brn.

И вот таким образом создается разреженный массив, который позволяет уменьшить нагрузку на сервер, да и клиенту не придется ждать, пока придет ответ с сервера, если он есть в кэше. А если есть желание, лучше юзать фичи Set/Map в ES6. Скажем в Set номера опций, а в Map - отображение их в данные.

ureech 28.03.2016 20:44

ОК, понял, сенкс.

ureech 28.03.2016 21:55

Сделал так
$('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])
           }
         })
	   }		 
    });

Но не кеширует.

destus 28.03.2016 22:27

потому что массив cache всегда пустой. Да и 15 строчка весьма странная, учитывая что в js нет ассоциативных массивов.

ureech 29.03.2016 08:57

Блин, не выходит.Как не изголяюсь , либо ошибка, либо не кешерует.
$(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);
               			
            //  }
            }
		 })
		 }
    });
})

ureech 29.03.2016 12:48

так и не смог добиться кеширования. Может кто подскажет почему.Последний вариант такой.
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;
				 
            }
		 })
		 }
    })
})

Dilettante_Pro 29.03.2016 18:01

Вернемся к варианту пост#9 (потому что последний - действительно... последний)
Цитата:

Сообщение от ureech (Сообщение 412329)
Сделал так
$('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])
           }
         })
	   }		 
    });

Но не кеширует.

Чтобы кеш все помнил, его определение var cache =[]; нужно вынести на глобальный уровень (как в последнем варианте:) )
Потом, мне кажется, вы запутались с переменными data:
data в строках 3 - 12 и в строках 13-16 - это разные переменные,
Первая - это значение, которое вы берете из html и передаете в запросе на сервер. (но не проверяли кеш на ее наличие и не запомнили в кеш ).
Вторая - определяется в строке 13 как параметр функции и представляет ответ сервера (что там - я, например, не знаю).
Поэтому строка 15
cache[data] = data;
- что это значит?
Эту переменную, во избежание путаницы, лучше обозвать по-другому.

С учетом вышеизложенного можете попробовать снова. В разных ваших вариантах есть отдельные правильные мысли, но они перемешаны с ошибками

Alex_63 29.03.2016 18:39

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])
              }
           });
         }		 
  });
})();

ureech 29.03.2016 21:45

Ни хрена не хочет, по разному пробовал и как Alex_63, написал тоже. Может где запрет на кеширование, в заголовках ответа
Cache-control:no-cache...
Pragma:"no-cache"
Это результат или причина?

ureech 29.03.2016 21:50

Цитата:

Сообщение от Dilettante_Pro
Вторая - определяется в строке 13 как параметр функции и представляет ответ сервера (что там - я, например, не знаю)

В ответе строка, html код
<option id='Vulcan' value='1002' >Vulcan</option><option id='Rapide S' value='1002' >Rapide S</option>

Dilettante_Pro 30.03.2016 10:13

Цитата:

Сообщение от ureech (Сообщение 412394)
Ни хрена не хочет, по разному пробовал и как Alex_63, написал тоже. Может где запрет на кеширование, в заголовках ответа
Cache-control:no-cache...
Pragma:"no-cache"
Это результат или причина?

ureech,
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>

ureech 30.03.2016 13:36

Блин,слва Богу и 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;
            }
		 })
}		 
    })

Всем спасибо :)

Dilettante_Pro 30.03.2016 14:07

ureech,
В таком варианте
var index = this.options.selectedIndex;
нужен отдельный кеш для каждого селекта
а в варианте из пост№17
var index = $(this).data("ind") + $(this)[0].selectedIndex
- один кеш для всех

ureech 30.03.2016 14:13

Понял, поправлю.

Alex_63 30.03.2016 18:04

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])
              }
           });
         }		 
  });
})();

ureech 30.03.2016 19:55

Alex_63,
Спасибо, за желание помочь, но твой вариант не работает, у меня по крайней мере.:)


Часовой пояс GMT +3, время: 11:51.