92 заметки с тегом

javascript РСС

Ctrl +  Позднее

27 июля 2009, 23:59

Hard JavaScript: декораторы (decorators) Избранное

Декоратор — образно говоря, это нечто, что оборачивает другое нечто %))) Вот например есть функция и мы можем создать для неё декоратор, который будет запускать какую-то другую функцию в начале или в конце выполнения «родителя». Для чего-же?: вариантов миллион ;) Например для проверки данных, если этой проверки ранние не было, или для логгирования, дебагинга, или для изменения общего поведения ;)


Перейдём к делу %) Создадим помощник, который будет нам помогать делать чудеса.
Function.prototype.method = function(methodName, f) {
  if (typeof f != "undefined")
    this.prototype[methodName] = f;
  return this.prototype[methodName];
}
Что-что? Спросите вы! Образно говоря, мы легко добавляем новый (если существует, возвращаем старый) метод (функцию) в прототип заданной функции о_О Прототип?? Хе-хе! Прототип — это свойства и методы функции, класса, массива, любого объекта, которые существуют по умолчанию. :D Да, они ограничены (прелести в прототипе), и их есть стандартный набор, потому мы можем их добавлять переназначать или удалять ;)


Приступим к декораторам ;)
// Теперь мы можем достать как ближайшую "украшенную" ф-цию, так и самую первую в цепочке
Function.method("restore", function(fullRestore){
  var ret = this.old || this;
  while (fullRestore && ret.old) {
    ret = ret.old;
  }
  return ret;
})
// специально для декорирования методов, востановления имён
Function.method("decorateMethod", function(methodName, decorator){
  var f = this.method(methodName);
  if (!f)
    return null;
  f.name = methodName;
  f = f.decorate(decorator);
  return this.method(methodName, f);
})
Function.method("decorate", function(decorator){
  // Сохраняем исходную функцию
  var oldFunc = this;
  // Важно! теперь возможно нормальное пере-использование одного и того же декоратора.
  // Теперь мы его никак не трогаем и не изменяем, а создаём и возвращаем новую ф-цию.
  // Однако теперь декоратор первым аргументом всегда будет получать некий объект,
  // в котором -- original: oldFunc (оригинал) и decoratorInstance: f (настоящий декоратор)
  var f = function(){
    return decorator.apply(this, 
    [{original: oldFunc, decoratorInstance: f}].concat([].slice.apply(arguments)))
  }
  // Сохраняем оригинал ф-ции - в decoratorInstance f
  f.old = oldFunc;
  // Восстанавливаем прототип и конструктор ф-ции.
  // Это необходимо для сохранения ф-ции как конструктора.
  f.prototype = this.prototype;
  f.prototype.constructor = f;
  // Восстанавливаем имя ф-ции. Откуда оно вообще берётся? Можно задать вручную.
  // Или см. выше, новый метод decorateMethod: в нём это задаётся.
  f.name = oldFunc.name;
  // возвращаем декоратор
  return f;
})
Всем понравилось, теперь пример
// Простая функция-декоратор		
function docwrite() {
	var types = arguments; // передаём типы
	return function(dScope) {
		// получаем аргументы родителя (воруем)
		var original = arguments[0].original; // или можно dScope.original
		var arguments = Array.prototype.slice.call(arguments, 1);
		var params = arguments;
		// выводим наш текст, который мы алертим
		document.write(params[0]);
		
		// незабываем позвать родителя, а то не красиво ;)
		return original.apply(this, arguments);
		// в результате видем ещё и алерт
	}
}
// надеваем декоратор на алерт
alert = alert.decorate(docwrite());
Дальше в body пишем
<script type="text/javascript">
  alert("y0");
</script>



