Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   document.body.style.backgroundColor onclick (https://javascript.ru/forum/misc/29004-document-body-style-backgroundcolor-onclick.html)

Hekumok 10.06.2012 22:25

document.body.style.backgroundColor onclick
 
почему в этом скрипте при третем нажатии на кнопку ничего не происходит (первые два нажатия работают норм):
function color() {
if (document.body.style.backgroundColor == '') return document.body.style.backgroundColor='#f00';
if (document.body.style.backgroundColor = '#f00') return document.body.style.backgroundColor='#0f0';
if (document.body.style.backgroundColor = '#0f0') return document.body.style.backgroundColor='#f00';
} ;

Кнопка:
<input onclick="color();" value="Жми" type="button">

lord2kim 10.06.2012 22:54

Цитата:

Сообщение от Hekumok (Сообщение 180682)
почему в этом скрипте при третем нажатии на кнопку ничего не происходит (первые два нажатия работают норм):
function color() {
if (document.body.style.backgroundColor == '') return document.body.style.backgroundColor='#f00';
if (document.body.style.backgroundColor = '#f00') return document.body.style.backgroundColor='#0f0';
if (document.body.style.backgroundColor = '#0f0') return document.body.style.backgroundColor='#f00';
} ;

Кнопка:
<input onclick="color();" value="Жми" type="button">

ну я бы поставил для начала знак "==" в условиях вместо "="...вроде после етого усе робит)

Hekumok 10.06.2012 23:01

Цитата:

Сообщение от lord2kim (Сообщение 180687)
ну я бы поставил для начала знак "==" в условиях вместо "="...вроде после етого усе робит)

Уже пробовал, но всё равно попробовал еще раз - не работает

lord2kim 10.06.2012 23:11

Цитата:

Сообщение от Hekumok (Сообщение 180691)
Уже пробовал, но всё равно попробовал еще раз - не работает

хм...странно...в IE то пашет...

devote 10.06.2012 23:13

Цитата:

Сообщение от Hekumok
Уже пробовал, но всё равно попробовал еще раз - не работает

некоторые браузеры конвертируют цветовые значения в то состояние с которым им удобно, допусти при назначении цвета для элемента таким образом:
<body>
<script>
document.body.style.backgroundColor = '#f00';
// сконвертит его в rgb(255, 0, 0)
alert( document.body.style.backgroundColor ); // увидим rgb(255, 0, 0)
</script>
</body>
то есть я тестил в опере, в других браузерах может быть иначе.

devote 10.06.2012 23:14

Цитата:

Сообщение от lord2kim
хм...странно...в IE то пашет...

вот ИЕ то как раз таки не меняет значение на то что ему удобнее. Хотя и не факт, может для него HEX и есть удобно

Deff 10.06.2012 23:18

Можно текущую поллитру своять
<div style=position:absolute;z-index:-120;">
<span id=color1 style="background-color:#FF0000">a</span>
<span id=color2 style="background-color:#0000FF">a</span>
<span id=color3 style="background-color:#00FF00">a</span>
</div>
<script type="text/javascript">
var color=[];
color.push(document.getElementById('color1').style.backgroundColor)
color.push(document.getElementById('color2').style.backgroundColor)
color.push(document.getElementById('color3').style.backgroundColor)
</script>

Hekumok 10.06.2012 23:25

Цитата:

Сообщение от devote (Сообщение 180695)
некоторые браузеры конвертируют цветовые значения в то состояние с которым им удобно, допусти при назначении цвета для элемента таким образом:
<body>
<script>
document.body.style.backgroundColor = '#f00';
// сконвертит его в rgb(255, 0, 0)
alert( document.body.style.backgroundColor ); // увидим rgb(255, 0, 0)
</script>
</body>
то есть я тестил в опере, в других браузерах может быть иначе.

Не понял, при чем здесь это. Ну сконвертирует он цвет в rgb и что?
И ведь первые 2нажатия на кнопку работают, а дальше нет

devote 10.06.2012 23:25

