UserJS: OLX.pl Modern UI Fix

tech • 899 słów • 5 minut czytania

Nowy design serwisu Olx jaki pojawił się nie tak dawno jest, mówiąc krótko i zwięźle, brzydki. Wielkie i kanciaste z dziwną czcionką… no, czyli nowoczesne, podążające za chwilową modą i trendami. Nie podobają mi się szczególnie te wielkie, przewymiarowane elementy. Jest to bardzo widoczne na listach ogłoszeń, gdzie obecnie ledwo mieszczą mi się 4 elementy na całym ekranie.

Problem ten chwilowo udało mi się rozwiązać ustawiając w przeglądarce powiększenie strony na 80%. Niestety z czasem zaczęło mi doskwierać więcej niedociągnięć, więc postanowiłem dla swojej wygody co nieco poprawić UserScript-em.

Widoczne efekty działania “OLX.pl Modern UI Fix” przedstawia powyższy obrazek.

Mniejszy ‘zoom’

Pierwszą rzeczą jaką robi skrypt to właśnie zmiana powiększenia strony na 80%. Oczywiście za pomocą właściwości zoom CSS-a na elemencie <body/>. Okazuje się że zoom nie jest standaryzowany i taki Firefox go nie wspiera, zatem może kiedyś zmuszony będę to zmienić…

body {
	zoom: 0.8 !important;
}

No i teraz jakoś to wygląda. Na listach ogłoszeń widać już przynajmniej 5 ofert na ekranie (900px w pionie).

Żeby zmiana powiększenia była niezauważalna dla użytkownika (migotania przy ładowaniu i wyświetlaniu strony) skrypt ustawiony ma atrybut @run-at na document-start. Dzięki czemu odpala się już na początku budowania DOM-a i ustawiona właściwość jest widoczna dla silnika zanim przetworzy i wyrenderuje całą treść strony.

Oczywiście w takim przypadku poza wstrzyknięciem dodatkowych styli, cała inna (dalsza) zawartość skryptu poprawiająca UI i operująca na drzewie DOM strony musi poczekać do jego pełnego zbudowania (załadowania strony).

document.addEventListener('DOMContentLoaded', function() {
	[...]
	FixUI();
});

Funkcja FixUI agreguje wszystkie inne wywołania poprawek.

Wygodniejsza paginacja

Po przeskalowaniu strony zmniejszył się też paginator na dole stron listujacych oferty. Trochę ciężko trafić w linki prowadzące do następnej/poprzedniej strony, gdy zawierają tylko małe ikonki. Zdecydowanie lepsze byłoby zawarcie także tekstowych etykiet w tych odnośnikach. I to jest druga rzecz jaką “naprawia” mój skrypt.

W drzewie widać, że tekstowa zawartość linka istnieje, ale zawierające je elementy <span/> mają ustawione display na none. Zapewne są to elementy z przeznaczeniem odczytania przez różne czytniki. Myślałem, nawet żeby je wykorzystać, ale paskudnie to wyglądało - szczególnie te «, no i trochę upierdliwego babrania, aby to przerobić.

Postanowilem istniejące niepotrzebne elementy “wyłaczyć” i dodać swoje odpowiednio ostylowane.

const links = document.getElementsByClassName('pageNextPrev');
if (links.length != 2)
	return;

links[0].insertAdjacentHTML('beforeend', `<span class="omuif-link">poprzednia</span>`);
links[1].insertAdjacentHTML('beforeend', `<span class="omuif-link">następna</span>`);

Oczywiście wraz z “ikonkami” w pseudo-elementach CSS, jak przystało na porządną robotę :)

.prev .pageNextPrev .omuif-link::before { content: "\\E04E"; }
.next .pageNextPrev .omuif-link::after { content: "\\E062"; }

Szczegóły stylowania i bebechów do podejrzenia w źródłach.

Czytelniejsza lista ofert