Теперь бонусы
// Кикнуть декоратор можно так ;)
Function.method("recover", function() {
  return this.old || this;
})
// Повесить обработку "до"
Object.method('before', function(methodName, f){
  var method = listenerInit.call(this, methodName);
  if (method)
    method.listenersBefore.push(f);
})
// Повесить обработку "после"
Object.method('after', function(methodName, f){
  var method = listenerInit.call(this, methodName);
  if (method)
    method.listenersAfter.push(f);
})
// что бы повесить декоратор "до" и "после", нам нужен вот такой обработчик (слушатель)
function listenerInit(methodName) {
  var method = this[methodName];
  if (typeof method != "function")
    return false;
  
  // продекорировано, или ещё нет?
  if (!method.listenable) {
    this[methodName] = method.decorate(function(){
      var decorator = arguments.callee;
      decorator.listenable = true;
      
      var list = decorator.listenersBefore;
      for (var i = 0, l = list.length; i < l; i++) {
        if (typeof list[i] == "function" && list[i].apply(this, arguments) === false)
          return;
      }
      
      var ret = decorator.old.apply(this, arguments);
      list = decorator.listenersAfter;
      for (var i = 0, l = list.length; i < l; i++)
        list[i].apply(this, arguments);
        
      return ret;
    });
    method = this[methodName];
  }
  
  method.listenersBefore = method.listenersBefore instanceof Array ? method.listenersBefore : [];
  method.listenersAfter = method.listenersAfter instanceof Array ? method.listenersAfter : [];
  
  return method;
}


javascript

23 июля 2009, 13:15

javascript redefine function (переопределение функции)

Зачем такое нужно? :) Ну вот есть кастомный скрипт, и везде дебагинг через алерты, и алерты в циклах, и это очень напрягает ;) Переопределяем алерт, и делаем ему например вывод в какой-то контейнер.
window['alert']= function(){
	var container = document.getElementById("divErrorBoxContainer"); 
	container.innerHTML = container.innerHTML + Array.slice(arguments);
} 
Гарно? Правда же? :) Для аргументов есть массив, с ними можно работать через айдишники ;)

Есть другие варианты переопределения, как говорится на вкус и цвет ;)
originalFunction = function myFunction(args) {}
// или
function myFunction(args) {}
originalFunction = myFunction;
javascript

19 июля 2009, 16:06

Копируем в буфер обмена в FireFox 3.5 и IE8

С приходом 10го флеша, ФФ3.5 и ИЕ8, на многих сайтах перестала работать волшебная кнопка «Скопировать в буфер». Перестала работать из соображений безопасности (что бы когда заходишь на какой либо сайт, у тебя в буфере не появилась левая ссылка, или рекламный текст, или злоумышленники не применили это фичу в других целях).

Сейчас ЕкшонСкрипт даёт скопировать в буфер обмена только при действии пользователя, то есть при клике по ролику (а ролик то можно сделать прозрачным ;). Этим и воспользовался jhuckaby при создании своего скрипта Zero Clipboard.

Посмотреть демо:


Скрипт работает во всех современных браузерах.
Проверено в ФФ3.5, ИЕ8, ИЕ8(мод7), Хром3, Опера10б2, Сафари4. Поддержка флеш 9 и 10.

Суть:

После того, как мы с помощью JS, инициализируем скрипт, укажем путь к ZeroClipboard.swf и создадим клиент для копирования, мы можем смело заносить в буфер по клику, любую информацию.

Но скрипт этим не ограничен, у него есть чудесные свойства (методы):
  • приклеивание к DOM элементу (Gluing) — то бишь, мы указав айди элемента, приклеиваем поверх него флешку (она копирует в буфер), которая автоматически подстроится под размер элемента;
  • ксс эффекты — скрипт подсвечивает элемент, на который подвешена кнопка, создавая сабклассы «hover», «active» (аля псевдо). Их можно изменить на своё усмотрение в CSS;
  • возможность задать собственное представление — это на случай, если нужно создать кастомный прямоугольник, и не нужно никуда клеить флешку;
  • и ещё он может рулить стандартными событиями (onLoad, onMouseOver, onMouseOut, onMouseDown, onMouseUp, onComplete).

О этом и многом другом, чудесно викирасписано

Пример

<html>
<body>
 <!-- Инициализируем, с учётом что ZeroClipboard.swf радом с *.js -->
 <script type="text/javascript" src="ZeroClipboard.js"></script>
 <!-- Делаем кнопку с айди -->
 <div id="d_clip_button" style="border:1px solid black; padding:20px;">Copy To Clipboard</div>

 <script language="Javascript">
  // Создаём клиент
  var clip = new ZeroClipboard.Client();
  // Указываем что копируем
  clip.setText( 'Copy me!' );
  // Клеим к кнопке
  clip.glue( 'd_clip_button' );
 </script>
