2011-12-06 3 views
0
var flashStep = 1; 
function flash() { 
if(flashStep==1) { 
document.bgColor="FFFF00"; 
flashStep=2; 
} 
else { 
document.bgColor="FF0000"; 
flashStep=1; 
} 
} 
var task = window.setInterval("flash()",1000); 

Этот код должен сделать экран вспышкой, но не работает вообще. http://jsfiddle.net/phjnM/2/. Почему это не работает, оно выглядит безупречно для меняКак сделать вспышку экрана, не работает

ответ

1

Проблема заключается в (глобальный) сфера бытия применяется при передаче строки до setInterval. Если вы передадите ссылку на функцию, то она работает:

var task = window.setInterval (flash, 1000);

См http://jsfiddle.net/phjnM/7/

Другой вариант заключается в jsfiddle выбрать опцию «Nowrap», так что ваш код не определен в области видимости OnLoad/onready обработчика ...

1

Поскольку ваш код в JSFiddle завернут в функцию onload.

enter image description here

Передача ссылки на функцию будет исправить.

var task = window.setInterval(flash,1000); 

Или альтернативой было бы выбрать (no wrap) вариант из меню слева.


Кстати, сделайте это, чтобы цвет фона документа.

var i = 0; 
var task = setInterval(flash, 1000); 

function flash() { 
    document.documentElement.style.backgroundColor=(i = ~i) ? '#ff0' : '#f00'; 
} 

JSFIDDLE DEMO

+1

тьфу, Обратные избиратель. У вас есть объяснение? – RightSaidFred

+1

@minitech: Как так? [Решение 1] (http://jsfiddle.net/NCCRp/), [Решение 2] (http://jsfiddle.net/NCCRp/1/) – RightSaidFred

+0

Да, ладно, вы сказали передать ссылку. Как насчет bgColor? Это BGCOLOR для добра! Я сниму нисходящее изображение, хотя у меня есть эта рефлексивная реакция на BGCOLOR !!! – Ryan

0

Вместо:

document.bgColor="FFFF00" 

вам нужен этот вид:

document.body.style.backgroundColor="#FFFF00"; 

Вы отсутствовали в .body.style., вы имели неправильное имя стиля атрибут backgroundColor a и вам нужно иметь значение #.

Кроме того, ваш SetTimeout() должен быть таким:

var task = setInterval(flash,1000); 

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

window.flash = function() { 

Вы можете видеть, что все это работает в пересмотренной версии вашего jsFiddle: http://jsfiddle.net/jfriend00/h4VZm/

+0

'bgColor' работает, старая школа. (По крайней мере, он работает в конкретном браузере, с которым я случайно тестировал.) Но да, настройка 'style.backgroundColor' - лучший план. – nnnnnn

0

Использовать window.setInterval(flash, 1000).

Эта конкретная проблема была, вероятно, проблемой с областью при запуске кода на jsfiddle. В общем, не передавайте код как строку, когда вы действительно хотите передать обратный вызов, который в Javascript вы можете сделать, передав эту функцию.

6

Несколько вопросов. Прежде всего, bgColor - свойство элементов - оно не относится к document. Возможно, вы имели в виду document.body? Во-вторых, вы - , используяbgColor. Пожалуйста, не надо. Вместо этого вы должны использовать style.backgroundColor. В-третьих, вы, вероятно, захотите использовать логическое значение для двух состояний. В-четвертых, никогда не передавайте строку setInterval или setTimeout.Таким образом, ваш код, переписано, было бы что-то вдоль линий:

var flash = false; 
var task = setInterval(function() { 
    if(flash = !flash) { 
     document.body.style.backgroundColor = '#ff0'; 
    } else { 
     document.body.style.backgroundColor = '#f00'; 
    } 
}, 1000); 
+0

+1 Хорошее резюме * все * проблемы. – deceze

+1

Это хорошее резюме вещей, которые нужно изменить, но вы на самом деле не объяснили, почему код из OP не работает, то есть в общем смысле, хотя на самом деле это не _wrong_, чтобы передать строку 'setInterval' это повлияет на область действия и, следовательно, не будет работать, если функция флэш-памяти определена внутри обработчика onload/onready. 'document.bgColor' работает (по крайней мере, в некоторых браузерах). – nnnnnn

+0

@nnnnnn: Он работает, но он все еще ужасен. Это похоже на IE6. – Ryan

0

Смотрите сейчас его работы, http://jsfiddle.net/phjnM/8/

+0

Почему вы использовали jQuery, но не используете jQuery? Если вы собираетесь использовать jQuery, используйте его полностью. Не используйте наполовину испеченное решение. – Ryan

+1

@minitech: Ясно, что Jayantha заимствует готовый обратный вызов, чтобы четко указать, что скрывает jsFiddle. Почему это проблема для вас? Хватит с полузапеченными комментариями. – RightSaidFred

+0

да, ты прав Саид Фред :) –

Смежные вопросы