Ответы пользователя по тегу JavaScript
  • Как сделать из таких get параметров объект в Javascript?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    1. Делайте передачу данных только POST. Это безопасней и правильней.
    2. Передавайте данные как Base64.encode(Object.toJSON(data))

    Где Object.toJSON - это из библиотеки Prototype.js, в других библиотеках - свои переводчики

    Где Base64.encode - это:
    var Base64 = {
       _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
       //пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ base64 пїЅпїЅ javascript 
        encode : function (input) {
          var output = "";
          var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
          var i = 0
          input = Base64._utf8_encode(input);
             while (i < input.length) {
           chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
           enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
           if( isNaN(chr2) ) {
               enc3 = enc4 = 64;
            }else if( isNaN(chr3) ){
              enc4 = 64;
            }
           output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
         }
          return output;
        },
     
       //пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ base64 
        decode : function (input) {
          var output = "";
          var chr1, chr2, chr3;
          var enc1, enc2, enc3, enc4;
          var i = 0;
         input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
         while (i < input.length) {
           enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
           chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
           output = output + String.fromCharCode(chr1);
           if( enc3 != 64 ){
              output = output + String.fromCharCode(chr2);
            }
            if( enc4 != 64 ) {
              output = output + String.fromCharCode(chr3);
            }
       }
       output = Base64._utf8_decode(output);
         return output;
       },
       // пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ utf8 
        _utf8_encode : function (string) {
          string = string.replace(/\r\n/g,"\n");
          var utftext = "";
          for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
           if( c < 128 ){
              utftext += String.fromCharCode(c);
            }else if( (c > 127) && (c < 2048) ){
              utftext += String.fromCharCode((c >> 6) | 192);
              utftext += String.fromCharCode((c & 63) | 128);
            }else {
              utftext += String.fromCharCode((c >> 12) | 224);
              utftext += String.fromCharCode(((c >> 6) & 63) | 128);
              utftext += String.fromCharCode((c & 63) | 128);
            }
         }
          return utftext;
     
        },
     
        //пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ urf8 
        _utf8_decode : function (utftext) {
          var string = "";
          var i = 0;
          var c = c1 = c2 = 0;
          while( i < utftext.length ){
            c = utftext.charCodeAt(i);
           if (c < 128) {
              string += String.fromCharCode(c);
              i++;
            }else if( (c > 191) && (c < 224) ) {
              c2 = utftext.charCodeAt(i+1);
              string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
              i += 2;
            }else {
              c2 = utftext.charCodeAt(i+1);
              c3 = utftext.charCodeAt(i+2);
              string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
              i += 3;
            }
         }
         return string;
        }
     }


    3. На стороне PHP тупо конвертите обратно
    $myVal = json_decode(base64_decode(<!!! значениеиз переменной в POST запросе !!!>,true);
    Ответ написан
  • Поможет ли знание алгоритмов в решении типичных задач?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Что такое алгоритм? Это блок схема с правилами и условиями. Часто думают что алгоритм - это что-то страшное и связанное с высшей математикой, длинными формулами и кучей неизвестных. Вовсе нет! Алгоритм - это последовательность действия, которые ведут к какому-то результату.

    У вас есть задача, соответственно надо придумать как ее решить.

    Самый действенный способ, которым даже я пользуюсь, особенно когда у меня 10-ки условий и операций - это нарисовать блок схему и в ней ориентироваться что я хочу и как это реализовать.
    435bd24dad594f279b18ee293b1f353c.gif

    Когда такая блок схема есть, то потом дальше легче ориентироваться, я иногда пишу прям в коде

    /* пример выборки
    		 invoice_number | invoice_amount |           invoice_customer           |    invoice_date     |    date_check    | order_id | order_data_id | quantity | price |              item_uuid
    		----------------+----------------+--------------------------------------+---------------------+------------------+----------+---------------+----------+-------+--------------------------------------
    		 00000000073    |         493920 | bd63f5ba-55f1-11e5-5d98-0e459e882122 | 2017-03-02 01:51:35 |                  |     5110 |         10125 |        8 | 41160 | 76e80df8-5802-11e4-6686-0e459e882122
    		 00000000073    |         493920 | bd63f5ba-55f1-11e5-5d98-0e459e882122 | 2017-03-02 01:51:35 |                  |     5110 |         10124 |        4 | 41160 | bde6a7ce-32c2-11e2-92a8-c692850d4a80
    		 00000000073    |         493920 | bd63f5ba-55f1-11e5-5d98-0e459e882122 | 2017-03-02 01:51:35 |                  |     5110 |               |        1 |   111 | e6b5251c-feb3-11e6-ef88-26a4bef88324
    		 
    		 1.		Пользоваетель добавляет инвойс через сайт, соответствие позициций заказа сохраняется через order_data_id, а то что в инвойсе через item_uuid
    		 2.		Если в 1с кто-то удаляет позицию, то мы в базе также обязаны удалить запись и из invoice_data
    		 2.1		Алгоритм поиска записи:
    		 2.1.1			получаем из этого запроса все текущие позиции с item_uuid
    		 2.1.2.			ищем такую запись в массиве $invoice['Товары']. Если не найдено, то строку нужно удалить
    		 2.2		Процесс удаления:
    		 2.2.1			перед удалением нам надо изменить в таблице order_data стаус на  OrderState::CANCELED -> Отменен
    		 2.2.2			затем удалить запись из invoice_data, так как в инвойсе этой строки не существует
    		 3.		Если в 1с кто-то добавляет позицию, а в CMR такой позиции нет, то мы должны будем ее добавить в invoice_data
    		 3.1.		Добавляем запись без указания order_data_id. Это будет говорить о том, что в счете есть такая позиция, а в CRM она никуда не привязана
    		 3.2.		Необходимо в веб сокете передать эту информацию и на сторое JS сделать информирование и обработку этих данных
    		 4.		Необходимо сравнить все позиции и высчитать новые значения
    		 5.		Пустая выборка означает, что полученный счет никуда не привязан
    		*/


    Ну а реализация алгоритма - это уже инструментарий языка. И это уже нарабатывается с опытом.
    Ответ написан
    2 комментария
  • Почему функция ничего не возвращает?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    потому что AJAX - это асинхронный вызов - это раз
    getData() у вас всегда будет возвращать void значение. - это два

    нужен либо синхронный вызов, либо значение search передавать в другую функцию и там вешать хендлер, который обрабатывать данные.

    Можете вот так вот протестировать

    function getData() {
      console.log('1. вхождение в функцию');
      $.ajax({
        url: '../elem/search.php',
        type: 'POST',
        cache:false,
        success : function(search) {
          console.log('3. результат вызова');
          console.log(search);
          return search;
        }
      })
      console.log('2. выход из функции');
    }
    
    var data = getData();
    console.log(data);


    а вот добавив async: false - будет возвращаться результат

    function getData() {
      console.log('1. вхождение в функцию');
      var result;
      $.ajax({
        url: '../elem/search.php',
        type: 'POST',
        cache:false,
        async: false,
        success : function(search) {
          result = search;
          console.log('3. результат вызова');
          console.log(data);
        }
      })
      console.log('2. выход из функции');
      return result;
    }
    
    var data = getData();
    console.log(data);
    Ответ написан
    Комментировать
  • Почему гугл карты загружаются не сразу?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    а если так?

    document.observe
    (
    	"dom:loaded", 
    	function()
    	{
    		// put your code here
    	} 
    );
    Ответ написан
    5 комментариев
  • Как сделать push-уведомления на сайт самостоятельно?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    без сторонних сервисов - не получится.

    варианта два:

    1. periodical ajax. Но в этом случае пользователь может получить уведомление не сразу, а когда получит, может быть уже не актуально.

    2. WebSocket - моментальное уведомление. Но нужно поднимать свой Websocket демон.
    Ответ написан
    Комментировать
  • Как правильно проверять заполненность формы на Javascript?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Создаете массив, в которой указываете идентификаторы полей.
    Потом в цикле проверяете.

    Для радио - один массив, для селектов другой, для текстовых - третий.
    В случае ошибке в обработчике возвращать false и по ID подкрашивать поле через CSS.
    Ответ написан
    Комментировать
  • Как сделать подтверждение отправки формы?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    На кнопку сабмита повесить обработчик и проверять каждое поле формы

    Например вот так вот:

    function GoodsSave()
    {
    	if ($('Parent_Key').value == 0) {alert('Укажите группу номенклатуры'); return; }
    	if (!$('Artikul').value) {alert('Укажите артикул'); return; }
    	if (!$('Description').value) {alert('Укажите краткое наиименование'); return; }
    	if (!$('NaimenovaniePolnoe').value) {alert('Укажите полное наименование'); return; }
    	if ($('VidNomenklatury_Key').value == 0) {alert('Укажите вид номенклатуры'); return; }
    	if ($('BazovayaEdinicaIzmereniya_Key').value == 0) {alert('Укажите единицу измерения'); return; }
    	if ($('StavkaNDS_Key').value == 0) {alert('Укажите ставку НДС'); return; }
    	
    	new (Ajax.Request)
    	(
    		"/", 
    		{
    			method: "POST",
    			parameters: { 
    				'Driver1c' : '<?=Driver1c::ADD_GOODS?>', 
    				'Parent_Key' : $('Parent_Key').value,
    				'Artikul' : $('Artikul').value,
    				'Description' : $('Description').value,
    				'NaimenovaniePolnoe' : $('NaimenovaniePolnoe').value,
    				'VidNomenklatury_Key' : $('VidNomenklatury_Key').value,
    				'BazovayaEdinicaIzmereniya_Key' : $('BazovayaEdinicaIzmereniya_Key').value,
    				'StavkaNDS_Key' : $('StavkaNDS_Key').value
    			},
    			encoding: 'UTF-8',
    			onComplete: function (a) {
    				$('goods_add_form').reset();
    				
    				var row = a.responseJSON;
    				
    				Goods.push ({
    					value: row.value,
    					label: row.label,
    					description: row.description,
    					'СтавкаНДС_Key': row.СтавкаНДС_Key,
    					'БазоваяЕдиницаИзмерения_Key': row.БазоваяЕдиницаИзмерения_Key
    				});
    				
    				ProcessingInput.value = row.description;
    				ProcessingInput.referer.value = row.value;
    				ProcessingInput.referer.onchange();
    				
    				GoodsCancel();
    				
    			},  
    			onFailure: function (a) {alert('Во время работы произошла ошибка, пожалуйста сообщите администратору!');}
    		}
    	);
    }
    Ответ написан
    1 комментарий
  • Как правильно подключить JS?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    });

    последняя строка лишняя
    Ответ написан
  • Как сделать запоминание положения блока?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Запоминание куда и для чего?
    Для пользователя? Можно через cookie.
    Ответ написан
  • Нужна ли веб-программисту высшая математика?

    Falseclock
    @Falseclock
    решаю нестандартные задачи
    Я лет 20 назад начал делать свои собственные сайты. Сейчас делаю упор на разработку мобильных приложений. И вы знаете, мне сейчас не хватает математики не только для мобильных приложений но и для реализации некоторых возможностей CRM системы в моей компании. Быть веб программистом - не значит быть действительно программистом. Шаблонизация дает свои плоды. Но когда вы дорастете до фильтров Калмана, до собственных алгоритмов расчета поведения объектов в пространстве, или хотя бы реализовать через CSS и Javascript изменение общих параметров графических изображений (например сделать так, чтобы все img, которые имеют зеленый цвет превратить, перевести этот цвет в красный)- то поймете, что пора математику подтянуть. Моих знаний, полученных в университете хватило на 10 лет. Сейчас хочется учиться дальше.
    Ответ написан
    4 комментария