</body>
</html>

Полный пример

<html>
<head>
<style type="text/css">
  #d_clip_button {
    text-align:center;
    border:1px solid black;
    background-color:#ccc;
    margin:10px; padding:10px;
  }
  /* Указываем свои стили для пседо-саб-классов */
  #d_clip_button.hover { background-color:#eee; }
  #d_clip_button.active { background-color:#aaa; }
</style>
</head>
<body>
  <script type="text/javascript" src="ZeroClipboard.js"></script>

  Copy to Clipboard: <input type="text" id="clip_text" size="40" value="Copy me!"/><br/><br/>

  <div id="d_clip_button">Copy To Clipboard</div>

  <script language="Javascript">
    var clip = new ZeroClipboard.Client();
    clip.setMoviePath( 'ZeroClipboard.swf' ); // укажем путь к флешке
    clip.setText( '' ); // onМouseDown будет копировать нужный текст
    clip.setHandCursor( true ); // делаем курсор в виде руки
    clip.setCSSEffects( true ); // разрешаем CSS эффекты
    
    clip.addEventListener( 'load', function(client) {
      // alert( "Загрузилась флешка " );
    });
    
    clip.addEventListener( 'complete', function(client, text) {
      alert("Скопирован текст: " + text );
    });
    
    clip.addEventListener( 'mouseOver', function(client) {
      // alert("Навели мышку на флешку");
    });
    
    clip.addEventListener( 'mouseOut', function(client) {
      // alert("Убрали мышку с флешки");
    });
    
    clip.addEventListener( 'mouseDown', function(client) {
      // alert("Нажали мышкой по флешке");
      // Копируем нужный текст, в данном случае значение инпута 'clip_text'
      clip.setText( document.getElementById('clip_text').value );
    });
    
    clip.addEventListener( 'mouseUp', function(client) {
      // alert("Отжали мышку");
    });
    // Приклеили к кнопке с айди 'd_clip_button'
    clip.glue( 'd_clip_button' );
  </script>
</body>
</html>

Ещё раз ссылки:

flash   javascript

18 июля 2009, 20:32

crossbrowser click event (DOM)

var clickEvent:Object = doc.createEvent("MouseEvents");
clickEvent.initMouseEvent("click");
HTMLElement.dispatchEvent(clickEvent);
С помощью dispatchEvent мы напрямую бросаем ивент(событие) в модель ивентов. Использовать можно, так же и для других событий ;)
DOM   crossbrowser   javascript

9 июля 2009, 16:36

Custom file input form

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>File Up Form Replace</title>

	<script type="text/javascript">
		function result(fileId){
			var res = document.getElementById("ftitle");
		  // выводим имя файла, обработав регекспиком
			res.innerHTML = fileId.value.replace(/^([^\\\/]*(\\|\/))*/,"");
			// выводим в тайтл всё значение 
			res.setAttribute("title",fileId.value);
		}
	</script>
	
	<style type="text/css">
		.fakebutton {
			font-family: verdana; 
			color: #fff;
			text-align: center; 
			overflow: hidden; 
			width: 200px; 
			height: 20px; 
			background-color: #038f1a;
		}
		.fakebutton span {displa: block;}
		.realbutton {

			/* прячем размеры input'a */
			margin-top: -50px; 
			margin-left:-410px; 
			/* делаем прозрачным */
			-moz-opacity: 0; 
			filter: alpha(opacity=0); 
			opacity: 0; 
			/* делаем большим */
			font-size: 150px; 
			height: 100px;
		}
	</style>
	
</head>
<body>
<div class="fakebutton">

	<span id="ftitle">Загрузить</span>
	<!-- когда засабмитили файлик взываем функцию result() -->
	<input type="file" name="file" id="file" size="1" onChange="result(this);" class="realbutton">

</div>
</body>


css   javascript

5 июля 2009, 14:54

Javascript RegExp parsing url

