Aaaaaaaaaaaaa!
NIGDY NIE UŻYWAJ eval()
w ten sposób bo osobiście wsadzę łapy w monitor i cię UDUSZĘ! ;)
W ogóle nie używaj eval()
, w 99.9999993% przypadków, gdy chcesz go użyć, tak naprawdę jest niepotrzebne. eval()
jest wolne, niebezpieczne i nie chroni przed błędami składni. Narzędzia do sprawdzania jakości kodu JS w ogóle nie pozwalają na użycie tej funkcji.
JavaScript ma mnóstwo sposobów na ominięcie evala()
. Są to sposoby szybsze, bezpieczniejsze, bardziej przejrzyste.
Tutaj np. użyłeś eval()
, bo zapewne nie znałeś jednej z podstawowych notacji obiektowych w JavaScripcie. W JS nie musisz zawsze pisać obiekt.nazwaWlasnosci
. Możesz też pisać obiekt["nazwaWlasnosci"]
(dzięki czemu nazwa własności może zawierać nawet spacje, np. obiekt["nazwa własności"]
). W nawiasach kwadratowych możesz podać po prostu string z nazwą własności, ale możesz też podać jakiekolwiek wyrażenie, które może zostać zamienione na string.
Poniższe linie są równoważne:
obj.nazwaWlasnosci = "abc";
obj["nazwaWlasnosci"] = "abc";
obj["nazwa" + "Wlasnosci"] = "abc"; // tak tak! łączymy stringi -- nie ma problemu
Taki sam efekt da poniższy kod:
var zmiennaZNazwaWlasnosci = "nazwaWlasnosci";
obj[zmiennaZNazwaWlasnosci] = "abc";
I tego ostatniego przykładu użyjemy, żeby przerobić to co Ty tam nasz w tym brzydkim evalu()
.
Masz tak:
// bleeeeeeee!
eval("document.getElementById('"+obj[i].id+"').style."+attr+"='"+val+"';");
To to samo co:
// ładniej
document.getElementById(obj[i].id).style[attr] = val;
Prawda, że czyściej? I szybciej i lepiej.
Tak naprawdę, tę linijkę możesz jeszcze uprościć, bo masz tam coś bez sensu.
Wykorzystujesz pole id
z obiektu obj[i]
, żeby za pomocą document.getElementById()
dostać się do... obj[i]
. Czyli mówisz: mam tu pewien element w zmiennej obj[i]
. Wezmę jego id
i użyję document.getElementById
, które zwróci mi... ten sam element, który już miałem w zmiennej obj[i]
. LOL :). Trochę się zakręciliśmy.
Zamiast document.getElementById(obj[i].id)
możesz więc napisać po prostu obj[i]
.
Czyli:
// jeszcze ładniej
obj[i].style[attr] = val;
Co do tego, że musisz używać backgroundColor
zamiast background-color
to co Ci to w sumie przeszkadza? To aż taki przypał?
Jeśli tak Ci to przeszkadza, to możesz na początku funkcji zmienić nazwę stylu z CSS-owej (z myślnikami) na JS-ową (bez myślników i w notacjiWielbłądziej). Można to zrobić, dodając na początek funkcji takie coś:
attr = attr.replace(/-(.)/g, function(wholeMatch, firstLetterOfNextWord) {
return firstLetterOfNextWord.toUpperCase();
});
Może lepiej by było zapisać sobie JS-ową nazwę stylu w nowej zmiennej żeby nie modyfikować parametru funkcji (to raczej zła praktyka), ale to już drobnostka.
Aha: ta funkcja zadziała bez problemu dla border-top-style
.
Ogólnie z Twoją funkcją setStyle
są pewne problemy koncepcyjne. IMO ona powinna tylko ustawiać styl elementu el
, a nie wszystkich elementów o tej samej klasie. To sugeruje, że być może chcesz użyć tej funkcji w zły sposób, gdy istnieje lepsza alternatywa do takiego zmieniania stylu. Co dokładniej chcesz zrobić?