wtorek, maja 18, 2010

Ściana, czyli rozbijam się na onclick ;-)

Zabawiając się z Buzz Troll Removerem dotarłem już do etapu na którym potrafię ukryć trollowe buzzy (trollbuzzy?) w taki sposób, że gdy użytkownik zdecyduje, że jednak odtrolluje danego delikwenta to jego komentarze znów się pojawią.

Niby super, ale jest jedno ale ;-) a mianowicie to, że wtedy nie działa guziczek "hide", który umiejscawiany jest przez BTR obok nicka użytkownika Buzza [buzzżytkownika? ;-)]. Próbowałem wielu sposobów i jak na razie odbijam się od ściany....

Guziczki tworzę tak:
var parent = b[i].parentNode;
var button = document.createElement("button");
button.innerHTML = "hide";
button.setAttribute("name",b[i].innerHTML);
button.setAttribute("link",b[i].href);
button.onclick=function() {
blockUser(this);
}

b[i].setAttribute("modifiedByBuzzTrollRemover","true");
parent.insertBefore(button,b[i].nextSibling);

Element b[i] to i-ty tag A na stronie spełniający jeszcze tam pewne wymogi.
Istotne jest to jak przypisywany jest kod do onclick.

Niestety użycie button.setAttribute("onclick","blockUser(this);") powoduje tylko tyle, że każde kliknięcie guziczka powoduje zgłoszenie na konsoli błędu mówiącego, że JavaScript nie może namierzyć funkcji blockUser(elem).

Samo kasowanie posta wygląda mniej więcej tak:
b[i].parentNode.parentNode.setAttribute("rBTK",b[i].parentNode.parentNode.innerHTML);
b[i].parentNode.parentNode.setAttribute("rBTKLink",b[i].href);
removed.push(b[i].parentNode.parentNode);
if (method*1==1) {
b[i].parentNode.parentNode.innerHTML="";
} else {
b[i].parentNode.parendNode.innerHTML="<span style='background:yellow;'>Post of "+b[i].innerHTML+" deleted by Buzz Troll Remover</span>";
}


Gdzie istotna jest pierwsza linia, która w atrybucie nad-nad-rodzica ;-) zapisuje treść kasowanego buzza.

Odnowienie Buzza wygląda tak elem.innerHTML = elem.getAttribute("rBTK");.

I problem jest taki, że onclick stworzone tak jak je tworzę w ogóle nie jest widoczne w tym co zostanie włożone do innerHTML, a jeśli użyję metody z przypisaniem stringa do onclick to co prawda jest widoczne w innerHTML, ale nie działa :-)

I pisząc to wpadłem na pomysł by jak zwykle rozwiązać problem przy pomocy oszustwa :-) Co dowodzi, że programowanie jest naprawdę sztuką oszukiwania.

A gdybyż tak "kopię" buzza, którą przechowuję, w momencie gdy będzie znów przypisywana do elementu potraktować wyrażeniem regularnym, które zamorduje wszystko od "<button" do "</button>", oraz wywali atrybut modifiedByBuzzTrollRemover? Wtedy mechanizm dodawania guziczków zobaczy taki wpis, stwierdzi, że wpis nie posiada guziczka i mu go doda....... :-)

Czyli jak dobrze pójdzie problem zrozumienia czemu onclick dodawany przez element.onclick="..." czy element.setAttribute("onclick","....") nie działa nie będzie ważny ;-) ważne będzie tylko napisanie odpowiedniego wyrażenia regularnego :-)


Podobne postybeta
IE suxx ;-)
Zasada numer 1: sprawdzaj oczywiste
Go dla Java'owca ;-) odcinek 2 "kontenery dwa ;-)"
AppInventor - pierwsze wrażenia i pierwsze programy :-)
Buzz Troll Remover v0.3 - potęga guzików