var parts = /^(([^:/\\?#]+):)?(//(([^:/\\?#]*)(?::([^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$/.exec(url)
Теперь более подробно
var pattern = 
    // Match #0. URL целиком (#0 - это HREF). 
    // Например, #0 == "https://example.com:8080/some/path/index.html?p=1&q=2&r=3#some-hash"
    "^" + 
    // Match #1 & #2. SCHEME (#1 - это PROTOCOL). 
    // Например, #1 == "https:", #2 == "https"
    "(([^:/\\?#]+):)?" + 
    // Match #3-#6. AUTHORITY (#4 = HOST, #5 = HOSTNAME и #6 = PORT)
    // Например, #3 == "//example.com:8080", #4 == "example.com:8080", #5 == "example.com", #6 == "8080"
    "(" + 
        "//(([^:/\\?#]*)(?::([^/\\?#]*))?)" +
    ")?" + 
    // Match #7. PATH (#7 = PATHNAME). 
    // Например, #7 == "/some/path/index.html"    
    "([^\\?#]*)" + 
    // Match #8 & #9. QUERY (#8 = SEARCH). 
    // Например, #8 == "?p=1&q=2&r=3", #9 == "p=1&q=2&r=3"    
    "(\\?([^#]*))?" + 
    // Match #10 & #11. FRAGMENT (#10 = HASH). 
    // Например, #10 == "#some-hash", #11 == "some-hash"
    "(#(.*))?" + "$";


javascript   regexp   шпаргалка

22 июня 2009, 11:51

JavaScript Objects (standart DOM)





Объекты и функции стандартного дом дерева ;) Иногда очень полезно посмотреть :) что бы знать что можно сделать, или нельзя с элементом. Часто очень лень отдампить элемент, но и сложного в этом ничего нет :)
var elm = $("demoid").attributes;
for( var x = 0; x < elm.length; x++ ) 
	document.write(elm[x].name + ': ' + elm[x].nodeValue + '</br>');
javascript   шпаргалка

19 июня 2009, 16:12

Не предустановленное количество аргументов в JavaScript

function foo() {
  // получаем строку из массива
  Array.slice(arguments); // ['aa',11] 
}

foo('aa',11);
javascript

18 июня 2009, 11:03

Javascript Image Carusel :D

Зайдите на любую страницу, где много картинок, и вставьте эту строку в адресную строку

Что же там происходит? ;)
R=0; 
x1=.1; 
y1=.05; 
x2=.25; 
x3=1.6; 
y2=y3=.24; 
x4=x5=300; 
y4=y5=200;
/* Собираем все картинки не старнице */
DI=document.getElementsByTagName("img"); 
DIL=DI.length;  /* считаем их */
function A(){
	for(i=0; i-DIL; i++){
		DIS=DI[ i ].style; 
		DIS.position='absolute'; /* делаем позишон абсолюте */
		/* Дальше по тригонометрической формуле начинаем вращать */
		DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+"px"; 
		DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+"px"
	}
	R++
}
/* Вращать с задержкой в 50мл.сек */
setInterval('A()',50); 
void(0);
address bar   javascript

17 июня 2009, 11:45

Javascript: создаём свой тэг %)

Иногда нужно создать свой тэг, новый, которого нет в DTD. Для чего спросите, например для поддержки HTML5/XHTML5 (header, nav, article, section, aside,footer, video, audio) в ИЕ или, банально, для поддержки acronym всё в томе же ИЕ (Его там нет). Всё просто
<!--[if IE]>
<script type="text/javascript">
document.createElement("acronym");
</script>
<![endif]-->
И не забываем о том, что созданый элемент будет инлайновым, а скорее всего нужно будет ему сделать display:block;
javascript

15 июня 2009, 16:41

if then else javascript в одну строчку %)

var some = bool ? "true" : "false";

var yepp = true || false;
javascript

11 июня 2009, 15:00

Javascript: Как получить контент (содержимое) с ифрейма

Иногда, что бы сделать псевдоАджакс, используют ифреймы, но часто нужно достать данные из ифрейма и как-то их использовать. Но ифрейм это другой документ, и страшного ничего нет, скриптом это делается так
var myIFrame = document.getElementById("tipa_ajax").contentWindow.document;  

var wholeIframeContetnt = myIFrame.body.innerHTML;
var someNode = myIFrame.getElementById("someid").innerHTML;


У меня есть функция, для того что бы доставать данные по айди, через неё так же легко доставать данные с ифреймов
$("someid",$("tipa_ajax").contentWindow.document)
javascript

10 июня 2009, 3:21

Easy Image Preload :)

