Задать вопрос
  • Как настроить событие на элемент отслеженный getElementsByClassName???

    lazalu68
    @lazalu68
    Umid:
    Функции jQuery рассчитанные на модификацию элементов DOM умеют автоматически определять что в них передано - один элемент или массив. На самом деле все не так просто, но сильно упрощенно это выглядело бы так:

    function on(arg, function_to_apply)  {
    	if (Array.ifArray(arg)) {
    		for (i = 0; i < arg.length; i++ ) {
    			function_to_apply( arg[i] );
    		}
    	} else {
    		function_to_apply( arg );
    	}
    }


    Если в функцию передан один элемент, то эта функция выполняется только для него, а если передан массив элементов, то функция выполняется для каждого элемента в массиве. Конструкция $('.asd').on('click', handler) вешает обработчик на все элементы, найденные селектором '.asd', будь их 100, 1 или 0, и конечно же она все равно использует цикл для того чтоб это сделать, по-другому быть не может. Скорее всего jQuery функция будет даже дольше выполняться ввиду сложности внутренней логики jQuery.

    По поводу третьего аргумента addEventListener: да, это называется "всплытие событий", но объяснить на словах у меня не получится. Я попробую: если у вас есть 5 вложенных друг в друга элементов и на каждом висит on('click'), то при нажатии на самый верхний выполнятся все обработчики, начиная с того, на какой непосредственно элемент кликнул пользователь: 5, 4, 3, 2, 1.

    Если например на третий элемент обработчик повешен с атрибутом useCapture=true (вот так - addEventListener('click', handler, true)), то при клике на самый верхний элемент, последовательность вызовов будет такая: 3, 5, 4, 2, 1.

    Также порядок выполнения обработчиков, которые используют capture mode, обратный, то есть если обработчики всех элементов используют capture mode, при клике на самый верхний элемент последовательность будет такая: 1, 2, 3, 4, 5, сначала выполнится обработчик родительского элемента.

    Я сделал маленькую демку, можете поиграться с режимами. При клике на строку "useCapture attribute of..." режим обработчика для соответствующего элемента меняется и отображается в этой же строке. По клику на разноцветные блоки появится надпись, отражающая последовательность вызовов, например если средний элемент будет использовать capture mode, а остальные - нет, то последовательность будет выведена такая: two + three + one
  • Как масштабировать уже загруженные изображения после загрузки новых (JavaScript)?

    lazalu68
    @lazalu68
    Кхм, что-то я не подумал о том, что за ником MargeSimpson будет не парень. Картинки ведь именно на это рассчитаны были, извините)

    Вот пример HTML-документа с подключением внешнего стилевого файла, который находится в том же каталоге (в той же папке), что и этот файл .html:

    <!DOCTYPE html>
    <html>
    <head>
      <link rel="stylesheet" href="styles.css">
    </head>
    <body>
    
    <h1>This is a heading</h1>
    <p>This is a paragraph.</p>
    
    </body>
    </html>


    Если у вас стили лежат в папке css, то чтобы подключить один из них, атрибут href должен быть такой: css/styles.css
  • Почему шторка JS не работает?

    lazalu68
    @lazalu68
    Этого Виталия все видят кроме меня? XD
  • Почему шторка JS не работает?

    lazalu68
    @lazalu68
    А кто такой Виталий? 0_о
  • Есть 3 таблицы. Поставщик,Товар.Ордер. Как найти все ордеры поставщика?

    lazalu68
    @lazalu68
    Тогда логичней было бы вместо "У этого поставщика было сделано заказов на такую-то сумму" говорить "У этого поставщика было куплено товаров на такую-то сумму"

    Я мало связан с миром бд, но мне кажется если есть возможность избежать ненужных вычислений (таких как сумма всех ордеров через select с двойным join'ом), лучше попытаться их избежать и, как вы сказали, использовать поле с суммой товаров для каждого поставщика.
  • Как настроить событие на элемент отслеженный getElementsByClassName???

    lazalu68
    @lazalu68
    Это нулевой индекс, то есть мы берем элемент с индексом 0, самый первый элемент в массиве, который возвращает метод getElementsByClassName('asd').

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

    Например, если переписать ваш пример так, чтобы он работал с массивом элементов, то получится как-то так:

    var elements = document.getElementsByClassName("asd"), 
        length_of_elements = elements.length, 
        setContent = function(){
            this.innerHTML = 'lol';
        }, i;
    
    for (i=0;i<length_of_elements;i++) {
        elements[i].addEventListener('click',setContent,false);
    }
  • Как настроить событие на элемент отслеженный getElementsByClassName???

    lazalu68
    @lazalu68
    document.getElementsByClassName('asd')[0].addEventListener('click',function(e){console.log(e.target)},false);

    Так?
  • Слайдер на JS. Странности с transition. Как быть?

    lazalu68
    @lazalu68
    Ну тогда вдобавок еще нажмите кнопку "Отметить решением" )
  • Откуда взялось расстояние между li? Как его убрать?

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

    Намного безопасней пользоваться способом №5 из статьи по ссылке. Код получается не такой красивый и лаконичный, зато вы точно знаете, как будет обработан ваш код, ни один браузер не добавит в этом месте никакой отсебятины.
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    В конструктор обернул, потому что не знал, как в одно действие создать объект со свойствами, ссылающимися на свойства этого же объекта (например, я пытался объявить свойства container : $() и items : container.children(), получается ошибка). В итоге получилось вот это

    Ошибки наконец-то исчезли ?)
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    Вот, переделал так, чтобы все было в одном объекте, который собран конструктором. По поводу переменных тоже все исправил.

    Зато код теперь выглядит отвратительно( Можно было как-то это сделать без постоянного упоминания this и base?
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    Ну, можно и в объекте, так и было пару версий назад, но потом я из каких-то слухов решил, что обращение к массиву будет обрабатываться быстрее, чем обращение к объекту. Я не прав?
  • Почему нету offsetBottom и offsetRight?

    lazalu68
    @lazalu68
    Ну во-первых, это не функции. А что значит "не те" все равно не понятно. Ну вы же уже решили свою проблему, так что наверное можете уже не объяснять. Я просто надеялся что вы-таки объясните, но, видимо, зря)
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    Ну дааа, оно нечитабельно и некрасиво выглядит, но соль же в том, что при вызове не выполняется ничего лишнего, только нужная функция, единственное лишнее действие это вот это:
    var t
    
    keyAction = function(e) {
      return (t = actions[e.keyCode]) && t(e)
    }


    То есть наверное можно как-то обойтись без того, чтобы обращаться к массиву дважды и без сохранения функции в переменную, но я не знаю как(

    И кстати почему тот кусок "совсем мрак"?) Вроде такой же, как все
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    Красота) Массивная какая штуковина
  • Как рационально организовать обработку keyboards events?

    lazalu68
    @lazalu68 Автор вопроса
    Тогда мне придется объявить еще с дюжину переменных для каждой кнопки, которую я хочу обрабатывать) Это как-то не очень.

    А что насчет технических недочетов?

    Кстати, в вашем варианте я вижу, что при вызове фукнции вы дважды обращаетесь к массиву actions. Это зачем?

    Я говорю об этом:
    $(document).on("keydown", function(event) {
      return actions[event.which] && actions[event.which](event);
    });


    У меня вроде бы одно обращение:
    var t
    
    keyAction = function(e) {
      return (t = actions[e.keyCode]) && t(e)
    }
  • Почему нету offsetBottom и offsetRight?

    lazalu68
    @lazalu68
    Лол, почему "еще раз"? У вас нигде не написано ни про какую вашу собственную функцию fn.scrollHeight и нету у вас комментариев к вопросу. У меня сейчас 15:22 17.12.2015, тостер говорит, что "вопросы был задан 20 часов назад". Вот смотрите как на данный момент выглядит ваш вопрос:

    "Нужно узнать bottom элемента. Решил этой цели добиться по другому. Узнал длину body, длину нужного элемента, offsetTop нужного элемента. Но вот на body не подходит ни scrollHeight, ни clientHeight, ни offsetHeight. Все они измеряют не то, кроме scrollHeight, но при прокрутке это значение меняется. Как узнать bottom у элемента"

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

    А потом вы вообще заявляете о какой-то своей функции. Она, мол, уже была где-то там у вас в комментариях упомянута, но это не так. И что значит эта странная фраза "у меня стоит scroll прокрутка"? Кажется, вы слишком глубоко "в теме")

    Простите, если я вас обидел неумением телепатически узнавать, в чем там у вас проблема, но как-то мы с вами по-разному видели ваш вопрос.
  • Почему нету offsetBottom и offsetRight?

    lazalu68
    @lazalu68
    Эээ, в моем комментарии вы также могли прочитать, что даже если вам не нужен сам jQuery, вы можете заглянуть в его код и узнать, как он узнает высоту элемента, в частности - body.

    Ладно, если вы не хотите сами смотреть, я вам помогу, нажимайте сюда, заходите по первой же ссылке, читайте первый же ответ:

    var body = document.body, html = document.documentElement;
    
    var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );


    Например вот так можно узнать высоту документа.