Al­le­gro Sel­ler Info 0.1.16

• tech • 482 słowa • 3 mi­nu­ty czy­ta­nia

Mój skrypt użyt­kow­ni­ka na al­le­gro do­ro­bił się ko­lej­nej ak­tu­ali­za­cji.

Za­uwa­ży­łem dziś kilka dziw­nych rze­czy wy­stę­pu­ją­cych na li­stach z au­kcja­mi. Nie­któ­re ele­men­ty listy nie po­sia­da­ją wsta­wek z in­for­ma­cja­mi o sprze­da­ją­cym, a te nie­wi­docz­ne na pierw­szym pla­nie jakby “do­ła­do­wu­ją” się w miarę ich wy­świe­tle­nia. Do­ty­czy to tylko pierw­szej stro­ny ba­zo­wej listy - tej wi­docz­nej po bez­po­śred­nim za­ła­do­wa­niu stro­ny, bo ko­lej­ne pod­stro­ny ła­do­wa­ne asyn­chro­nicz­nie dzia­ła­ją już po­praw­nie.

Cześć z tych pro­ble­mów wy­ni­ka z faktu, że nie­któ­re ele­men­ty <article/> na li­stach au­kcji nie po­sia­da­ją react-​owych obiek­tów, z któ­rych to ko­rzy­sta skrypt. Po­wo­du­je to nie­spo­dzie­wa­ny undefined wy­wa­la­ją­cy dal­sze dzia­ła­nie kodu. Drob­na po­praw­ka w funk­cji getReactInst ni­we­lu­je wy­wa­la­nie się, ale ca­ło­ścio­wy pro­blem po­zo­sta­je.

Wszyst­ko wska­zu­je na to, że po­cząt­ko­we ele­men­ty listy są takim pla­ce­hol­de­re­rem, a do­pie­ro przy fi­zycz­nym wy­świe­tle­niu w View­Por­cie bu­do­wa­na i ren­de­ro­wa­na jest przez Re­ac­ta do­ce­lo­wa wer­sja danej au­kcji na li­ście. Stąd wy­ni­ka pro­blem braku tych po­szu­ki­wa­nych obiek­tów __reactInternalInstance$* w nie­któ­rych ele­men­tach listy.

Tro­chę po­de­bu­go­wa­łem kod ser­wi­su i na szczę­ście szyb­ko udało mi się zna­leźć cie­ka­wy punkt za­cze­pie­nia. Dzię­ki temu spo­koj­nie mo­głem olać głęb­sze za­an­ga­żo­wa­nie w iry­tu­ją­ce i cza­so­chłon­ne ba­bra­nie się w wnętrz­no­ściach kodu stro­ny. Przy prze­bu­do­wie ele­men­tów <article/> z au­kcja­mi na li­ście ist­nie­ją­ce ele­men­ty w DOM-​ie nie są mo­dy­fi­ko­wa­ne, są po pro­stu usu­wa­ne, a w ich miej­sce do­da­wa­ne nowe zbu­do­wa­ne przez Re­ac­ta. To po­zwo­li­ło mi w łatwy spo­sób roz­wią­zać pro­blem z “do­ła­do­wy­wa­niem” za­war­to­ści listy przez re­ak­cję na zmia­ny w drze­wie za po­mo­cą MutationObserver-a.

// obserwuj zmiany na liscie ofert i uaktualniaj dodawane nowe elementy
var mutationObserver = new MutationObserver(function (mutations) {
	for (var mutation of mutations) {
		for (var node of mutation.addedNodes) {
			if (node.nodeName == 'ARTICLE')
				UpdateOffer(node);
		}
	}
});
mutationObserver.observe(listNode, { childList: true, subtree: true });

Taki kod za­ła­twia też po­praw­ne ob­słu­że­nie nowej za­war­to­ści listy au­kcji po asyn­chro­nicz­nym za­ła­do­wa­niu ko­lej­nej pod­stro­ny. Zatem mo­głem po­zbyć się po­przed­nie­go ob­ser­wa­to­ra cze­ka­ją­ce­go na zmia­nę klasy świad­czą­cej o za­koń­cze­niu ope­ra­cji ła­do­wa­nia no­wych au­kcji i prze­bu­do­wy listy… co fi­nal­nie upro­ści­ło jesz­cze bar­dziej ist­nie­ją­cy kod.

Obec­na funk­cja UpdateOffer to nieco zmo­dy­fi­ko­wa­na wcze­śniej­sza UpdateList ope­ru­ją­ca na po­da­nym ele­men­cie za­miast na li­ście do­stęp­nych ele­men­tów. Do­dat­ko­wo olewa ja­kie­kol­wiek dzia­ła­nie, gdy w danym ele­men­cie do­da­no już wstaw­kę i można ją wy­wo­ły­wać wie­lo­krot­nie na tym samym ele­men­cie.

Po­zwa­la to na pro­ste za­bez­pie­cze­nie się na wy­pa­dek, gdyby ob­ser­wa­tor zo­stał uru­cho­mio­ny już po pierw­szych ak­tu­ali­za­cjach wi­docz­nych ele­men­tów po za­ła­do­wa­niu się stro­ny i nie­któ­re ele­men­ty nigdy nie zo­sta­ły­by “po­pra­wio­ne”.

// zaktualizuj obecne oferty na liscie, na wypadek gdyby powyzszy
// MutationObserver zostal uruchomiony juz po zmianach...
for (var node of listNode.getElementsByTagName('article'))
	UpdateOffer(node);

A tak wy­star­czy “prze­le­cieć” po wszyst­kich do­stęp­nych ele­men­tach listy, jak to ro­bio­no wcze­śniej.

Nie­ste­ty znów wi­docz­ny jest jakiś roz­jazd w obiek­tach al­le­gro­wych, bo na au­kcjach z “Al­le­gro Lo­kal­nie” w prop­sach bra­ku­je nie­któ­rych da­nych i nazwa użyt­kow­ni­ka w ta­kich po­zy­cjach wy­świe­tla­na jest jako “un­de­fi­ned”…

Nowa wer­sja skryp­tu - 0.1.16 do­stęp­na jest już w moim repo User­Scripts. Auto-​aktualizacje wbu­do­wa­ne w UserJs-​owe sil­nik po­win­ny za­dbać o au­to­ma­tycz­na ak­tu­ali­za­cję skryp­tu… A teraz można cze­kać na ko­lej­ne zmia­ny i pro­ble­my ;)

Ko­men­ta­rze (0)

Dodaj ko­men­tarz

/do­zwo­lo­ny mark­down/

/nie zo­sta­nie opu­bli­ko­wa­ny/