можно просто использовать функцию конвертер, которая будет превращать всякие rgb значения в HEX:
<body>
<script type="text/javascript">
function toHexColor( color ) {

    return color.replace( /rgba?\(([^\)]+)\)|#([a-f0-9]{6}|[a-f0-9]{3})/ig, function( m, rgb, hex ) {

        if ( rgb = /([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*(?:,\s*([0-9\.]+))?/g.exec( rgb || "" ) ) {

            hex = parseInt( rgb[2] ? rgb[1] * 2.55 : rgb[1] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[4] ? rgb[3] * 2.55 : rgb[3] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[6] ? rgb[5] * 2.55 : rgb[5] ).toString( 16 ).replace( /^(.)$/, '0$1' );

            m = rgb[ 7 ] == "" || rgb[ 7 ] === undefined ? 1 : parseFloat( rgb[ 7 ] );

        } else if ( hex && ( m = 1 ) ) {

            hex = hex.replace( /^(.)(.)(.)$/, "$1$1$2$2$3$3" );

        } else {

            return m;
        }

        return "#" + hex;
    });
}

document.body.style.backgroundColor = '#f00';
// сконвертит его в #ff0000
alert( toHexColor( document.body.style.backgroundColor ) ); // увидим #ff0000
</script>
</body>
простая ковертация цветов в шестизначный HEX

devote 10.06.2012 23:26

Цитата:

Сообщение от Hekumok
Не понял, при чем здесь это. Ну сконвертирует он цвет в rgb и что?
И ведь первые 2нажатия на кнопку работают, а дальше нет

при том что ты пытаешься сравнить значение "#f00" со значением "rgb( 255, 0, 0 )" это разные значения и они всегда будут не равны, тем самым условие твое никогда не сработает

Deff 10.06.2012 23:28

Hekumok,
алерт всуньте в свою функцию - жмите кнопку и смотрите
alert( document.body.style.backgroundColor );

devote 10.06.2012 23:29

<input onclick="color();" value="Жми" type="button">
<script type="text/javascript">
function toHexColor( color ) {
 
    return color.replace( /rgba?\(([^\)]+)\)|#([a-f0-9]{6}|[a-f0-9]{3})/ig, function( m, rgb, hex ) {
 
        if ( rgb = /([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*(?:,\s*([0-9\.]+))?/g.exec( rgb || "" ) ) {
 
            hex = parseInt( rgb[2] ? rgb[1] * 2.55 : rgb[1] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[4] ? rgb[3] * 2.55 : rgb[3] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[6] ? rgb[5] * 2.55 : rgb[5] ).toString( 16 ).replace( /^(.)$/, '0$1' );
 
            m = rgb[ 7 ] == "" || rgb[ 7 ] === undefined ? 1 : parseFloat( rgb[ 7 ] );
 
        } else if ( hex && ( m = 1 ) ) {
 
            hex = hex.replace( /^(.)(.)(.)$/, "$1$1$2$2$3$3" );
 
        } else {
 
            return m;
        }
 
        return "#" + hex;
    });
}

function color() {

    if ( toHexColor( document.body.style.backgroundColor ) == '')
        return document.body.style.backgroundColor='#f00';

    if ( toHexColor( document.body.style.backgroundColor ) == '#ff0000')
        return document.body.style.backgroundColor='#0f0';

    if ( toHexColor( document.body.style.backgroundColor ) == '#00ff00')
        return document.body.style.backgroundColor='#f00';
}

</script>

Deff 10.06.2012 23:30

devote,
Ну вон жа палитру текущих цветов браузера в его собственном формате - подставлять и сравнивать
Свои цвета задаём в палитре - а считываем браузерные

devote 10.06.2012 23:32

Deff,
можно но массив огромный получится, если в него впихнуть всю палитру. Хотя если тока нужные значения то да. Норм.

Deff 10.06.2012 23:33

devote,
Ти мож пихать динамически в один и тот жа span и считывать (*мну по быстрому - попонятней пытался

Hekumok 10.06.2012 23:40

Цитата:

Сообщение от devote (Сообщение 180702)
при том что ты пытаешься сравнить значение "#f00" со значением "rgb( 255, 0, 0 )" это разные значения и они всегда будут не равны, тем самым условие твое никогда не сработает

A, спасибо, понял =)