Если в тексте нужны картинки, которые должны отобразится позже, желательно их подгрузить заранее, что бы юзер не злился :)

Желательно скрипт ставить вконец страницы, но ещё можно сделать загрузку по таймауту %)
<SCRIPT type="text/javascript">
<!--
if (document.images)
{
  pic1= new Image(100,25); 
  pic1.src="http://somepurl.com/image1.png"; 

}
//-->

</SCRIPT>
javascript

4 июня 2009, 20:05

CrossBrowser function that add page to bookmark

Для оперы10 и фокса3.5 достаточно написать в ссылке rel=’sidebar’, оно добавит ссылку в избранное (закладки). В качестве урла возмёт ссылку, а в качестве названия тайтл ;)
Для остальных пригодится такая функция ;)
function addBookmark(title, url, obj){
	if (!url) url = location.href;
	if (!title) title = document.title;
	if ((typeof window.sidebar == "object") && 
			(typeof window.sidebar.addPanel == "function")) 
		window.sidebar.addPanel (title, url, "");//Gecko
	else if (document.all) 
		window.external.AddFavorite(url, title); //IE4+
	else if (window.opera && document.createElement) {
		obj.setAttribute('rel','sidebar');
		obj.setAttribute('href',url);
		obj.setAttribute('title',title);
	}
	else {
		alert("Что бы добавить в закладки\
			Нажмите ctrl+D (ctrl+T старая опера);");
		return false; //IF Opera 6
	}
	return true;
}


В Хроме нету пока такого функционала ;) и у многих других, потому для них алерт :D
bookmarks   javascript

19 мая 2009, 18:08

Многострочная переменная в javascript

// Стандартно:
var text  = "this\n";
var text += "is\n";
var text += "my\n";
var text += "multyline\n";
var text += "text\n";
// или 
var text = "this\n" + "is\n" + "my\n" + "multyline\n" + "text\n";
// или длинно и неразборчиво
var text = "this\nis\nmy\nmultyline\ntext\n";
// А можно и так ;)
var text = "this\
is\
my\
multi-line\
text";
// А ещё javascript 1.6 style
var text =<>
this
is
my
multi-line
text
</>.toString();
javascript

15 мая 2009, 15:48

Extend Scroll bars (Инфорскроллер — примеры)

Иногда, что бы легко ориентироваться на странице, нужна помощь посторонних сил %)) В прямом смысле этого слова ;)

Етой силой есть джаваскрипт (javascript) :D А для ориентации на странице, мы расширим функционал скролл-баров. То есть, проанализируем текущий документ и построим из него упрощенную схему для скроллбара.

Эта штука запатентирована на Дизайн-бюро Артёма Горбунова, но они предложили идею УИ, а её реализации на джаваскрипте смотрите ниже:


javascript   scrollbars

12 мая 2009, 2:56

Javascript add/remove TD/TR in TABLE

Манипулирование таблицей:
  • Для того что бы добавить/удалить строку(ряд) TR есть функция insertRow/deleteRow. Применяется она только к объекту TABLE.
  • Что бы посчитать количество рядов в таблице, вызываем у объекта TABLE функцию rows.length
  • Для того что бы добавить/удалить ячейку TD в строке, мы используем insertCell/deleteCell, применяется только к объекту TR.
  • Что бы посчитать количество колонок в рядке, вызываем у объекта TR функцию cells.length
