92 заметки с тегом
javascript РСС
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; }
2 комментария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;
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.
Но скрипт этим не ограничен, у него есть чудесные свойства (методы):
О этом и многом другом, чудесно викирасписано
Сейчас ЕкшонСкрипт даёт скопировать в буфер обмена только при действии пользователя, то есть при клике по ролику (а ролик то можно сделать прозрачным ;). Этим и воспользовался 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>
Ещё раз ссылки:
18 июля 2009, 20:32
crossbrowser click event (DOM)
var clickEvent:Object = doc.createEvent("MouseEvents"); clickEvent.initMouseEvent("click"); HTMLElement.dispatchEvent(clickEvent);С помощью dispatchEvent мы напрямую бросаем ивент(событие) в модель ивентов. Использовать можно, так же и для других событий ;)
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>
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" "(#(.*))?" + "$";
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>');
19 июня 2009, 16:12
Не предустановленное количество аргументов в JavaScript
function foo() { // получаем строку из массива Array.slice(arguments); // ['aa',11] } foo('aa',11);
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);
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;
15 июня 2009, 16:41
if then else javascript в одну строчку %)
var some = bool ? "true" : "false"; var yepp = true || false;
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)
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>
4 июня 2009, 20:05
CrossBrowser function that add page to bookmark
Для оперы10 и фокса3.5 достаточно написать в ссылке rel=’sidebar’, оно добавит ссылку в избранное (закладки). В качестве урла возмёт ссылку, а в качестве названия тайтл ;)
Для остальных пригодится такая функция ;)
В Хроме нету пока такого функционала ;) и у многих других, потому для них алерт :D
Для остальных пригодится такая функция ;)
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
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();
15 мая 2009, 15:48
Extend Scroll bars (Инфорскроллер — примеры)
Иногда, что бы легко ориентироваться на странице, нужна помощь посторонних сил %)) В прямом смысле этого слова ;)
Етой силой есть джаваскрипт (javascript) :D А для ориентации на странице, мы расширим функционал скролл-баров. То есть, проанализируем текущий документ и построим из него упрощенную схему для скроллбара.
Эта штука запатентирована на Дизайн-бюро Артёма Горбунова, но они предложили идею УИ, а её реализации на джаваскрипте смотрите ниже:
Етой силой есть джаваскрипт (javascript) :D А для ориентации на странице, мы расширим функционал скролл-баров. То есть, проанализируем текущий документ и построим из него упрощенную схему для скроллбара.
Эта штука запатентирована на Дизайн-бюро Артёма Горбунова, но они предложили идею УИ, а её реализации на джаваскрипте смотрите ниже:
- Пример iScroll
Автор потерялся - Пример JavaScript Scroll
автор Sergey Voronkov - Инфоскроллер
автор Сергей Чикуёнок
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); }
10 мая 2009, 22:50
Скроллим див %)
Иногда див с большим объёмом информации нужно поскроллить, но типичный скролл не вписывается в дизайн, и нужно придумать кнопки. На помощь приходит javascript :D
У любого блочного элемента в html, есть css свойство, которое можно изменить только с помощью javascript о_О
Знакомьтесь, это scrollLeft и scrollTop :) Они представляют собой отступ (скролл) от левого края и от верха соответственно ;)
Перейдем к делу! Управлять ими очень даже легко
Пример:
У любого блочного элемента в html, есть css свойство, которое можно изменить только с помощью javascript о_О
Знакомьтесь, это scrollLeft и scrollTop :) Они представляют собой отступ (скролл) от левого края и от верха соответственно ;)
Перейдем к делу! Управлять ими очень даже легко
document.getElementById("test").scrollLeft += 5; document.getElementById("test").scrollLeft -= 5;Сдесь мы блочный элемент с id=«test» сначала двигаем вправо на 5px, потом влево. Аналогично делается для направлений вниз/вверх!
Пример:
JavaScript — скриптовый язык, чаще всего использующийся при создании сценариев поведения браузера, встраиваемых в веб-страницы. Является одной из реализаций языка ECMAScript. Название «JavaScript» является зарегистрированным товарным знаком компании Sun Microsystems, Inc.
Скроллим Вниз
Скроллим Вверх10 апреля 2009, 12:15
Мигающий текст %)
Иногда нужно что-то выделить на странице, «хороший» пример — это мигающий текст
Приведу два простых способа:
Способ 1 Генерация случайного цвета
Способ 2 Мигание определёнными цветами
Приведу два простых способа:
Способ 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 );