devote 10.06.2012 23:42

Цитата:

Сообщение от Deff
Ти мож пихать динамически и считывать*мну по быстрому и попонятней

Никто не спорит можно и проще конечно:
<input onclick="color();" value="Жми" type="button">
<script type="text/javascript">

var toConvertedColor = (function( b ){
    return function( color ) {
        b.style.color = color;
        return b.style.color;
    }
})( document.createElement( 'b' ) );

function color() {
 
    if ( document.body.style.backgroundColor == '')
        return document.body.style.backgroundColor='#f00';
 
    if ( document.body.style.backgroundColor == toConvertedColor( '#f00' ) )
        return document.body.style.backgroundColor='#0f0';
 
    if ( document.body.style.backgroundColor == toConvertedColor( '#0f0' ) )
        return document.body.style.backgroundColor='#f00';
}

</script>

Hekumok 10.06.2012 23:44

Цитата:

Сообщение от devote (Сообщение 180705)
<input onclick="color();" value="Жми" type="button">
<script type="text/javascript">
function toHexColor( color ) {
 
    return color.replace( /rgba?\(([^\)]+)\)|#([a-f0-9]{6}|[a-f0-9]{3})/ig, function( m, rgb, hex ) {
 
        if ( rgb = /([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*,\s*([0-9\.]+)(\%?)\s*(?:,\s*([0-9\.]+))?/g.exec( rgb || "" ) ) {
 
            hex = parseInt( rgb[2] ? rgb[1] * 2.55 : rgb[1] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[4] ? rgb[3] * 2.55 : rgb[3] ).toString( 16 ).replace( /^(.)$/, '0$1' ) +
                parseInt( rgb[6] ? rgb[5] * 2.55 : rgb[5] ).toString( 16 ).replace( /^(.)$/, '0$1' );
 
            m = rgb[ 7 ] == "" || rgb[ 7 ] === undefined ? 1 : parseFloat( rgb[ 7 ] );
 
        } else if ( hex && ( m = 1 ) ) {
 
            hex = hex.replace( /^(.)(.)(.)$/, "$1$1$2$2$3$3" );
 
        } else {
 
            return m;
        }
 
        return "#" + hex;
    });
}

function color() {

    if ( toHexColor( document.body.style.backgroundColor ) == '')
        return document.body.style.backgroundColor='#f00';

    if ( toHexColor( document.body.style.backgroundColor ) == '#ff0000')
        return document.body.style.backgroundColor='#0f0';

    if ( toHexColor( document.body.style.backgroundColor ) == '#00ff00')
        return document.body.style.backgroundColor='#f00';
}

</script>

О.о до такого кода я еще не дорос

Deff 10.06.2012 23:47

:blink: Почему -то все одно -синего нет ??? (Опера - ток -красный - и зелёный

Hekumok 10.06.2012 23:49

Цитата:

Сообщение от Deff (Сообщение 180697)
Можно текущую поллитру своять
<div style=position:absolute;z-index:-120;">
<span id=color1 style="background-color:#FF0000">a</span>
<span id=color2 style="background-color:#0000FF">a</span>
<span id=color3 style="background-color:#00FF00">a</span>
</div>
<script type="text/javascript">
var color=[];
color.push(document.getElementById('color1').style.backgroundColor)
color.push(document.getElementById('color2').style.backgroundColor)
color.push(document.getElementById('color3').style.backgroundColor)
</script>

Объясните поподробней, плиз, что и как, я ведь не проф, а только начинающий почти =)

Hekumok 10.06.2012 23:50

Цитата:

Сообщение от Deff (Сообщение 180716)
:blink: Почему -то все одно -синего нет ??? (Опера - ток -красный - и зелёный

Я, кста, через оперу смотрю =)

devote 10.06.2012 23:51

Цитата:

Сообщение от Deff
Почему -то все одно -синего нет ??? (Опера - ток -красный - и зелёный

ну дык судя по коду так и должно быть.

Deff 10.06.2012 23:57

Цитата:

Сообщение от Hekumok
Объясните поподробней, плиз, что и как, я ведь не проф, а только начинающий почти =)

