Összecsukható kommentek a hupon

Ezt ugyan 2019-ben írtam még meg, egy évvel később nevergone azt ígérte, hogy majd megnézi, de úgy látszik elfelejtette, vagy nem kellett neki. Mindenesetre, most egy kicsit optimalizáltam, meg finomítottam a dolgon, úgyhogy közzéteszem. Elég hasznos tud lenni, ha valaki beböffentett a topikodba egy offtopik kommentet, ami alatt keletkezett egy hatszáz kommentes flametenger, amin amúgy lehet kilométer hosszan átgörgetni, így meg klikk és close.

Használat: ez a micsoda hozzáad két gombot az összes kommenthez. Az egyik a close tree, ami minden kommentet eltüntet, ami ahhoz a kommenthez tartozik (rekurzívan, tehát teljes összecsukás), a másik pedig a close children, ami ugyanezt teszi ennek a kommentnek a közvetlen "gyerekeivel", azaz a komment alatt csak az első "szinten" lévő - közvetlen "gyerek" - kommentek fognak látszani. Mindkét gomb toggle-ös, azaz close/open.
Aki akarja, berakja custom JS-be és window.onload()-ból meghívatja a closeupable_hup() függvényt. Csak classic Operában teszteltem (update: krómban is), de elvileg, ha ott megy, akkor az újabbakban is mennie kéne...ajándék nyihaha, nyet kukucska protkó. Report bugz, if occurz.

function get_related_indented_node(clicked)
{
	var article = clicked.parentNode.parentNode.parentNode.parentNode;
	var next_sibling = article.nextSibling;
	var seek = true;
	while (seek)
	{
		if (next_sibling.nextSibling == undefined)
		{
			seek = false;
		}
		if ((next_sibling.classList != undefined) && (next_sibling.classList.contains('indented')))
		{
			return next_sibling;
		}
		if (seek)
		{
			next_sibling = next_sibling.nextSibling;
		}
	}
	return undefined;
}

function toggle_tree(el)
{
	var indented = get_related_indented_node(el);
	if (indented != undefined)
	{
		if (el.dataset['tree_closed'] != '1')
		{
			indented.style.height = '0px';
			indented.style.overflow = 'hidden';
			el.innerText = '[open tree]';
			el.dataset['tree_closed'] = '1';
		}
		else
		{
			indented.style.height = '';
			indented.style.overflow = '';
			el.innerText = '[close tree]';
			el.dataset['tree_closed'] = '0';
		}
	}
}

function toggle_children(el)
{
	var indented = get_related_indented_node(el);
	if (indented != undefined)
	{
		var sub_indented = indented.getElementsByClassName('indented');
		if ((sub_indented != undefined) && (sub_indented.length != undefined) && (sub_indented.length > 0))
		{
			var closed = el.dataset['children_closed'] != '1';
			if (closed)
			{
				var height = '0px';
				var overflow = 'hidden';
				el.innerText = '[open children]';
				el.dataset['children_closed'] = '1';
			}
			else
			{
				var height = '';
				var overflow = '';
				el.innerText = '[close children]';
				el.dataset['children_closed'] = '0';
			}
			for (var j = 0; j < sub_indented.length; ++j)
			{
				sub_indented[j].style.height = height;
				sub_indented[j].style.overflow = overflow;
			}
			var sub_tree_closers = indented.getElementsByClassName('tree_closer');
			if ((sub_tree_closers != undefined) && (sub_tree_closers.length != undefined) && (sub_tree_closers.length > 0))
			{
				for (var j = 0; j < sub_tree_closers.length; ++j)
				{
					sub_tree_closers[j].innerText = closed ? '[open tree]' : '[close tree]';
					sub_tree_closers[j].dataset['tree_closed'] = closed ? '1' : '0';
				}
			}
		}
	}
}

function closeupable_hup()
{
	var tree_closer = document.createElement('SPAN');
	tree_closer.className = 'tree_closer';
	tree_closer.innerText = '[close tree]';
	tree_closer.style.cursor = 'pointer';
	tree_closer.dataset['tree_closed'] = '0';
	var tree_closerc;

	var children_closer = document.createElement('SPAN');
	children_closer.className = 'children_closer';
	children_closer.innerText = '[close children]';
	children_closer.style.cursor = 'pointer';
	children_closer.dataset['children_closed'] = '0';
	var children_closerc;

	var comments = document.getElementsByClassName('comment');
	if ((comments != undefined) && (comments.length != undefined))
	{
		for (var i = 0; i < comments.length; ++i)
		{
			var submitted = comments[i].getElementsByClassName('comment__submitted');
			if ((submitted != undefined) && (submitted.length != undefined) && (submitted.length > 0))
			{
				tree_closerc = tree_closer.cloneNode(true);
				tree_closerc.onclick = function ()
				{
					toggle_tree(this);
				};
				children_closerc = children_closer.cloneNode(true);
				children_closerc.onclick = function ()
				{
					toggle_children(this);
				};
				submitted[0].appendChild(tree_closerc);
				submitted[0].appendChild(children_closerc);
			}
		}
	}
}

Hozzászólások

Szerkesztve: 2022. 07. 13., sze – 15:01

+1

chrome alatt sajnos nem megy igy elsore, de majd meg nezegetem. legalabbis ha azt mondom a "Custom JavaScript for Websites 2"-nek hogy window.onload=function() { alert("xyz!"); } az jo, de ha alert() helyett closeable_hup();-ot hivok akkor nemsokmindent csinal... 

Koszi! Frissitettem de meg mindig nem jo :( Nem vagyok egy nagy dzsavaszkript-magus, szoval jo kerdes hogy igy krom alatt hogyan tudnam most ezt ennel jobban kidebbugolni. De hasznos featura lenne ez, elegge, az biztos :)  Ah, szerk: megiscsak jo :) valamiert az ujrainditas mindig csodakra kepes... de erdekes mert a fentebbi alert()-es teszteknel meg nem kellett :/ Valodi internet!