LINUX.ORG.RU

поругайте js-быдлокод

 , ,


5

3

вдохновившись этой темой решил написать свой велосипед добавляющий лору двач-стайл функциональность:

// ==UserScript==
// @id             www.linux.org.ru-2ch-style@scriptish
// @name           LOR 2ch-style
// @version    0.1
// @author         
// @description    enter something useful
// @match      http://www.linux.org.ru/*
// @match      https://www.linux.org.ru/*
// @namespace http://www.linux.org.ru/*
// @namespace https://www.linux.org.ru/*
// @include http://www.linux.org.ru/*
// @include https://www.linux.org.ru/*
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js
// @run-at         document-end
// ==/UserScript==

(function () {

var mouseOnPopup = false;

var locationurl = $(location).attr("href").replace(/#.*$/, "");

var locatTimer = null;

var processMouseEnter = function (){
    mouseOnPopup = true;
};

var processMouseLeave = function (){
    mouseOnPopup = false; 
    processMouseOut();
};


var processLink = function (lnk, elem)
        {
            	msg = lnk.parents('article');
            	msg_title = msg.find('.title');
            	msg_body = msg.find('.msg_body.message-w-userpic');
                popup = $('<div class="2ch_popup">' + '<div class="msg_title">' + msg_title.html()  + '</div>' + '<div class="msg_body">' + msg_body.html()   + '</div>' + '</div>');
            	popup.find('.hideon-phone').parent().remove();
                popup.find('div.msg_title > a').each(function (idx,elem){processTag(idx,elem);});
                popup.find('div.answers > a').each(function (idx,elem){processLinkComments(findLink(elem),$(elem));});

                popup.mouseenter(function(){processMouseEnter();}).mouseleave(function(){processMouseLeave();});
                
                if (locatTimer){
                    clearTimeout(locatTimer);
                    locatTimer = null;
                }
                
                $('body').remove('.2ch_popup');
               
                $(popup).css('z-index', '9999')
                                .css('position', 'absolute')
                                .css('top', ($(elem).offset().top)+'px')
                                .css('left', ($(elem).offset().left+$(elem).width()+5)+'px')
                                .css('background-color','#101010')
                                .css('width', '600px')
                                .css('border-radius', '5px')
                                .css('border-width', '1px')
                                .css('border-style', 'solid')
                                .css('border-color','#face8d')
                                .css('padding', '5px')
                                .attr('rel', $(elem).attr('href'));
                 $('body').append(popup);
        };
        
var findLinks = function (msg, elem){
            return msg.find('a').filter(function(){return ($(this).text() === "Ссылка" && $(this).attr('href') == $(elem).attr('href')); });
        };
        
var findLink = function (elem){
        var msgId = $(elem).prop("href").match(/comment-(\d+)/)[1];
        var msgObj = $("#comment-" + msgId);
       return msgObj.find('.title');
    };

var processMouseOver = function (elem){
       var links = findLinks($('#comments'), elem);
       if(links.length > 0)
        {
          processLink(links, elem);
          return false;
        }
        console.log('not found');
        if($('.2ch_popup').length > 0 && $('.2ch_popup').attr('rel') == $(this).attr('href'))
            return false;        
        $.ajax({type: "GET", url: $(this).attr('href')})
        .done(function(msg){
            msg = $(msg);
            msg = findLinks(msg, elem);
            processLink(msg, elem);
        })
    };
    
var processMouseOverComments = function (elem, elemshow){
          processLink(elem, elemshow);
          return false;
    };

var processMouseOut = function (){
    if (locatTimer){
        clearTimeout(locatTimer);
        locatTimer = null;
    }
    locatTimer = setTimeout(function(){    
        if(!mouseOnPopup){
            locatTimer = null;
            $('.2ch_popup').remove(); 
        }
    }, 300);
};

var processTag = function (idx,elem){
        $(elem).mouseover(function(){processMouseOver(elem); })
        .mouseout(function(){processMouseOut();})
    };

var processLinkComments = function (elem, link){

       link.mouseover(function(){processMouseOverComments(elem, link); })
           .mouseout(function(){processMouseOut();});
    };
    
        
var processTitle = function (index, url, element) {
		var replyUrl = $("a", element).prop("href");
		var replyMsgId = replyUrl.match(/.*[\?\&]?cid=(\d+).*/)[1];
		var nick = $("a[itemprop='creator']", element.next()).text();
		if (nick == null || nick == "")
			nick = "anonymous";
					
		var msgId = element.parent().prop("id").match(/comment-(\d+)/)[1];

		$("#comment-" + replyMsgId).each(function() {

			var href = url + "#comment-" + msgId;
			var link = $("<a href='" + href + "'>" + nick + "</a>");
			processLinkComments(element, link);

			var container = $(".msg_body", $(this));
			var answersClass = "answers";
			var answers = $("." + answersClass, container);
			if (!answers.length) {
				answers = $("<div class='" + answersClass + "'>Ответы: </div>");
				answers.css("font-size", "smaller");
				container.append(answers);
			}
			if (answers.children().length) {
				answers.append(", ");
			}
			answers.append(link);
		});
    };
    
	$(".title").has("a[data-samepage='samePage']").each(function(index) {processTitle(index, locationurl, $(this));});
    $('div.title > a').each(function (idx,elem){ processTag(idx,elem); });

}());

Да, да наш девиз: «Ни года без велосипеда». И потом последняя выложенная там версия меня не устраивала по функционалу, а всё остальное что было найдено, скорее не работало чем выполняло задуманное.

Проверялось всё в Scriptish в FF 26.0 в теме Tango. И выглядит оно примерно так.

★★★

Ответ на: комментарий от rikimaru

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

mm3 ★★★ ()

двач-стайл функциональность

бгг

ritsufag ★★★★★ ()
@@ -42,7 +42,7 @@
                 popup.find('div.msg_title > a').each(function (idx,elem){processTag(idx,elem);});
                 popup.find('div.answers > a').each(function (idx,elem){processLinkComments(findLink(elem),$(elem));});
 
-                popup.mouseenter(function(){processMouseEnter();}).mouseleave(function(){processMouseLeave();});
+                popup.mouseenter(function(){processMouseEnter();}).mouseleave(function(){$(this).remove();});
                 
                 if (locatTimer){
                     clearTimeout(locatTimer);

Так получше, хотя в идеале родительский попап не должен исчезать, пока курсор находится на одном из ответов на него. Код говно, да.

anonymous ()
Ответ на: комментарий от anonymous

эээ батенька, а флаг кто будет сбрасывать который не позволял убрать первый попап?

вобщем я пока остановился на такой версии http://userscripts.org/scripts/review/200315 при этом исправил поломанную до-загрузку по ajax и уменьшил количество проходов при старте. А вот как убрать потомка при переходе с него на родителя я пока не придумал.

mm3 ★★★ ()
Ответ на: комментарий от mm3

Нашел багу в этой версии. Если переходить по темам по Ctrl-Arrow left, то с включенным скриптом срабатывает только один переход после обновления(F5), нажатие этой комбинации после перехода уже не срабатывает.

Еще уведомление не сбросилось после захода в «Уведомления», но это я пока не уверен в том что скрипт виноват.

Loki13 ★★★★★ ()
Ответ на: комментарий от Loki13

УМВР... а фаербаг в консоли случайно ни на что не ругается?

mm3 ★★★ ()
Ответ на: комментарий от mm3

Вот такая ошибка появляется в консоли файрфокса после включения скрипта

TypeError: $(...).ajaxForm is not a function
Loki13 ★★★★★ ()

Таймаут бы добавить перед появлением попапа, хотя бы в пару миллисекунд. Мельтешит ужасно, особенно когда тупо кликаешь на ссылку перехода к ответу/родительскому сообщению. А так, годнота (за код не скажу).

Axon ★★★★★ ()
Последнее исправление: Axon (всего исправлений: 1)
Ответ на: комментарий от Loki13

а если удалить строчку

$.ajax({type: "GET", url: $(elem).attr('href')}).done(function(msg){response = $(msg);processLink(findLinks(msg,elem), elem);})
то тоже ругается? и бага проявляется?

mm3 ★★★ ()
Ответ на: комментарий от mm3

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

Axon ★★★★★ ()
Ответ на: комментарий от Axon

...уведомления сбрасываться перестали...

эмм а если в шапке поменять

// @match      http://www.linux.org.ru/*
// @match      https://www.linux.org.ru/*
// @namespace http://www.linux.org.ru/*
// @namespace https://www.linux.org.ru/*
// @include http://www.linux.org.ru/*
// @include https://www.linux.org.ru/*
на
// @match      http://www.linux.org.ru/forum/*
// @match      https://www.linux.org.ru/forum/*
// @namespace http://www.linux.org.ru/forum/*
// @namespace https://www.linux.org.ru/forum/*
// @include http://www.linux.org.ru/forum/*
// @include https://www.linux.org.ru/forum/*
то что нибудь поменяется?

mm3 ★★★ ()
Ответ на: комментарий от mm3

Да. Правда, лиса ругается, что в крипте @grant не прописан.

Axon ★★★★★ ()

Думаю, что за знакомый вид ответов, потом узнал в коде некоторые свои строки. )

orm-i-auga ★★★★★ ()
Ответ на: комментарий от mm3

то тоже ругается? и бага проявляется?

Да, ничего не меняется.

На самом деле ошибка в строке:

$("#regform").ajaxForm(c);

В файле lor.js. Т.е. получается что скрипт как-то лор ломает

Loki13 ★★★★★ ()
Ответ на: комментарий от mm3

Подозреваю, что это из-за того, что по умолчанию в «included pages» вообще пусто.

Axon ★★★★★ ()
Ответ на: комментарий от orm-i-auga

Очень даже может быть, на единоличное авторство я и не претендую...

mm3 ★★★ ()
Ответ на: комментарий от mm3

Кстати, если смержишься с текущей версией, то будет у тебя поддержка ответов со следующих страниц.

orm-i-auga ★★★★★ ()
Ответ на: комментарий от orm-i-auga

ещё бы вспомнить откуда взят твой скрипт чтобы смержиться, но чую там просто на старте качается весь тред и висит в фоне.

mm3 ★★★ ()
Ответ на: комментарий от MiniRoboDancer

именно в минимально раздражающем виде

mm3 ★★★ ()
Ответ на: комментарий от mm3

В профиле есть ссылка. Качается, да, но не висит. Пока другого выхода не вижу. )

orm-i-auga ★★★★★ ()
Ответ на: комментарий от mm3

с минимальным комфортом
в минимально раздражающем виде

Противоположные вещи же кагбэ.

MiniRoboDancer ★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.