Ну забили нужныйе нам цвета в span и считываем как их даёт брауз в массив color
Теперрь твои нужные цвета в текущем формате в массиве color
-их подставляешь в cкрипте в цвета для боdy и их сравнивашь при считывании с бекграунда боdy

devote 10.06.2012 23:58

Цитата:

Сообщение от Deff
Ну забили нужныйе нам цвета в span и считываем как их даёт брауз в массив color
Теперрь твои нужные цвета в текущем формате в массиве color -их подставляешь в цвета и их сравнивашь при считывании с бекграунда боdy

зачем все это, я дал второй вариант, компактный и рабочий.

Deff 10.06.2012 23:58

Цитата:

Сообщение от devote
зачем все это, я дал второй вариант, компактный и рабочий.

Прост он просил пояснить на той странице чо - к чему

Hekumok, этот метод
devote,уже использует в последнем Скрипте и ужал его и укомпактил с 12 строк до 4

Hekumok 11.06.2012 00:04

Цитата:

Сообщение от Deff (Сообщение 180729)
Прост он просил пояснить на той странице чо - к чему
Hekumok, этот метод
devote,уже использует в последнем Скрипте и ужал его и укомпактил с 12 строк до 4

Да я знаю, видел, просто интересно как работает =)

devote 11.06.2012 00:11

Цитата:

Сообщение от Hekumok
просто интересно как работает =)

на каждое свойство стиля у браузера висит аксессор (setter/getter), при назначении какого то значения в свойство стиля, браузер его конвертирует в удобный для него вид, затем пытаясь получить текущее свойство, срабатывает геттер, и возвращает значение которое браузеру проще показать. С точки зрения оптимизации, выдать значение rgb() намного проще браузеру, так как не нужно конвертировать числа в шестнадцатеричное представление. Тем самым меньше затрачивается процессорного времени.

Hekumok 11.06.2012 00:27

Цитата:

Сообщение от devote (Сообщение 180734)
на каждое свойство стиля у браузера висит аксессор (setter/getter), при назначении какого то значения в свойство стиля, браузер его конвертирует в удобный для него вид, затем пытаясь получить текущее свойство, срабатывает геттер, и возвращает значение которое браузеру проще показать. С точки зрения оптимизации, выдать значение rgb() намного проще браузеру, так как не нужно конвертировать числа в шестнадцатеричное представление. Тем самым меньше затрачивается процессорного времени.

Спасибо, devote, я это уже понял :)

MSSERG 08.09.2016 00:06

Я наверное дико поздно с ответом, просто сам искал ответ, разобрался в коде, вот так должен был выглядеть код, который работает:

function color() {
if (document.body.style.backgroundColor == ''){document.body.style.backgroundColor='red';}
else if (document.body.style.backgroundColor == 'red'){document.body.style.backgroundColor='green';}
else if (document.body.style.backgroundColor == 'green'){document.body.style.backgroundColor='blue';};
}


Косяк был в конструкции, человек забыл поставить фигурные скобки после if () {}; , из за этого функция завершала свою работу после первого выполненного, либо выполняла последнюю, так как все условия мгновенно выполнялись один за одним.

Вот так она выглядит в цикле, то есть по кругу (R-G-B>R-G-B...):

function color() {
if (document.body.style.backgroundColor == ''){document.body.style.backgroundColor='red';}
else if (document.body.style.backgroundColor == 'red'){document.body.style.backgroundColor='green';}
else if (document.body.style.backgroundColor == 'green'){document.body.style.backgroundColor='blue';}
else {document.body.style.backgroundColor='red';};
}

laimas 08.09.2016 00:16

Цитата:

Сообщение от MSSERG
Косяк был в конструкции, человек забыл поставить фигурные скобки после if () {};

Фигурные скобки нужны тогда, когда по условию должно выполнятся несколько инструкций, то есть строк кода.

MSSERG 08.09.2016 01:58

Цитата:

Сообщение от laimas
Фигурные скобки нужны тогда, когда по условию должно выполнятся несколько инструкций, то есть строк кода.

Но косяк был именно в этом, могу пояснить, если ты не можешь этого понять.

MSSERG 08.09.2016 02:00

И вообще, здесь в моменте на мой ответ среагировали, а когда создал тему с вопросом, так до сих пор и не получил ответа, уже сам нашёл, сам себе ответил под постом комментом, прикольно вы тут помогаете...

laimas 08.09.2016 02:04

Цитата:

Сообщение от MSSERG
Но косяк был именно в этом, могу пояснить, если ты не можешь этого понять.

Я не читал всю тему, она действительно слишком стара, но по поводу фигурных скобок большое заблуждение. Пояснять не надо, лучше проверить:

var n = 3;
if (n == 1) alert('Step 1');
else if (n == 2) alert('Step 2');
else if (n == 3) alert('Step 3');
else alert('Default step');

laimas 08.09.2016 02:07

Цитата:

Сообщение от MSSERG
И вообще, здесь в моменте на мой ответ среагировали, а когда создал тему с вопросом, так до сих пор и не получил ответа

Ну так я не дежурный здесь, чтобы в момент на все отвечать. :)

MSSERG 08.09.2016 15:07

Хорошо, тогда без скобок перепиши тот код, и пусть он заработает, я проверял, у меня не работает без скобок, а со скобками работает, как ты это объяснишь? Или в это нужно верить, и тогда будет работать?

laimas 08.09.2016 15:58

Цитата:

Сообщение от MSSERG
у меня не работает без скобок, а со скобками работает, как ты это объяснишь?

Я не в курсе вообще, что у кого не работает, тема старая буков много, перелистывать не охота. ) Да и не в этом дело.

//здесь значение a будет присвоено по условию, а для b в любом случае
//то есть писать if(1) { a = 3; } нет никакой необходмости
if(1) a = 3;
b = 2;
//а чтобы при этом и b было присвоено значение также по этому условию, 
//то только так и фигурные скобки тут необходимы
if(1) {
    a = 3;
    b = 2;
}

MSSERG 08.09.2016 19:38

Цитата:

Сообщение от laimas
Да и не в этом дело.

Ладно, спасибо, буду знать, вообще сам только начал изучать JS, сейчас собираюсь плотно начать изучать, буду писать много всякого добра на нём, в первую очередь для своего сайта, так что ещё не раз меня встретишь, с интересными вопросами)

laimas 08.09.2016 19:54

Но и указывать скобки тоже не запрещено, то есть ошибки от этого не будет. Тут кто какой философии придерживается, есть утверждающие, что без фигурных скобок код плохо читается, и т.п..

Отлично он читается, потому как мусора меньше. Но вот так форматировать код:

function text()
{document.getElementById("test").style.textAlign="left";}


это нечто. Я в теме где указан этот код даже сперва написал, что скобки лишние, ибо на автомате привык читать:

//либо так, что я предпочитаю
function name() {
    //тело функции
}
//либо пишут так, что лично я не использую
function name() 
    {
        //тело функции
    }


хотя зрительно заметил, что что-то не то, и только спустя время из подсознания всплыло и я убрал комментарий по этому поводу.

Так не стоит писать, это грабли способствующие появлению ошибок.

MSSERG 08.09.2016 21:15

Цитата:

Сообщение от laimas
Так не стоит писать, это грабли способствующие появлению ошибок.

Там код на пол строчки, можно и так записать как я это сделал, конечно в последующем где код будет длиннее буду использовать правильную конструкцию, а в пол строчки и так можно, даже как то проще воспринимается, когда всё в одной строке, когда кода мало)

laimas 08.09.2016 21:28

Цитата:

Сообщение от MSSERG
а в пол строчки и так можно, даже как то проще воспринимается

Нет ничего хуже, чем вредные привычки и тезиса "И так сойдет". Скобки четко определяющие тело конструкции и табуляция, это хороший код. В куче, не понять где начало, где конец даже в одной строке, это не код, это запись в амбарной книге.


Часовой пояс GMT +3, время: 20:10.