Ответы пользователя по тегу JavaScript
  • Как получить индекс родительского массива?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Тебе нужно запустить второй for и будут у тебя все элементы.
    Первый for перебирает коллекцию, второй фор - свойства.

    Если нужно узнать индекс свойства- твой .indexOf возвращает именно индекс элемента, а если его нет - возвращает -1.

    Если индекс элемента в коллекции - то ты уже пробегаешься for-ом, и он в var i лежит
    Ответ написан
    Комментировать
  • Как через jQuery заполнять progressbar в uikit?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Видишь прикол? Ты изучил технологию uikit, и теперь у тебя возникли новые вопросы.

    База прогрессбара в том, что это два обычных дива - один внешний, а один с заполнением, который ты двигаешь в зависимости от переменной, которая изменяется в реальном времени.

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

    Судя по твоему коду ты пытаешься в функции обработчике изменить переменную, которой в этой функции не задано. До этого ты писал код в которых объявлял переменную через name = 1; тем самым создавал ГЛОБАЛЬНУЮ переменную, существующую везде на странице.

    А uikit использует var name = 1; создавая ЛОКАЛЬНУЮ переменную, доступную внутри конкретной функции и ее потомков.

    В твоем случае обработка прогрессбара происходит с помощью другой функции, которая создана (функцию в js тоже можно "воспринимать как переменную") не в том же месте, где и переменная progressbar1, поэтому функция о ней не знает.

    Чтобы это обойти, есть пара вариантов:
    1) действительно менять через field, поскольку как ты видишь в эту функцию в field передается твой прогрессбар
    2) если тебя это смущает, то к вызову функции changeProgress ты можешь дописать changeProgress.call(null, progressbar1);

    Метод call ВЫЗЫВАЕТ функцию, подсовывая в нее то, о чем она не знала впереди того, что она знала. Твой changeProgress превратится в
    function changeProgress(progressbar1, field, typeOperation) { ... }

    и ты сможешь менять как привык

    В действительности же изучая новую технологию ты заставляешь себя ПРИВЫКНУТЬ к тому, как она работает, а не пытаться ее изменить. В этом и проблема несовершенной технологии - она поставляется бесплатно, далеко не факт что хорошо работает, и требует от тебя смирения и отсутствия в общем-то мозга - ты просто используешь готовое, как оно есть.

    Таким образом, еще раз, твою проблему решит:
    1) привыкание к тому что есть, ибо это технология
    2) изменение того что есть, но очень скоро ты поймешь, что количество внесенных изменений такое, что тебе проще было ее с нуля написать
    3) писать сразу с нуля и не париться, но потом понять, что заказчик не хочет тебе платить за то, что ты будешь "писать с нуля", потому что бизнес-тренера ему навешали лапши про "готовые решения", и тогда вернешься к пункту один и так по кругу

    Ищи наиболее удобную для себя позицию - писать с нуля и требовать денег или использовать готовое и не отвечать за результат. И то и другое сделает тебя виноватым в конце концов, а значит по законам современных юристов - должным твоему заказчику (есть например способ "все делать по договору" - это когда ты рассказываешь что типа все будет честно, а на самом деле в договоре указываешь пункт про свободную лицензию устанавливаемых модулей, и в суде ты такой достаешь козырь из кармана - я его предупреждал и не виноват, что он не знает, что такое бесплатная лицензия на готовое решение, just business, nothing more)

    Отсюда - ты выбираешь только заказчиков которые это понимают и с этим смирились понимая что ты единственный, кто может за это отвечать и потому тебя никогда не стоит делать дураком. К сожалению, почти все современные заказчики понимают, что ты не единственный, поэтому их суть работы таки доказать тебе, что ты им должен, а потом "работай и не проси прибавки, а то будет суд и заплатишь".

    Значит ли это, что на бизнес лучше не работать совсем? Для меня да. Но растить картошку и копать огород, а потом подсесть на очко от того что пришли морозы и весь урожай сдох - тоже так себе подход. Поэтому растишь в себе стержешь и будь готов кидать твоих заказчиков, как только они ведут себя "недостойно", потому что да, заказчик тоже не единственный. Другая крайность - "если бы не было бизнеса" приведет к другому уровню безработицы, когда ни один двоешник не сможет устроится на работу, им придется учится, а им лень, поэтому они начнут грабить посредь бела дня. Текущее решение обеспечивает отсутствие гражданской войны - двоешники - директора, умные - рабы. Умные не выйдут на площадь потому что умные, двоешники обманывают но не грабят, потому что есть возможность и никто не наказывает.

    * Не нужно много разбираться в технологиях, чтобы делать простые вещи, технологии испокон веков были средством управления людьми, поскольку мы больны тягой к неизвестному.
    Ответ написан
    4 комментария
  • Как передавать пароль от браузера серверу, как его хранить на сервере и проверять корректность?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    В зависимости от степени безопасности.

    Если разбить все это на "по-проще", общий принцип такой:

    Клиент:
    - в первый раз ввести строку текста
    - нажать отправить
    - больше не вводить, ибо лентяй, а мы ж ему продавать собрались, не дай бог он сука дискомфорт почувствует

    Сервер:
    - получить строку текста
    - сделать хеш
    - проверить - чей это хеш (не угнали ли его по дороге)
    - в ответ отправить токен, который будет работать ограниченное время только для этого компьютера
    - токен сохранить на компе пользователя, и следующий раз отправлять автоматически для каждого действия без ведома юзера
    - при каждом действии обновлять время хранения токена (некоторые особо шизанутые делают новый токен каждое действие)
    - при малейшем подозрении на несоответствие токена - предложение вежливо пройти через авторизацию еще раз, но поскольку человек существо забавное - если ему скажут опять пароль вводить - он сука обидится, и потому придумана "двухэтапная" - через телефон или там отпечаток пальца или что угодно еще, да и полезно это - если пароль действительно угнали - отрезать палец и вырвать глаз - это еще можно вместе сделать, а вот замочив человека - попросить его маму ввести пришедший из СМС-код - это уже придется шантажом заниматься.

    Локальных хранилищ тоже бывает куча целая:
    - кукисы (хранится прямо в браузере указанное время)
    - сессии (хранится на сервере, но в кукисах есть ключ к ячейке в "банке", который опять же могут угнать)
    - ... еще десятки способов, о которых знают только крутые кодеры, которые считают себя крутыми просто потому, что их знают, на деле с точки зрения создания ценности людям - бесполезные знания

    Как ты понимаешь, это иллюзия безопасности, а не гарантия.

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

    Вот еще тема, которую василий сказал - шифровать пароль уже на стороне клиента в момент отправки формы яваскриптом. Представьте себя хакером. Вы получили пакеты какого-то чувака, поставили компьютер на расшифровку, подключив десяток видеокарт, расшифровываете пароль, а вместо него видите 64 символьный хеш, ну то есть он прямо от клиента таким вышел. После этого будут маты от того, что теперь массив видюх нужно заставить еще и ключевую фразу из хеша выдрать. Ну то есть еще время декодирования увеличивается. Если загнаться то хеш может быть не просто хешем md5() а например md5 от md5 от развернутой строки прибавленной к md5() прямой строки, прокинутой через побитовый сдвиг на один разряд - ну то есть даже в этом закодировать последовательность действий. При отсутствии https - наиболее надежный способ.

    И потом - программисты Yii не рекомендуют использовать фунцию md5(). Почему? Потому что она быстрая очень. И при переборе пароля массивом видеокарт перебирается он шибко быстро. Поэтому рекомендуют использовать hash функцию, которая для создания хеша использует побольше времени, несколько секунд скажем. При написании синхронной программы (сайта на php, например) - это заставит юзера подождать после регистрации секунды 3-4 лишних, но если загнаться то процесс генерации пароля можно запихнуть в асинхронщину, а пользователю сразу токен выдать, то есть пароль ему сгенерируется чуть позже. Таким образом - за счет более длинной хеш-функции по времени хакеру потребуется куда больше времени - то есть юзеру на прямое создание пароля 5 секунд, а хакеру на перебор нескольких миллионов паролей понадобится несколько лет. Никто ему не заплатит 10 косарей баксов, чтобы сломать ваш долбанный пароль ВКонтакте. Если банковская сфера - опять же как писал выше - хеш от хеша, да развернуть пару раз, да трижды порубить, потом постучать в бубен и все это в хеш еще раз и вуаля - декодирование пароля займет 100 лет.

    Еще значит, При малейшем намеки на несоответствие токена или внезапное изменение - сервак говорит "тю, дядя, давайка пройди второй этап авторизации, а то я не верю, что это реально ты" и просит приложить палец. Или ввести номер, получив СМС. Или вставить ключ-карту синюю (duke nukem hello). Но и тут есть взлом - ключ карту украсть, смс-ку - попросить телефон, приложить палец = отрубить руку, вырвать глаз и тд

    Тут к тебе на помощь приходит https. Https это такая штука, которая в двух словах может быть названа игрой в партизан. На войне играли так - когда радиопереговоры прослушивались, а шифраторов не было - единственным средством защиты - было использовать ошибки в тексте и матерные слова.

    Так и тут - данные отправляемые в виде нулей и единиц. Компьютеры их так же легко перекодируют в пароль, как и закодировали. Чтобы этого не было, придумали ШИФРОВАТЬ строку в одну сторону. У сервака есть трафарет, у пользователя другой трафарет. Сервак шифрует своим, но назад можно расшифровать только пользовательским. Вернее можно и сторонним конечно, но современные компьютеры сделают это за много лет, и потому никто не заморачивается особо, производительность не та.

    Таким образом сайты, где есть https на текущий момент наиболее надежный способ скрыть нули и единицы от чувака, сидящего на прослушке твоего интернет трафика. А попасть он туда может от самых простых способов типа "друг, дай мне пароль от своего вайфай", до всяческих угадываний, взломов роутеров и на худой конец - под видом электромонтера, установив маааленькую плату тебе в распределительный щит.

    Так что авторизация - она простая. Вся надежда на шифрование. А сертификат, на котором пол-мира делает бабло - это средство подтверждения того, что компьютер умеет шифровать. Интересно, что он кончается каждый год, как будто в прошлом году компьютер умел шифровать, а в этом вдруг разучился. На деле конечно - просто гоните бабло, иначе покажем красный крестик вместо зеленого замочка, и в гугле понизим, так что гоните бабки. Вот.
    Ответ написан
    1 комментарий
  • Как повторять ajax запрос в случае неудачи?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ограничитель поставь в разах, беда будет
    Ответ написан
    Комментировать
  • Как заставить tooltip не убираться при наведении на него?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Все проще.
    .b-bullet {
      /* стили кружочка со знаком вопроса */
    }
    .b-bullet:hover .b-bullet__pad,
    .b-bullet:focus .b-bullet__pad {
      visibility: visible;
    }
    .b-bullet__pad {
      visibility: hidden;
      position: absolute;
      top: 100%
      left: 50%;
      margin-left: -100px;
      width 200px;
      height: 0;
    }
    .b-bullet__tooltip {
      /* стили подсказки */
    }


    В HTML (EMMET code):
    .b-bullet>.b-bullet__pad>.b-bullet__tooltip

    Если хотите, чтобы между иконкой и подсказкой было место например для треугольничка - просто добавьте padding-top в элемент b-bullet__pad, таким образом вы создадите невидимое пространство, двигаясь по которому, система будет считать, что вы все еще в :hover, и не будет закрывать подсказку.
    Ответ написан
    Комментировать
  • Где найти интерактивное изучение js?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    мне напиши 6562680@gmail.com
    Ответ написан
    Комментировать
  • Что читать о принципах проектирования и алгоритмах программ на JavaScript?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Искать мастера.

    Сколько ты книги не читай, сколько лбом не долбайся, ощущение что ты пишешь правильно придет только когда крутой кодер (для тебя субьективно крутой) скажет тебе, что ты классно все делаешь и уже готов.

    Послушайте любого тренера в youtube. В большинстве своем они конечно трепачи и бездельники, но в некоторых вещах они сходятся. Например в том, что в Японии был обычай в 18 лет искать Наставника, на Руси был обычай становится Подмастерьем, в любой активно развивающейся стране был обычай что более опытные берут себе на обучение менее опытных из соображений ответственности за свою страну.

    И только в 21 веке мастера начитались и собираются забрать эти знания в гроб, или пытаются их кому-нибудь продать, чтобы побольше позасирать землю, потребляя побольше ресурсов.

    Только не начинай сейчас демагогию типа "почему все так не делают". Единственный адекватный ответ будет "может все долбанулись?"

    ps. На это тоже есть объяснение. Деньги лежат в противоположной стороне от созидания, развития и гармонии и ответственности.
    Ответ написан
    3 комментария
  • Как загрузить шаблоны в sp application?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    а как работают эти шаблонизаторы?

    $.get(url, 'text').done(function (html) {});

    тут еще все работает.
    А потом полученное мне нужно разбить на куски, потому что верстка там вся скопом в отдельных дивах лежит.

    И когда я пытаюсь все полученное из jquery сделать jquery обьектом, он пытается проверить ссылки, в которых еще не заменены плейсхолдеры!
    Ответ написан
  • Где бы почитать про такую "архитектуру"?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Эм насколько я понял этих любителей придумать новые слова restful, куемпампул и прочих друзей:

    Там как идет - через запрос AJAX отсылается в заголовках (headers) тип запроса - их там аж несколько штук - всякие GET POST PUT DELETE и тд - вишь ли пацанам было лень отправить одну переменную type - и они такие придумали RESTful сервисы - совершили переворот в науке.

    А вместе с ними такими запросами научились кидаться мобильные телефоны, приложения разные и вообще как они тостеры не научили кидаться ими. А твое апи дескать такое все из себя апи, что ему плевать - кто спросил - мобилка, чайник или ноутбук - он всегда что-то сделает. Но они ясен болт спросили, передав обычный массив - JSON данные, и поэтому для чего было создавать новые типы запросов кроме GET и POST - опять же тайна.

    По факту - обычный например если с PHP-бекендом - контроллер, или даже просто файл ajax_user_add.php, который обрабатывает входящий массив и тип запроса и что-то делает - назад выдает сообщение, данные и статус ошибки. Они поспешили назвать это API и теперь это знаешь как на собеседовании звучит! Без этого на работу не берут, вотЪ.

    Это твой яваскрипт назад подхватывает и с ним что-то уже делает.

    Что в этом всем RESTful-ьного - ну имена запросов, название еще, а что еще надо, чтобы технологию придумать?

    Наверное я дилетант просто, поэтому не понимаю всей гениальной концепции этой идеи.

    file.php
    empty($_REQUEST['foo']) && ajax_abort('Foo not defined');
    // do something
    ajax_complete();
    function ajax_complete($msg = null, $data = null) {
      $response['status'] = 1;
      !empty($msg) && $response['msg'] = $msg;
      !empty($data) && $response['data'] = $data;
      exit(json_encode($response));
    }
    function ajax_abort($msg = null, $data = null) {
      $response['status'] = 0;
      !empty($msg) && $response['msg'] = $msg;
      !empty($data) && $response['data'] = $data;
      exit(json_encode($response));
    }


    file.js
    (function ($, App) {
        // do something
        var data = {
          "foo" : "bar"
        };
        $.ajax(
          'file.php',
          {
            "data" : data,
            "type" : "POST",
            "dataType" : "json"
          }
        ).done(function (response) {
          // do something
        });
      })(jQuery, App = window.App || {});


    Ко всей канители, что представлена выше добавляются еще
    • библиотеки (это такие значит ящички-массивы с функциями часто юзабельными),
    • модули (ящички-массивы без которых прога тупо не работает),
    • в модулях сделаем - зависимости (сначала запускать вот этот ящичек, а потом уже вот тот),
    • модули - роутинг и контроллеры (если юзер ввел в строку адреса это - какой ящичек подгрузить?),
    • модули - модели (зачем нам верстку туда сюда через запрос пересылать, мы верстку сразу отправим, а потом будем менять просто имя юзера в яваскрипте, а сразу как модель поменялась - рендер яваскриптовый будет сам себя перестраивать - проще говоря мы отправим вместо 1000 символов текста - массив с полями имя, емейл, телефон, а яваскрипт сам построит верстку, поскольку она уже была отправлена при старте программы)
    • модуль - рендер (в ящичке как бы не мешает что-то и показывать еще),
    • модуль - логи и вывод сообщений (какой из ящичков барахлит),
    • модуль - "шина событий" (массив, который заполняется действиями, которые надо выполнить когда что-то произойдет в определенном порядке)

    и получается Ангуляр.
    Ответ написан
    Комментировать
  • Как обеспечить корректную загрузку изображений из FormData через Ajax/XMLHttpRequest?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    А чем не нравится jQuery с его готовыми решениями? не хочется 100кбайт подгружать?
    гугл ставит 80 баллов скорости сайту с 10летней мусоркой в которой только скриптов килобайтов на 500, просто они грамотно собраны в один файл.

    скорость загрузки? нет, я думаю то что думают поисковые системы - важнее, они же будут сайт вверх двигать. если гугл ставит 80, яндексу как водится - вообще наплевать, он про другое, майкрософтом мало народу пользуется, в общем - используете то что проще в плане делать, нежели пытаясь на нативном сделать и замучаться
    Ответ написан
  • Каким образом можно сделать плавную предзагрузку страницы??

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ну делаешь заглушку с картинкой и анимацией
    Все модули и скрипты сайта оборачиваешь в замыкание и делаешь им .deferred() объекты.
    Пока все деферы не в состоянии OK - показываешь заглушку.
    При переходе на новую страницу - работает скрипт инициализации страницы с модулями, которые на Главной не подгружались.

    Но насколько я знаю, хорошего в таких переходах мало.
    Как бы мы не говорили про современность, разные поисковики в т.ч. старые, в т.ч. трекеры, всякие проверяльщики и счетчики - могут это ОЧЕНЬ не любить.

    То есть тебе придется делать чисто клиентский сайт для человека, и чисто роботовский под робота.

    Лучше потрать деньги на пару лендингов и не имей себе мозг.
    Ответ написан
    Комментировать
  • Как передать верстку через JSON в Javascipt из PHP?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    php:
    $base64json = base64_encode(json_encode($php_array));


    template:
    <script>
      JSON.parse(atob('<?=$base64json;?>'));
    </script>
    Ответ написан
    1 комментарий
  • Как реализовать список заказов opertcart в реальном времени?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Позвоните мне в скайп gzhegow, попробую решить вашу проблему.
    Это врядли можно показать в двух словах.
    Ответ написан
    Комментировать
  • Как сделать динамическую подгруздку контента по горизонтали?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Используй событие скролла.
    Проверяй $(window).scrollTop() значение.

    Или делай на нативном яваскрипте как выше советуют "чтобы не подгружать невероятную по размерам библиотеку jquery" но больше ебстись над каждой фразой кода.
    Ответ написан
    Комментировать