Задать вопрос
  • Как скопировать текст из iframe в переменную js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если в iframe загружена страница с того же origin (протокол + домен + порт) откуда загружена текущая - то Вы имеете полный доступ к его window через свойство contentWindow. Соответственно можете обращаться к его DOM, глобальным переменным, менять их и т.д.

    Если в iframe будет страница с другого origin, то ничего этого нет, с ней можно лишь общаться через postMessage api, но если страница не Ваша, то и скрипт для обработки postMessage + каких-либо еще действий Вы туда не вставите.

    Если сторонний сайт отдает нормальные CORS заголовки при запросе с Вашего сайта (что судя по вопросу не так, но все же), то можно скачать страницу как текст через fetch api и распарсить ее через DOMParser.

    В противном случае остается только делать прослойку у себя на сервере, тут простор фантазии может быть очень широким, от банального reverse proxy прямо в nginx до чего-то более умного на любом серверном ЯП.
    Ответ написан
    Комментировать
  • Как сочетать BEM и динамический контент?

    qfox
    @qfox
    Ответы есть у меня
    У вас здесь 2 проблемы:
    • нужны ли классы для динамического контента;
    • как, если нужно, модифицировать структуру динамического контента.

    Проблема структуры не относится к BEM, она относится к семантике и SEO.

    Если же не смотреть на структуру и тэги (использовать ли small внутри или span, заворчивать ли в article) — то вопрос в сущности нужны ли классы на динамическом контенте или нет. Учитывая, что контент динамический, и нет необходимости иметь классы на тэгах, то допустимо сделать каскад на тэги от некоторого блока: например, dynamic-content или content, text.

    Почему именно теги? Потому что WYSIWYG по умолчанию генерирует теги. Но вы можете использовать какие-то доп. инструменты, которые подправят итоговый html, расставят классы и т.д. (например, с помощью инструментов типа https://github.com/posthtml/posthtml ).

    При необходимости можно дополнительно пометить стили тегов классами.

    <div class="text">
      <h1>Caption <small>Some Foo Bar</small></h1>
      <article>
        <p>Lorem ipsum...</p>
        <div class="text__p">Dolor sit...</div>
      </article>
    </div>


    .text h1, .text__title { /* main title styles */ }
    .text h1>small, .text__sub-title { /* sub-title styles */ }
    .text p, .text__p { /* paragraph styles */ }


    Таким образом вы инкапсулируете все пользовательские стили в одном месте (одном блоке) и не имеете проблем с созданием контента.
    Ответ написан
    2 комментария
  • Как пользоваться BEM?

    Machinez
    @Machinez
    1) Всё верно.

    2) В стилях блока мы описываем только его внешний вид, внутренние отступы и т.д, блок не знает где он находится и какой его размер, позиционировать можно элементы.
    к примеру у нас есть блок авторизации в хедере
    <header class="header">
      <div class="header__auth">
        <div class="auth">
          <div class="auth__item"></div>
          <div class="auth__item"></div>
        </div>
      </div>
    </header>

    в .header__auth мы описываем положение и размер элемента, в .auth описываем внешний вид.

    3) Только класс элемента, но бывают исключения, например используя модификаторы иногда можно воспользоваться каскадом.

    4) Может, называете точно так-же как и другие элементы
    пример:
    <ul class="props__list">
        <li class="props__item">
            <span class="props__label">Weight:</span>
            <span class="props__value">128</span>
        </li>
    </ul>

    хорошие примеры можете посмотреть тут

    5) Не совсем понял вопроса.

    6) cf = clearfix, общепринятый класс, используется как исключение из правил БЭМа, хотя и не приветствуется. Для интерактивности и щелчков нужно использовать модификаторы.
    пример:
    <a class="button button--is-active">click me</a>
    Ответ написан
    2 комментария
  • Без bem поддержка проекта сложна?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Системный подход должен быть, неважно какой. Если есть прослеживаемая система - поддерживать можно.
    Лично мне БЭМ больше импонирует. Но это скорее потому, что я чаще всего с ним работаю.
    Ответ написан
    Комментировать
  • Как разослать всем уведомление, не циклом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Делаете составной уникальный ключ (`user`, `ho`) , после чего всё сводится к двум запросам
    INSERT INTO `mail` (`user`, `to`, `text`, `time`)
      SELECT 2, `id`, :text, :time
        FROM `users`
        WHERE `id`  != 2;
    
    INSERT INTO `contacts` (`user`, `ho`, `delete`, `time`)
      SELECT *
        FROM (
          SELECT `id`, 2, 0, :time
            FROM `users`
            WHERE `id` != 2
          UNION ALL SELECT 2, `id`, 0, :time
            FROM `users`
            WHERE `id` != 2
        ) AS `t`
      ON DUPLICATE KEY UPDATE `delete` = 0, `time` = VALUES(`time`);

    А вообще, какой-то жуткий легаси у вас. Библиотека mysql_ уже давно почила в бозе.
    Ответ написан
    31 комментарий
  • Как через os/exec запустить сторонний exe файл в GoLang?

    При использовании exec.Command, первым аргументом там всегда исполняемый файл, а дальше идет перечисление аргументов, которые этому исполняемому файлу будут передаваться. Причем, их не надо экранировать.

    Несколько примеров:
    path := `c:\Program files\some program\program.exe`
    // аналогично вызову в консоли start "c:\Program files\some data"
    cmd := exec.Command("start", path)
    ......
    
    // аналогично вызову в консоли "c:\Program files\some program\program.exe"
    cmd := exec.Command(path)
    ......
    
    // аналогично вызову в консоли some_prog.exe -flag1 value1 -flag2 value2
    cmd := exec.Command("some_prog.exe", "-flag1", "value1", "-flag2", "value2")
    ......


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

    Кстати, если вам просто нужен полный ответ команды stdout+stderr, можете использовать метод cmd.CombinedOutput(). Он выполнил программу, дождется ее завершения и вернет полностью то, что она писала в консоль.
    Ответ написан
    7 комментариев
  • Почему тут не нужен return?

    nazares
    @nazares
    Software Engineer
    потому что return в цикле прервет цикл после первой же совпадении условия и в итоге посчитает только самый первый делитель его же и вернет.

    function getDivisorsCnt(n){
        let counter = 0
        for (let val=1; val<=n; val++){
          if (n % val === 0 ){
            counter +=1
          }
        }
      return counter;
    }
    console.log(getDivisorsCnt(12))
    Ответ написан
    1 комментарий
  • Как реализовать поставленную задачу?

    sHinE
    @sHinE
    веб-разработчик, php/js/mysql и сопутствующее
    Регуляркой вырезаете количество секунд.
    Создаёте промис.
    Делаете таймаут на резолв промиса с переданным именем через полученное количество секунд
    Возвращаете промис.

    Я бы как-то так сделал.
    Ответ написан
    1 комментарий
  • Как вернуть результат промиса в переменную?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Как спарсить подобный сайт?

    fenrir1121
    @fenrir1121
    Начни с документации
    Как спарсить подобный сайт?
    Подобный чему?

    Сайт может блокировать аккаунты на несколько часов, что и происходит примерно через 30 минут парсинга.
    Что за операции, что вам не хватает 30 минут?

    Сначала пробовал работать через api сайта.
    Демонстрируйте код.

    Логинился в селениуме, получал заголовки и делал запросы на нужную мне информацию
    Так через api или селениум, вы определитесь.

    Можно ли попытаться выдать селениум хром за сафари на iPhone, и есть ли вообще в этом смысл?
    Вы сами пишите что парсинг возможен только из под аккаунта и блочится аккаунт. Очевидно сайту все равно сколько устройств вы имитируете, если аккаунт один и тот же.
    Ответ написан
    3 комментария
  • Какой курс по пентестингу выбрать?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    https://training.csilinux.com/

    в форумах и телегах посмотри промо, чтобы бесплатно было, если вдруг он платный
    Ответ написан
    2 комментария
  • Что должен знать Front-end разработчик о серверной части?

    black1277
    @black1277
    Вольный стрелок
    Кто же его знает, что там у него на уме... Но исходя из уточнения, я думаю он хотел услышать про REST API, и особенно про Идемпотентность
    Ответ написан
    1 комментарий
  • Особенности работы функций?

    rqdkmndh
    @rqdkmndh
    Web-разработчик
    Наверное вы не сказали самое главное - что такие функции не загрязняют глобальное пространство имен(что исключает конфликты имен при использовании совместно разных библиотек) и поэтому являются прототипом для создания паттерна модуль.
    Ну, а вообще кто знает что они хотели услышать... Надо в конце все же спрашивать правильный ответ по мнению вопрошающей стороны.
    Ответ написан
    3 комментария
  • Ветка рефералов, как сделать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    MySQL 8
    WITH RECURSIVE `cte` (`level`, `id`, `login`, `referrer`) AS (
      SELECT 0, `id`, `login`, `referrer`
        FROM `users`
        WHERE `id` = :userId
      UNION
      SELECT `u`.`level` + 1, `r`.`id`, `r`.`login`, `r`.`referrer`
        FROM `cte` AS `u`
        JOIN `users` AS `r` ON `r`.`id` = `u`.`referrer`
    )
    SELECT *
      FROM `cte`
    Ответ написан
    4 комментария
  • SASS: extend or mixin?

    andead
    @andead
    друпал девелопер, фрилансер
    extend нельзя использовать в @media, поэтому пользуюсь только миксинами.
    Ответ написан
    Комментировать
  • Как сделать формат данных в цикле?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const clone = (data, replacements) =>
      data instanceof Object
        ? data instanceof Array
          ? data.map(n => clone(replacements?.hasOwnProperty(n) ? replacements[n] : n, replacements))
          : Object.fromEntries(Object.entries(data).map(([ k, v ]) => [
              k,
              clone(replacements?.hasOwnProperty(k) ? replacements[k] : v, replacements)
            ]))
        : data;
    
    
    const products = arr.map(n => clone(obj.product[0], n));
    Ответ написан
    4 комментария
  • Как писать fullstack с webpack?

    Aetae
    @Aetae
    Тлен
    webpack devServer, в частности функция proxy.
    Webpack поднимает сервер с горячей перезагрузкой фронта, бэк сервера поднимаешь на других портах, и обращаешься к api прозрачно с помощью встроенного прокси.
    Ответ написан
    Комментировать
  • Как запретить писать в input?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никак не обезопаситься. Всегда можно посмотреть, что за запрос уходит из браузера и симмитировать его с любыми нужными полями/заголовками/куками.
    Данным, пришедшим от клиента, доверять нельзя никогда.

    P.S. Хотя для вашей ситуации можно на сервере подписать данные электронной подписью или зашифровать их и на сервере же проверять подпись/расшифровывать. Но если ключ будет один на всех, то можно будет подставить данные с другого клиента, а если ключ будет свой для каждой сессии, то проще хранить данные в сессии и не отдавать клиенту.
    Ответ написан
    2 комментария
  • Как определить при помощи JS браузер пользователя и его ip?

    SPART4K
    @SPART4K
    Middle Front-end Developer (Vue.js/Nuxt.js)
    navigator.userAgent
    Информацию о браузере - устройствe и тп

    fetch('https://api.ipify.org/').then(
      r => r.text()
    ).then(console.log);

    ip
    Ответ написан
    Комментировать