поругайте js-быдлокод
вдохновившись этой темой решил написать свой велосипед добавляющий лору двач-стайл функциональность:
// ==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. И выглядит оно примерно так.