Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.02.2016, 09:13
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Уменьшить размер кода и работа setInterval.
Добрый день, делаю запросы серверу он отвечает в формате json, (значение температуры и статус(норма/авария)).
Далее это отображаю в div (на картинке svg)
И в случае аварии надо сделать мигание текста.
Так как про объекты и классы мало что знаю код получился такой:
GetSettingTimeout3('GetVar.CGI',CYCLIC,function () {
			var objJSON = eval('(' + this + ')');

			var TempHot = document.getElementById("IdT_Hot");
			var TextStatusT_Hot = document.getElementById("Id_StatusT_Hot");			
			//--------------------------------------------------------------------------------------
			TempHot.innerHTML="Т горячая="+objJSON.T_Hot+" \u2103";
			//--------------------------------------------------------------------------------------
			clearInterval(TimerID_blink[0]);
			if(objJSON.T_ST_Hot==0){	//Статус температуры 
				TempHot.setAttribute("fill",RGB_STATUS_NORM); //зеленый
				TextStatusT_Hot.setAttribute("fill",RGB_STATUS_NORM); //зеленый
				TextStatusT_Hot.innerHTML="Норма";
			}
			if(objJSON.T_ST_Hot==1){	//Статус температуры 
				TempHot.setAttribute("fill",RGB_STATUS_ADMONITION); //желтый				
				TextStatusT_Hot.setAttribute("fill",RGB_STATUS_ADMONITION); //желтый				
				TextStatusT_Hot.innerHTML="Норма";
			}
			if(objJSON.T_ST_Hot==2){	//Статус температуры 
				TimerID_blink[0]=setInterval(TextBlink,300);		 
			}

}



var ModeBlink=0;
function TextBlink(){
	var TempHot = document.getElementById("IdT_Hot");
	var TextStatusT_Hot = document.getElementById("Id_StatusT_Hot");
	if(ModeBlink==0){
		//-------------------------------
		TempHot.innerHTML="Т горячая="+"80"+" \u2103";
		TempHot.setAttribute("fill",RGB_STATUS_ERROR); //Красный
		TextStatusT_Hot.setAttribute("fill",RGB_STATUS_ERROR); //Красный
		TextStatusT_Hot.innerHTML="Авария";		
		//-------------------------------
		ModeBlink=1;
	}else{
		//-------------------------------
		TempHot.innerHTML=""
		TextStatusT_Hot.innerHTML="";		
		//-------------------------------
		ModeBlink=0;
	}
}


И тут возникает 3 вопроса:
1) Во что это можно завернуть это всё что бы применить к другим принимаемым данным.
2) Правильно ли я использую setInterval ? (не будет ли происходит накопление, и в следствии чего при изменении статуса аварии в норму мигание не остановится)
3) Как сделать асинхронную функцию TextBlink. Что бы можно было использовать в остальных авариях. И мигание происходило везде по своему таймеру.


Ps: Всего параметров около 10, и для каждого городить такой код не вариант, так как сильно увеличится размер файла, что для меня очень критично.

Последний раз редактировалось pokk, 09.02.2016 в 09:15.
Ответить с цитированием
  #2 (permalink)  
Старый 09.02.2016, 11:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

pokk,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">


</head>

<body>
<svg height="30" width="200">
   <text id="IdT_Hot" x="0" y="15" fill="#00FF00"></text>
   <text id="Id_StatusT_Hot" x="0" y="30" fill="#00FF00"></text>
</svg>


 <script>
function TextBlink(arr) {
    var b = true;
    return function() {
        arr.forEach(function(item) {
            item.el.textContent = b ? item.text : "";
            item.el.setAttribute("fill", RGB_STATUS_ERROR);
        });
        b = !b

    }
}
var TempHot = document.getElementById("IdT_Hot");
var TextStatusT_Hot = document.getElementById("Id_StatusT_Hot");
var RGB_STATUS_ERROR = "#FF0000";
var arr = [{
    el: TempHot,
    text: "Т горячая=" + "80" + " \u2103"
}, {
    el: TextStatusT_Hot,
    text: "Авария"
}]
var fn = TextBlink(arr)
setInterval(fn, 300);

 </script>
