1. JavaScript / Говнокод #15486

    +154

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    var SE = document.getElementsByTagName("a");
    for (var i = 0; i < SE.length; i++)
    {
        if (SE[i].href.indexOf('http://www.govnokod.ru/ratings/comment/') == 0
    	    && SE[i].href.indexOf('on') != -1)
    	{
    		plusIT(SE[i].href);
    		console.log(SE[i].href);
    	}
    }
    
    function plusIT(ID)
    {
    	$.get(
        ID,
        {},
        function(x) {
        });
    }

    Запостил: gost, 15 Марта 2014

    Комментарии (30) RSS

    • Выравниватель минусов?
      Ответить
      • Возможно, я ошибаюсь, так как мало знаю JS, но мне кажется, можно было обойтись и 1 строчкой:
        SE[i].click();


        также не стоит шерстить весь DOM, перебирая значения в поисках 1 элемента: это можно сделать с помощью getElementsByClassName (Firefox).
        Ответить
        • Говнокод же.
          Ответить
        • +Не 1 элемент, а все загруженные комменты.
          Ответить
          • Идет сравнение по имени класса. Ты получишь коллекцию именно тех элементов, что тебе нужны, без всяких проверок на вшивость.
            var elems = document.getElementsByClassName('comment-vote-on');
            for (var i = 0; i < elems.length; i++)
            {
                alert(elems[i].href);
                elems[i].click();
            }


            Да простят меня товарищи, рулонным кликаньем никогда не увлекался. Токмо пример. Простите, товарищи!..
            Ответить
        • Тогда уже на жуквери проще.

          Кстати, а в жаваскрипте есть foreach? Можно так написать?
          for x in $('.comment-vote-on') {
          
          }
          Ответить
          • нельзя.
            for (var i = 0; i < elems.length; i++)
            Ответить
            • На жуквери действительно будет короче:
              $('.comment-vote-on').click();
              А для любителей извращений усложнять будет так:
              $('.comment-vote-on').each(function(){
                $(this).click();
              });
              А если так уж нужен форыч, то читаем про фрактал отсоса:
              for (i in elems) {
                elems[i].click();
              }
              Ответить
              • Не думал, что в JS есть for..in. Вроде, сиподобный язык, с другой стороны, прям vbs какой-то, ей-богу.
                Ответить
                • > в JS есть for..in
                  не используй его. никогда.
                  он настолько плох, что лучше бы его просто не было.

                  > с другой стороны, прям vbs какой-то, ей-богу.
                  и кто у кого заимствовал?
                  Ответить
                  • Что насчёт Array.prototype.forEach?
                    Ответить
                    • Дык, лямбды (обратный вызов функции) они и тормозные, и по громоздкости превосходят цикл. Противно и гадко сиё.
                      В целом на любителя, у кого голова засрана лямбдами и фоп - пожалуйста. Оно хоть нормально обходит.
                      Ответить
                      • Ну как тормозные - в теории создание замыкания не тормознее создания объекта, вызов не тормознее вызова его метода. Медленней цикла, конечно. Хотя как там с этим обстоят дела в жопоскрипте - х.з.

                        > по громоздкости
                        Это да, неудобно все эти function() писать.
                        Ответить
                        • Хз что там оптимизатор нагородит, может заинлайнить превратить в цикл (теоретически).
                          Вот jvm-hotspot, например умеет в такую магию: если из анонимного класса бросается исключение (выход из цикла по заветам гвидо), а лямбда заинлайнилась туда где catch, то всё это превращается-превращается, внимание... в условный переход! Будто это break в цикле.

                          Только там это работает чаще, если кидать исключение-константу и/или не использовать объект исключения - пустой catch(), чтобы escape analysis смог понять что оно не надо.
                          Ответить
                • Сиподобность — иллюзия. От сишки в js только синтаксис, но не семантика.

                  Ключевое слово — script, а не java. Так что vbs — это почти js, только знаки препинания другие.
                  Ответить
          • Пара замечаний:
            1. Для сраного IE придётся эскейпить: $('.comment\-vote\-on')
            2. $('.comment-vote-on') не массив, а объект.
            3. Тем не менее, у этого объекта есть свойства, доступные по индексу как элементы массива, и даже свойство length.
            4. Форыч в js пробегает не значения, а индексы, поэтому придётся сохранять объект в какой-нибудь переменной, чтобы в теле цикла лишний раз не создавать.

            С учётом вышеизложенного получаем:
            var x = $('.comment\-vote\-on');
            for (var i in x) {
              x[i].click();
            }
            Хотя смысла в этом нет. А почему, см. мой комментарий ниже.

            Ну и для всех современных веб-браузеров уже можно и без жуквери:
            https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelectorAll
            Даже Тарас ушёл с девятой Оперы и только лохи сидят на седьмом ИЕ.
            Ответить
            • > Хотя смысла в этом нет.
              Вообще нет. Для for (var i in x) переменная i пробежится и по жквери-методам. И даже с проверкой на собственное поле всё равно несколько лишних полей останутся.
              Ответить
              • Проверил. x.length равно количеству комментариев на этой странице, а for...in пробегает не только их, но и все поля и методы объекта.

                Мой мир больше никогда не будет прежним. for...in действительно использовать нельзя, кроме как для написания собственного Фаербага с блэкджеком и шлюхами.
                Ответить
              • P.S. Проверил $('.comment\-vote\-on').toArray(). Уже лучше, но всё равно несколько «лишних» элементов.
                Ответить
                • А у меня for..in в этом случае прошёл только нужные элементы, для length свойство Enumerable установлено в false, как и в остальных экземплярах Array.
                  Ответить
            • >Для сраного IE придётся эскейпить
              Проблемы недобраузеров никого не волнуют, кроме их владельцев.
              var x = $('.comment\-vote\-on');
              for (var i in x) {
                x[i].click();
              }

              Кал какой-то.
              >$('.comment\-vote\-on').toArray().
              Зачем?

              Пошёл. На работу, жквери учить. Вот так надо клик().клик().клик(), коротко:
              $('a.comment-vote-against').click();
              $("a.ajax:contains('показать')").click ()
              Ответить
              • > Вот так надо клик().клик().клик(), коротко:
                В одном из тредов я вчера как раз этот вариант предлагал :)
                Ответить
                • Спасибо, теперь я заминусую всех.
                  Ответить
                  • Гости не могут минусовать.
                    Ответить
                    • Не встревай, а то и тебе достанется.
                      Ответить
                      • >а то и тебе достанется.
                        Хорошо-хорошо, только не обрушивай на меня свою жуткую кару.
                        Я просто в диком ужасе. Что теперь мне делать??? Как загладить проступок?
                        Ответить
                        • cleaned
                          Ответить
                        • Я Паладин Плюсов! Гость, только попробуй обрушить на меня и этого гражданского свой ботомеч - Силы Света испепелят тебя!
                          Ответить
              • Послание из прошлого:

                inkanus-gray 16.03.2014 15:18
                На жуквери действительно будет короче: $('.comment-vote-on').click();


                Кал же какой-то был написан умышленно, чтобы продемонстрировать сэру Stertor'у и сэру s-a--m'у циклы в языке программирования Javascript.

                P.S. Творится что-то странное. Пи уже отписывался в этом ГК и даже написал, почему for...in не стоит даже пытаться использовать.
                Ответить

    Добавить комментарий