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

    lazalu68
    @lazalu68
    Salmon
    Пример

    ЗЫ: вообще никогда с Vue не работал, вся инфа из мануала VueJS events
    Ответ написан
    1 комментарий
  • Как работает return false;? Зачем он нужен?

    lazalu68
    @lazalu68
    Salmon
    Default browser action

    Ну, у вас существует два способа сообщить браузеру, что вы хотите отменить дефолтное действие для некоторого события, в данном случае отменить переход по ссылке: вызвать event.preventDefault() или вернуть false из функции обработчика. Второй работает только если вы назначаете обработчик с помощью атрибута onсобытие вот так:

    <a href="//google.com" onclick="return false">google</a>


    Или так:

    <a href="//google.com">google</a>
    
    <script>
    document.getElementsByTagName('a')[0].onclick = function() {
    	return false;
    }
    </script>
    Ответ написан
    Комментировать
  • Как добавить слушателя всем элементам с определённым классом?

    lazalu68
    @lazalu68
    Salmon
    Вешаете на каждый из них listener для соответствующего события, в вашем случае click. Хотя лучше было бы вешать один обработчик на общего их родителя, который будет проверять элемент на который нажали; если нажали на div.ic-block - выполнять алерт.
    Ответ написан
    Комментировать
  • Как просто сделать загрузка картинки в textarea по Ctrl+V?

    lazalu68
    @lazalu68
    Salmon
    1. onpaste и преобразования, как-то так,
    2. Вкратце: ну вот такой вот сервер. Подозреваю, всяческие хостеры картинок типа imgur.com так умеют, и не за бесплатно предоставляют любому желающему возможность воспользоваться их сервисом. Хотя, подозреваю, подобный функционал не сложно сделать самому.

    Посылать на сервер base64 не сто́ит, при возможности лучше посылать, например, blob.
    Ответ написан
  • Выбор диапазона ячеек?

    lazalu68
    @lazalu68
    Salmon
    tr:nth-child(n+y_min):nth-child(-n+y_max) td:nth-child(n+x_min):nth-child(-n+x_max)

    © Mastering the :nth-child
    Ответ написан
    1 комментарий
  • Какой поиск лучше сделать на странице "Проекты"?

    lazalu68
    @lazalu68
    Salmon
    Вообще 1 с фолбеком до 3 это вполне стандартный подход.
    Ответ написан
    Комментировать
  • Как сделать аналог promise.all из массива промисов с обработкой resolve для каждого промиса?

    lazalu68
    @lazalu68
    Salmon
    Просто в цикле пишите не var i = 0, а let i = 0, тогда в колбэке then сможете использовать этот индекс. Тогда можно и от обертки отказаться.

    Как-то так
    function func(k) {
        return new Promise((resolve, reject) => {
            setTimeout(function() {
                resolve( k**2 );
            }, 1000);
        });
    };
    
    var objs = [
            { a: 6, b: 2 },
            { a: 5, b: 3 },
            { a: 2, b: 4 }
        ],
        arr = new Array(objs.length);
    
    for(let i = 0; i < arr.length; i++) {
        arr[i] = func(objs[i].a);
        arr[i].then(function(result) {
            console.log(`Target index is ${i}, initial value (a) is ${objs[i].a}, result is ${result}`);
        });
    }
    А можно и не сохранять промисы.
    function func(k) {
        return new Promise((resolve, reject) => {
            setTimeout(function() {
                resolve( k**2 );
            }, 1000);
        });
    };
    
    var objs = [
            { a: 6, b: 2 },
            { a: 5, b: 3 },
            { a: 2, b: 4 }
        ];
    
    objs.forEach((item, index) => func(item.a).then(result => console.log(`Target index is ${index}, initial value (a) is ${objs[index].a}, result is ${result}`)));
    Ответ написан
    Комментировать
  • Почему такое странное поведение у JS?

    lazalu68
    @lazalu68
    Salmon
    Это вот зачем всё?

    let needID = this.masterID.splice(0, 1);
    ...
    this.masterID.push(needID[0]);


    Вы этим алгоритмом первый элемент ставите на последнее место. Если бы я не знал задачи, я бы вам сказал "зачем так сложно, делайте просто this.masterID.reverse()". К тому же вы нигде не проверяете пустая ли очередь, в любом случае делаете ваше тёмное дело.

    С проверкой всё работает без фокусов
    class RedisAPI {
        constructor() {
            this.masterID = new Array(); //здесь хранятся уникальные ID всех воркеров
        }
    
        addWorker(id) {
            this.masterID.push(id);
            console.log(`Worker ${id} is working!`);
        }
    
        //отправление сообщения на обработку одному из воркеру
        emit() {
            if (this.masterID.length) {
                let needID = this.masterID.splice(0, 1);
                console.log(`arr: ${this.masterID.length}; first: ${needID[0]}`);
                this.masterID.push(needID[0]);
            } else {
                console.log('The queue is empty!');
            }
        }
    
        //отправление сообщения на обработку одному из воркеров каждые ms секунд
        emitTimeout(ms) {
            setInterval(() => {
                this.emit();
            }, ms);
        }
    }
    
    var queue = new RedisAPI();
    
    queue.emitTimeout(1000);
    
    setTimeout(function() {
        queue.addWorker(42);
    }, 1500);
    Ответ написан
  • Почему не копируется iframe, который показывает лайки с вк?

    lazalu68
    @lazalu68
    Salmon
    Не invalid application, а invalid application domain. Когда вы грузите фрейм, ВК проверяет URL/origin привязанный к приложению, ID которого вы прислали в запросе: если вызывающее окно имеет URL/origin соответствующий привязанному, то фрейм грузится. Если нет, то прилетает ошибка Invalid application domain.

    Вкратце: вы не сможете загрузить этот фрейм на страницах с адресом не соответствующим тому, который привязан к приложению с id = 3893440.
    Ответ написан
    Комментировать
  • Javascript как передать значение из функции?

    lazalu68
    @lazalu68
    Salmon
    Можно просто строить маршрут не сразу, а только после выполнения запроса:

    $.ajax({
        ...
        success: function(data) {
            var singlePosition = new google.maps.LatLng(data.props[0].lat, data.props[0].lng);
            var request = {
                origin: coords,
                destination: singlePosition,
                travelMode: google.maps.DirectionsTravelMode.DRIVING
            };
           directionsService.route(...);
           ...
        },
        ...
    });
    Ответ написан
    1 комментарий
  • Почему form.submit(); вызывает ajax, а не обычный post?

    lazalu68
    @lazalu68
    Salmon
    Как-то так:

    $('form').submit( function(event) {
        var form = this;
        event.preventDefault();
        setTimeout( function () { 
            form.submit();
        }, 300);
    });


    То есть банально вызывать метод submit у HTMLFormElement, а не у $-объекта.
    Ответ написан
  • Как изменить отображение позиции Яндекс.Карты по клику?

    lazalu68
    @lazalu68
    Salmon
    Вообще обычно ссылки на объекты карт всё таки сохраняются, чтобы их можно было использовать, вот как в вашем случае. Но если их нет, то можно попробовать декорировать конструктор и сохранять эти ссылки например в объекте целевого элемента, как-то так:

    ymaps.ready(function() {
        const old_Map = ymaps.Map;
        
        ymaps.Map = function() {
            var args = Array.prototype.slice.call(arguments);
            
            args.unshift(0);
    
            var obj = new (Function.prototype.bind.apply(old_Map, args));
    
            document.getElementById(args[1]).yaMap = obj;
            return obj;
        }
    });


    После чего вы можете обратиться к объекту карты так:

    document.getElementById('himki').yaMap

    Вот пример, в котором ymaps.Map декорируется, создаётся объект карты, после чего мы к нему обращаемся и в качестве примера центрируем карту на какой-нибудь другой точке. Декоратор нужно выполнять строго сразу после загрузки скрипта Yandex Maps API и в первую очередь по событию ready для ymaps.
    Ответ написан
    Комментировать
  • Как переключить элементы списка (сделать навигацию) с помощью стрелок клавиатуры на Jquery (подгрузка через ajax)?

    lazalu68
    @lazalu68
    Salmon
    В общем небольшие итоги переписки в комментариях: при попытке по нажатию клавиши enter открывать ссылку с помощью $().click генерируется untrusted событие, поэтому ссылка не открывается. Зато нажатие на enter по дефолту открывает ссылку если она в фокусе, это можно сделать с помощью $().focus. А т.к. никакого кеша в помине нет, то четвертый пункт ("Сделать так, чтобы работало с динамически подгружающимися элементами") выполняется автоматически.
    Ответ написан
    Комментировать
  • Как принудительно увеличить высоту блоку?

    lazalu68
    @lazalu68
    Salmon
    Такой возможности нет - вы не имеете доступа к фрейму, к тому же просто нету такой опции, даже в коде:

    MiniWidget
    MiniWidget: function(options) {
          this.id = TradingView.gId();
          this.options = {
            whitelabel: options.whitelabel || "",
            width: TradingView.WidgetAbstract.prototype.fixSize(options.width) || 300,
            height: TradingView.WidgetAbstract.prototype.fixSize(options.height) || 400,
            symbols: options.symbols,
            tabs: options.tabs || "",
            symbols_description: options.symbols_description || "",
            customer: options.customer || "",
            container: options.container_id || "",
            large_chart_url: options.large_chart_url || "",
            large_chart_target: options.large_chart_target || "",
            gridLineColor: options.gridLineColor || "",
            fontColor: options.fontColor || "",
            underLineColor: options.underLineColor || "",
            trendLineColor: options.trendLineColor || "",
            timeAxisBackgroundColor: options.timeAxisBackgroundColor || "",
            activeTickerBackgroundColor: options.activeTickerBackgroundColor || "",
            noGraph: options.noGraph || false,
            locale: options.locale,
            styleTickerActiveBg: options.styleTickerActiveBg || "",
            styleTabActiveBorderColor: options.styleTabActiveBorderColor || "",
            styleTickerBodyFontSize: options.styleTickerBodyFontSize || "",
            styleTickerBodyFontWeight: options.styleTickerBodyFontWeight || "",
            styleTickerHeadFontSize: options.styleTickerHeadFontSize || "",
            styleTickerHeadFontWeight: options.styleTickerHeadFontWeight || "",
            styleTickerChangeDownColor: options.styleTickerChangeDownColor || "",
            styleTickerChangeUpColor: options.styleTickerChangeUpColor || "",
            styleTickerLastDownBg: options.styleTickerLastDownBg || "",
            styleTickerLastUpBg: options.styleTickerLastUpBg || "",
            styleTickerSymbolColor: options.styleTickerSymbolColor || "",
            styleTickerSymbolHoverTextDecoration: options.styleTickerSymbolHoverTextDecoration || "",
            styleTickerActiveSymbolTextDecoration: options.styleTickerActiveSymbolTextDecoration || "",
            styleTabsActiveBorderColor: options.styleTabsActiveBorderColor || "",
            styleTabsNoBorder: options.styleTabsNoBorder || "",
            styleWidgetNoBorder: options.styleWidgetNoBorder || ""
          };
          this.createWidget()
        }


    Так что, вероятно, лучше будет использовать другой вариант виджета, не помню точно какой. Там по дефолту график чуть больше.
    Ответ написан
  • Как отобразить несколько уведомлений в OneSignal?

    lazalu68
    @lazalu68
    Salmon
    Я бы посмотрел что там и как, но к сожалению даже не разобрался как это всё использовать, лол.

    Зато вроде бы в описании коммита все написано довольно прозрачно:

    Allow multiple notifications to be displayed by setting the notification
    tag property if supplied. Notifications with identical tags will replace
    each other.


    То есть вы когда где-то там у себя регистрируете несколько notification, вы им в опциях передаёте разные теги если хотите чтобы сработали все. В ServiceWorker.ts объект опций называется notificationOptions, не знаю как в интерфейсе.
    Ответ написан
  • Клонирование объекта?

    lazalu68
    @lazalu68
    Salmon
    Вы перемудрили. Без шуток.

    Если под лучше вы подразумеваете быстрее, то лучше абсолютно любое решение, даже откровенно в лоб:

    Plain object creation
    const keys = [1,2,3,4,7];
    const final_object = {};
    
    for (var i = 0; i < keys.length; i++) {
    	final_object[ keys[i] ] = { current: 0, default: 1 }; 
    }
    Plain + Constructor
    const keys = [1,2,3,4,7];
    const final_object = {};
    const UnknownObject = function() {
    	this.current = 0;
    	this.default = 1;
    }
    
    for (var i = 0; i < keys.length; i++) {
    	final_object[ keys[i] ] = new UnknownObject();
    }
    Ответ написан
    Комментировать
  • Из-за чего появляется ошибка?

    lazalu68
    @lazalu68
    Salmon
    Первое.

    cannot read property 'lat' of undefined


    "Не может прочитать свойство «lat» неопределенного" © Google Translate
    Вы пытаетесь прочитать свойство "lat" у неопределённого объекта.

    Второе - вы делаете дикую дичь. Разве в теле "цикла" у вас есть хоть одна асинхронная операция, зачем использовать интервал? Собственно, этот момент и привел к ошибке, в цикле вы бы не смогли допустить такой ошибки. Дичь например есть в строке 137.

    Третье - чтобы найти ошибку, посмотрите на ваш "цикл" и посмотрите какое условие должно выполниться чтобы цикл завершился. Это условие неправильно.
    Ответ написан
    Комментировать
  • Как создать таблицу Ганна на php + js?

    lazalu68
    @lazalu68
    Salmon
    looping in a spiral

    По ссылке можно видеть до чёрта вариантов реализации того что вам нужно, на многих языках. В том числе на JS, в том числе с циклами, в том числе без циклов (определение значения ячейки по (x,y)).
    Ответ написан
    Комментировать