Idąc dalej z poprawkami zdecydowałem się na drobne zmiany na listach z ofertami. Przyzwyczaiłem się do stylu Allegrowego, gdzie cena znajduje się po lewej stronie, pod tytułem, tuż obok miniaturki. I gdy często przechodziłem między zakładkami w przeglądarce to niewygodne było ciągłe przełączanie wzroku na przeciwną stronę…

Można się zdziwić, ale listy ofert oparte są na tabelkach, zagnieżdżonych tabelkach… To chyba jakiś chory żart, aby w XXI wieku design oprzeć na semantycznych elementach tabelkowych! A może, co wydaje się bardziej prawdopodobne, wykorzystano stare fragmenty kodu w nowej odsłonie?

Wygląda to starszynie, ale na szczęście łatwo poruszać się po tym gąszczu. Jako uchwyt do każdej oferty można zastosować jedną z ustawionych klas kolumn. Mój kod “łapie” po photo-cell, a z tego łatwo przejść do kolejnych elementów.

for (const node of document.getElementsByClassName("photo-cell")) {

	// td: photo-cell title-cell td-price
	var title = node.nextElementSibling;
	var price = title.nextElementSibling;

}

Finalnie, żeby się za dużo nie narobić, przerzucam całą zawartość kolumny z ceną do tej zawierającej tytuł. Po wywaleniu starych styli i dodaniu nowych fragment ten renderuje się idealnie.

	// move price div into title div
	var div = title.firstElementChild.appendChild(price.firstElementChild);
	div.removeAttribute('class');
	// minimalize td width
	price.setAttribute('width', 30);

No i trzeba dostosować szerokość kolumn, bo to tabelki. Ostatnią, już pustą komórkę zminimalizować ile się da, aby nie zajmowała za dużo miejsca. Tylko nie do zera, bo w kolejnym wierszu w ostatniej kolumnie też są jakieś dane - ikonka do obserwowania… ach te tabelki!

Ładowanie nowych danych

Na koniec zawsze jest jakieś zaskoczenie. Tutaj też nie było inaczej. Przejście do kolejnych stron, jak przystało w obecnych czasach, często jest asynchronicznie wykonywane bez jawnego przeładowania strony, czyli Ajaxem. No i trzeba jakoś wykryć ten fakt, aby zaktualizować nową zawartość strony.

Często na czas ładowania pokazywane są jakieś animacje, a to wiąże się ze zmianami DOM-a łatwymi do wykrycia. Podobnie jak w wielu innych miejscach (np. allegro) zmieniają się klasy jakiegoś elementu - na stronach Olx-a jest to #listContainer - taki rodzic całego kontentu listy.

// the #listContainer has class 'loaderActive' on loading new data
var mutationObserver = new MutationObserver(function (mutations) {
	var updEvt = mutations.findIndex(m => m.attributeName == 'class' && m.target.className == '') != -1;
	if (updEvt)
		FixUI();
});
mutationObserver.observe(document.getElementById('listContainer'), { attributes: true });

Domyślnie nie ma on przypisanej żadnej klasy stylów, ale w czasie ładowania danych ustawiany jest atrybut class na wartość loaderActive. To pozwala w łatwy sposób za pomocą MutationObserver wykryć dokładny moment załadowania nowych danych.

Podsumowanie

I to tyle moich poprawek do gównianego interfejsu, reklamowanego jako nowoczesny UI! Na razie nie przewiduję innych zmian i funkcjonalności, ale nigdy nie wiadomo, czym nas jutro uraczą twórcy. Zawsze znajdzie się jakiś genialny pomysł do wdrożenia, jak chociażby te nieszczęsne tabelki ;)

Skrypt olx-pl-modern-ui-fix.user.js wylądował w moim gitowym repozytorium UserScripts. Można tam znaleźć wszystkie skrypty mojego autorstwa. Tak jak inne moje user.js-y ten także wspiera auto-aktualizacje, więc po pierwszej ręcznej instalacji nie trzeba martwić się nowymi wersjami. No chyba, że używany silnik nie wspiera tego mechanizmu.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/