Mam sobie taki kod jak poniżej, 3linki zmieniają kolor diva na biały, szary lub czarny.
Przy zmianie zapisywane jest ciastko z kolorem.
Problem w tym, ze po odświeżeniu wszystko się resetuje, tak jakby nie czytało stanu ciastka.
Co jest nie tak w tym kodzie?
.white {
background-color:#FFFFFF;
color:#333333;
}
.grey {
background-color:#999999;
color:#FFFFFF;
}
.black {
background-color:#333333;
color:#FFFFFF;
}
<script type="text/javascript"> window.addEvent('domready', function(){
Fx.Morph = Fx.Styles.extend({
start: function(className){
var to = {};
$each(document.styleSheets, function(style){
var rules = style.rules || style.cssRules;
$each(rules, function(rule){
if (!rule.selectorText.test('\.' + className + '$')) return;
Fx.CSS.Styles.each(function(style){
if (!rule.style || !rule.style[style]) return;
var ruleStyle = rule.style[style];
to[style] = (style.test(/color/i) && ruleStyle.test(/^rgb/)) ? ruleStyle.rgbToHex() : ruleStyle;
});
});
});
return this.parent(to);
}
});
Fx.CSS.Styles = ["backgroundColor", "backgroundPosition", "color", "width", "height", "left", "top", "bottom", "right", "fontSize", "letterSpacing", "lineHeight", "textIndent", "opacity"];
Fx.CSS.Styles.extend(Element.Styles.padding);
Fx.CSS.Styles.extend(Element.Styles.margin);
Element.Styles.border.each(function(border){
['Width', 'Color'].each(function(property){
Fx.CSS.Styles.push(border + property);
});
});
var myMorph = new Fx.Morph('container', {wait: false});
$('white').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('white');
Cookie.set("style", "white", {duration: 15});
});
$('grey').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('grey');
Cookie.set("style", "grey", {duration: 15});
});
$('black').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('black');
Cookie.set("style", "black", {duration: 15});
});
if(Cookie.get("style") == "black"){
myMorph.set('black');
}else if(Cookie.get("style") == "grey"){
myMorph.set('grey');
}else{
myMorph.set('white');
}
});
<div id="container" class="widthwide">
<ul style="list-style-type: none;"> <li style="display:inline;"><a href="#" id="white" name="white">white
</a></li> <li style="display:inline;"><a href="#" id="grey" name="grey">grey
</a></li> <li style="display:inline;"><a href="#" id="black" name="black">black
</a></li>
-----------------------------
---- UPDATE ------------------
---------------------------------------------------------------------------------------------Tylko częściowo rozwiązałęm problem. Dałem
myMorph.start() zamiast
myMorph.set()działa jednak tylko dla jednego wywołania (jedno ciastko - jedno wywołąnie
myMorph.start() )
-czyli np. tylko do obsługi koloru.
Gdy jednak kod rozszerzę o obsługe np. rozmiaru czcioki (tu klasa
fontsmall)
...zapiszę drugie ciacho i dodam jeszcze jedno wywołanie
myMorph.start() pojawia się znowu problem.
-oto klikam na link
fontsmall -ok zmienia rozmiar fontu, klikam na
black -zmienia kolor tła, daję odśwież
...i tło się resetuje a czcionka jest ok bo jak powinna zminimalizowana.
Wniosek, przy kilkukrotnym wywołaniu
myMorph.start() zastosowane są tylko zmiany z ostatniego
czyli np. dla:
myMorph.start('fontsmall');
myMorph.start('black');zostanie tylko tło zmienione na czarne, a czcionka pozostanie niezmieniona.
Co i jak zmienić by rozwiązać ten problem?
.white {
background-color:#FFFFFF;
color:#333333;
}
.grey {
background-color:#999999;
color:#FFFFFF;
}
.black {
background-color:#333333;
color:#FFFFFF;
}
.fontsmall {
font-size: 10px;
}
<script type="text/javascript"> window.addEvent('domready', function(){
Fx.Morph = Fx.Styles.extend({
start: function(className){
var to = {};
$each(document.styleSheets, function(style){
var rules = style.rules || style.cssRules;
$each(rules, function(rule){
if (!rule.selectorText.test('\.' + className + '$')) return;
Fx.CSS.Styles.each(function(style){
if (!rule.style || !rule.style[style]) return;
var ruleStyle = rule.style[style];
to[style] = (style.test(/color/i) && ruleStyle.test(/^rgb/)) ? ruleStyle.rgbToHex() : ruleStyle;
});
});
});
return this.parent(to);
}
});
Fx.CSS.Styles = ["backgroundColor", "backgroundPosition", "color", "width", "height", "left", "top", "bottom", "right", "fontSize", "letterSpacing", "lineHeight", "textIndent", "opacity"];
Fx.CSS.Styles.extend(Element.Styles.padding);
Fx.CSS.Styles.extend(Element.Styles.margin);
Element.Styles.border.each(function(border){
['Width', 'Color'].each(function(property){
Fx.CSS.Styles.push(border + property);
});
});
var myMorph = new Fx.Morph('container', {wait: false});
$('white').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('white');
Cookie.set("style1", "white", {duration: 15});
});
$('grey').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('grey');
Cookie.set("style1", "grey", {duration: 15});
});
$('black').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('black');
Cookie.set("style1", "black", {duration: 15});
});
$('fontsmall').addEvent('click', function(e){
new Event(e).stop();
myMorph.start('fontsmall');
Cookie.set("style2", "fontsmall", {duration: 15});
});
s1=Cookie.get("style1");
s2=Cookie.get("style2");
myMorph.start(s1);
myMorph.start(s2);
tekst=document.getElementById("tekst");
tekst.innerHTML='style1:'+s1+' style2:'+s2;
});
<div id="container" class="widthwide">
<ul style="list-style-type: none;"> <li style="display:inline;"><a href="#" id="white" name="white">white
</a></li> <li style="display:inline;"><a href="#" id="grey" name="grey">grey
</a></li> <li style="display:inline;"><a href="#" id="black" name="black">black
</a></li> <li style="display:inline;"><a href="#" id="fontsmall" name="black">fontsmall
</a></li>
Ten post edytował neverever 11.11.2007, 19:03:44