</body>

</html>
Ответить с цитированием
  #3 (permalink)  
Старый 09.02.2016, 11:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от pokk
if(objJSON.T_ST_Hot==2){ //Статус температуры 21 TimerID_blink[0]=setInterval(TextBlink,300); 22 }
вместо этого можно заполнять массив для блинкера и после всего цикла запускать 1 интервал всего, вначале цикла естественно массив и интервал обнулять
Ответить с цитированием
  #4 (permalink)  
Старый 09.02.2016, 11:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

pokk,
if (objJSON.T_ST_Hot == 2) { //Статус температуры
	    arr.push({
	        el: TempHot,
	        text: "Т горячая=" + "80" + " \u2103"
	    }, {
	        el: TextStatusT_Hot,
	        text: "Авария"
	    })
	}
Ответить с цитированием
  #5 (permalink)  
Старый 09.02.2016, 11:55
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Т.е имеете ввиду, что сначала пройтись по все параметрам найти те которые в аварии, из них собрать массив и запустить его на мигание?
А как быть с
if(objJSON.T_ST_Hot==0){...
if(objJSON.T_ST_Hot==1){...
if(objJSON.T_ST_Hot==2){...

Их можно куда нибудь завернуть в класс, объект и после применять его ко всем последующим параметрам?
Ответить с цитированием
  #6 (permalink)  
Старый 09.02.2016, 12:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

pokk,
параметры это тоже температура? какая структура objJSON и svg
Ответить с цитированием
  #7 (permalink)  
Старый 09.02.2016, 15:35
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

4 температуры пару статусов и пару других параметров (аналогичных температуре)
Ответить с цитированием
  #8 (permalink)  
Старый 09.02.2016, 15:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

pokk,
не зная вашей структуры могу только предложить это
if (objJSON.T_ST_Hot == 2) arr.push({
    el: TempHot,
    text: "Т горячая=" + "80" + " \u2103"
}, {
    el: TextStatusT_Hot,
    text: "Авария"
});
else {
    TempHot.setAttribute("fill", [RGB_STATUS_NORM, RGB_STATUS_ADMONITION][objJSON.T_ST_Hot]);
    TextStatusT_Hot.setAttribute("fill", [RGB_STATUS_NORM, RGB_STATUS_ADMONITION][objJSON.T_ST_Hot]);
    TextStatusT_Hot.innerHTML = "Норма"
};
Ответить с цитированием
  #9 (permalink)  
Старый 09.02.2016, 16:36
Кандидат Javascript-наук
Отправить личное сообщение для pokk Посмотреть профиль Найти все сообщения от pokk
 
Регистрация: 30.01.2014
Сообщений: 145

Возможно я выбрал не очень удачную структуру objJSON
Она примерно такая(пишу по памяти с названием могу наврать)
{
T_Hot:XX,  // Значение температуры 
T_ST_Hot:X, // Статус
T_Cold:XX, //Значение 
T_ST_Cold:XX,  //Статус
T_Out:XX,
T_ST_Out:XX,
//----------------------
StatusPump1:X,  // 0/1
StatusPump2:X,  // 0/1
//----------------------
ModeFan:X // Режим 1,2,3,выкл 
}

Изначально температуру хотел передавать в виде массива (значение,статус), но потом отказался от этой затеи ввиду того что можно напутать с порядком температуры в массиве и отобразить не туда. По этому каждому значению присвоил имя, что бы было сложее ошибиться, и теперь это вылазеет боком так как не нельзя(или можно?) прокрутить в цикле принимаемые значения.

а svg, рисуется отдельно в Openoffice и потом руками добавляю id в нужные места для вывода.
Ответить с цитированием
  #10 (permalink)  
Старый 09.02.2016, 18:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

svg вывод показаний датчиков
pokk,
<!DOCTYPE HTML>

<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
        body {
            background-color: #D3D3D3;
        }
    </style>
</head>

<body>
    <svg height="45" width="200" class="Hot">
        <text class="title" x="0" y="15" fill="#00FF00"></text>
        <text class="value" x="0" y="30" fill="#00FF00"></text>
        <text class="status" x="0" y="45" fill="#00FF00"></text>
    </svg>
    <svg height="45" width="200" class="Cold">
        <text class="title" x="0" y="15" fill="#00FF00"></text>
        <text class="value" x="0" y="30" fill="#00FF00"></text>
        <text class="status" x="0" y="45" fill="#00FF00"></text>
    </svg>
    <svg height="45" width="200" class="Pump">
        <text class="title" x="0" y="15" fill="#00FF00"></text>
        <text class="value" x="0" y="30" fill="#00FF00"></text>
        <text class="status" x="0" y="45" fill="#00FF00"></text>
    </svg>
    <svg height="45" width="200" class="Fan">
        <text class="title" x="0" y="15" fill="#00FF00"></text>
        <text class="value" x="0" y="30" fill="#00FF00"></text>
        <text class="status" x="0" y="45" fill="#00FF00"></text>
    </svg>
    <script>
        function TextBlink(arr) {
            var b = true;
            return function() {
                arr.forEach(function(el) {
                    el.style.visibility = b ? "hidden" : "visible";
                });
                b = !b

            }
        }
        var timer;

        var data = {
            Hot: {
                title: "Т горячая",
                value: 120 + " \u2103",
                status: "Авария",
                blink: true,
                color: "#FF0000"
            },
            Cold: {
                title: "Т холодная",
                value: 40 + " \u2103",
                status: "Норма",
                blink: false,
                color: "#008000"
            },
            Pump: {
                title: "Pump",
                value: 0,
                status: "",
                blink: false,
                color: "#000000"
            },
            Fan: {
                title: "Вентилятор",
                value: 0,
                status: "",
                blink: false,
                color: "#000000"
            }
        }

        function foo(data) {
            var arr = [];
            clearInterval(timer);
            Object.keys(data).forEach(function(key) {
                var el = document.querySelector('.' + key);
                el.style.visibility = "visible";
                ['title', 'value', 'status'].forEach(function(item) {
                    var txt = el.querySelector('.' + item)
                    txt.textContent = data[key][item];
                    txt.setAttribute("fill", data[key]["color"]);
                });
                data[key]["blink"] && arr.push(el);
            });

            timer = setInterval(TextBlink(arr), 300);
        }
        foo(data)
        data = {
            Hot: {
                title: "Т горячая",
                value: 99 + " \u2103",
                status: "Норма",
                blink: false,
                color: "#008000"
            },
            Cold: {
                title: "Т холодная",
                value: 70 + " \u2103",
                status: "Норма",
                blink: false,
                color: "#FFFF00"
            },
            Pump: {
                title: "Pump",
                value: 0,
                status: "",
                blink: false,
                color: "#000000"
            },
            Fan: {
                title: "Вентилятор",
                value: 0,
                status: "",
                blink: false,
                color: "#000000"
            }
        }
        window.setTimeout(function() {
            foo(data) //пришли новые данные
        }, 3000)
    </script>
</body>

</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как уменьшить размер изображения с помощью JS? Dimaz Javascript под браузер 27 22.04.2015 00:26
Не останавливается работа setInterval saves7 Общие вопросы Javascript 8 30.04.2014 18:04
Уменьшить размер скрипта nurik2120 Элементы интерфейса 18 15.04.2013 17:28
Как уменьшить размер фотографии при выводе??? PAMAC Серверные языки и технологии 4 24.08.2010 19:37
Непонятная работа setInterval alekson Общие вопросы Javascript 3 23.12.2008 18:14