Рассмотрим простой пример:
function addRow(i) {
	// объект myTable
	var table = document.getElementById('myTable');
	// количество рядов меньше вставляемого ряда - выходим
	var rowz = table.rows.length;
	if (rowz < i+1 && i > 0) 
		{alert("row " + (i+1) + " not exist");return;}
	// вставляем ряд без ячеек
	var row=table.insertRow(i);
	// предполагаем ячеек будет 2
	var countCells = 2;
	// берём количество ячеек со следующего ряда
	if (row.nextSibling != null && rowz > 0) 
		countCells = row.nextSibling.cells.length;
	// нет следующего берём с предыдущего, если есть ряды
	else if (row.previousSibling != null  && rowz > 0) 
		countCells = row.previousSibling.cells.length;
	// в цикле вставляем новые ячейки
	for (var j = 0; j < countCells; j++ ) {
		// вставляем ячейку
		var cell=row.insertCell(j);
		// наполняем ячейку
		cell.innerHTML="new cell " + (j+1) + " from line "+(i+1);
	}
}
function removeRow(i) {
	// объект myTable
	var table = document.getElementById('myTable');
	// нет рядов - выходим
	if (!table.rows.length) 
		{alert("No rows, insert first");return;}		
	// количество рядов меньше удаляемого ряда - выходим
	if (table.rows.length < i+1 ) 
		{alert("row " + (i+1) + " not exist");	return;}
	var row=table.deleteRow(i);
}	
function addCell(i) {
	// объект myTr
	var row = document.getElementById('myTr');	
	// Если номер вставляемой ячейки больше 
	// количества ячеек - выходим
	var rowz = row.cells.length;
	if (rowz < i+1 && i > 0) 
		{alert("cell " + (i+1) + " not exist");	return;}
	// вставляем ячейку
	var cell=row.insertCell(i);
	// наполняем ячейку
	cell.innerHTML="new cell after cell "+(i+1);
}	
function removeCell(i) {
	// объект myTr
	var row = document.getElementById('myTr');	
	// нет ячеек - выходим
	if (!row.cells.length) 
		{alert("No cells, insert first");return;}
	// Если ячейки которую нужно удалить нет - выходим
	if (row.cells.length < i+1 ) 
		{alert("cell " + (i+1) + " not exist");	return;}
	// удаляем ячейку
	var cell=row.deleteCell(i);
}		



javascript   td

10 мая 2009, 22:50

Скроллим див %)

Иногда див с большим объёмом информации нужно поскроллить, но типичный скролл не вписывается в дизайн, и нужно придумать кнопки. На помощь приходит javascript :D
У любого блочного элемента в html, есть css свойство, которое можно изменить только с помощью javascript о_О
Знакомьтесь, это scrollLeft и scrollTop :) Они представляют собой отступ (скролл) от левого края и от верха соответственно ;)
Перейдем к делу! Управлять ими очень даже легко
document.getElementById("test").scrollLeft += 5;
document.getElementById("test").scrollLeft -= 5;
Сдесь мы блочный элемент с id=«test» сначала двигаем вправо на 5px, потом влево. Аналогично делается для направлений вниз/вверх!

Пример:
JavaScript — скриптовый язык, чаще всего использующийся при создании сценариев поведения браузера, встраиваемых в веб-страницы. Является одной из реализаций языка ECMAScript. Название «JavaScript» является зарегистрированным товарным знаком компании Sun Microsystems, Inc.
Скроллим Вниз Скроллим Вверх
css   javascript   scrolling

2 мая 2009, 17:50

Fast remove «px» from length value

value.replace(/px/, "");
javascript   шпаргалка

10 апреля 2009, 12:15

Мигающий текст %)

Иногда нужно что-то выделить на странице, «хороший» пример — это мигающий текст
Приведу два простых способа:
Способ 1 Генерация случайного цвета
// цвет = 16 бит от 0 до F
var hexvalues = Array(
"0", "1", "2", "3", 
"4", "5", "6", "7", 
"8", "9", "A", "B", 
"C", "D", "E", "F" );
function flashtext() {
	var colour = "#";
	// Генерируем случайный цвет
	for( var counter = 1; counter <= 6; counter ++ ) {
		var rand = Math.floor(hexvalues.length * Math.random() );
		var hexvalue = hexvalues[rand];
		colour = colour + hexvalue;
	}
	// меняем элементу с id "flashingtext" цвет
	document.getElementById("flashingtext").style.color = colour;
} 
// Меняем каждые 50 милисекунд
setInterval( "flashtext()", 50 );

Способ 2 Мигание определёнными цветами
// Есть масив определённых цветов - палитра %)
var textcolours = Array(
"#FFFFFF", "#EEEEEE", "#DDDDDD", 
"#CCCCCC", "#BBBBBB", "#AAAAAA" );
function flashtext() {
	// выбираем случайно один из цветов
	var colour = Math.round(textcolours.length * Math.random() );
	// меняем элементу с id "flashingtext" цвет
	document.getElementById("flashingtext").style.color = textcolours[ colour ];
}
// Меняем каждые 50 милисекунд
setInterval( "flashtext()", 50 );


javascript
Ctrl +  Ранее