Просмотр полной версии : html текст, как отловить событие наведения на ссылку?
chingachgoog
09.08.2007, 21:33
с помощью CSS сам текст видоизменяется как надо, asfunction по клику тоже работает, а вот как отловить СОБЫТИЕ наведения на ссылку?
(тема начала обсуждаться тут (http://flasher.ru/forum/showthread.php?t=94528&highlight=%F1%EE%E1%FB%F2%E8%E5+%ED%E0%E2%E5%E4%E5%ED%E8%FF+%F1%F1%FB%EB%EA%F3), но ответа там нет)
где-то обсуждалась тема, в ссылке прописывается это. Грубо говоря ссылка вызывает казанную функцию, а там уже делай что хочешь. Поищи, обсуждалось несколько раз такое.
Да как обычно ловишь событие джаваскриптом (онмаусовер) и запускаешь нужную функцию...
<a href="http://my_site.ru" onmouseover="my_function(my_parameter);">типа мой сайтик</a>
Wolsh, какой нафиг onmouseover внутри флеша для html?
Я делал подобную вещь, насколько я помню, отслеживалось изменение цвета линка при наведении на него мышью.
Простите, зарапортовался :) Я думал на хтмл-странице...
chingachgoog
10.08.2007, 12:07
Wolsh, какой нафиг onmouseover внутри флеша для html?
Я делал подобную вещь, насколько я помню, отслеживалось изменение цвета линка при наведении на него мышью.
Я тоже об этом думал, но если ссылок несколько, как узнать над которой именно находиться мышь? Или отслеживание цвета именно этого линка? Тогда как?
Проверять всю строку, находить позицию ссылки с отличным цветом от других. Я ж говорю, это геморройно очень, но реально.
chingachgoog
10.08.2007, 13:15
Могу понять, как найти ссылку в текстовом поле.
Но не могу понять, как определить цвет ФРАГМЕНТА текстового поля?
chingachgoog
10.08.2007, 14:00
Понял.
Это третий вариант синтаксиса:
my_txt.getTextFormat(beginIndex:Number, endIndex:Number) : Object
Спасибо.
А свойство полученного объекта можно в watch поставить?
PS chingachgoog, ты уж поделись со всеми технологией, когда получится, ОК?
txt = this.createTextField('txt',0,10,10,100,20);
txt.text = 'test';
trace(txt.getTextFormat(0,1)==txt.getTextFormat(0,1)); // false
При каждом гете создается новый объект и они не равны?
Но мы же можем сделать один объект и ватчить только одно его свойство?
Или придется определять через переменную?
txt = this.createTextField('txt',0,10,10,100,20);
txt.text = 'test';
o = txt.getTextFormat(0,1);
txt.setTextFormat(0,1,new TextFormat('Verdana'));
trace(o.font+','+txt.getTextFormat(0,1).font);
Ну вот. Объекты-то нам сравнивать не надо, только свойство.
Оно отлавливается. Так можно его как-то в ватч запихать?
Если все-таки непонятно: оно не меняется. Что и иллюстрирует написанный мною пример.
Да нет, понятно что переменная ХРАНИТ значение.
А свойство-то меняется :) Но оно, конечно, привязано к объекту...
Не привязано оно ни к чему.
__etc, чесслово я не программер, и вашей фени не знаю :)
Извини если не так сказал, ОК? Я имел в виду, что новое значение свойства мы получим только с новым объектом, а у старого, хранимого в переменной, ничего не изменится.
Итак, при каждом вызове гетТекстФормат мы получаем новый объект с интересующим нас свойством color, на известное заранее значение которого надо среагировать. В watch мы не можем следить ни за чем, кроме переменной - так? Переменная не меняется :) сама по себе. Значит надо создать вызов опроса по интервалу, соотв. watch уже не нужен, хватит просто if.
В общем, решение совсем некрасивое, интервалы всякие... Эх, будет ли когда-нибудь событие изменения курсора :)
Достаточно повесить onMouseMove+updateAfterEvent.
chingachgoog
10.08.2007, 17:43
PS chingachgoog, ты уж поделись со всеми технологией, когда получится, ОК?
Боюсь, наврядли.
Т.к. на эту задачу у меня уйдет полдня наверное, а сдавать надо было вчера :) Поэтому пришлось действовать грубо и не так изящно, как можно было бы через хтмл-кодирование...
Но если придется взяться опять, то поделюсь конечно, тем более ноу-хау примерно ясно.
chingachgoog
16.08.2007, 20:24
Все же вышло!!!
styleObj = new StyleSheet();
css_str = "A:hover {color:#990000;}" //, A:active {color:#FF0000;}";990000 0764AF
styleObj = new TextField.StyleSheet();
styleObj.parseCSS(css_str)
test.wordWrap = true;
test.multiline=true
//test.autoSize = "right";
test.condenseWhite = true;
test.html = true;
test.embedFonts=true
test.styleSheet = styleObj;
Тут задаем изменение цвета ссылки в гипертексте
function loadXML(_file)
{
doc = new XML();
...
doc.onLoad = function () {
...
test.htmlText =doc.firstChild....nodeValue // Основной текст
arrWord=[]
text0=test.htmlText
text1=test.text
letFind=true
index=0
while(letFind){
posTag=text0.indexOf('<a href="asfunction:showLTip,',index) // найден тег
if (posTag==-1){ // тегов нет, конец цикла
break;
}
posAct=posTag+30
posWord=text0.indexOf('"><u>',posAct) // начало ссылки
posEndWord=text0.indexOf('</u></a>',posWord) //конец ссылки
findWord=text0.substring(posWord+5, posEndWord) // ссылка (видимая)
myFind=text1.indexOf(findWord)
arrWord.push({pos:myFind ,word:findWord, link:text0.substring(posAct-1, posWord)})
index=posEndWord+8
}
}
}
}
Здесь читается текст из xml-ки и вставляется в текстовое поле test
создается массив с индексами ссылок и текстом при наведении на них
onMouseMove=function(){
//var showWind=false
for (var i=0; i<arrWord.length; i++){
my_fmt = test.getTextFormat(arrWord[i].pos,(arrWord[i].pos+arrWord[i].word.length));
if (my_fmt.color==10027008){
trace(arrWord[i].word)
if (!showWind){
showLTip(arrWord[i].link)
showWind=true
}
break;
}
}
if (i==arrWord.length){
hideLTip()
showWind=false
}
}
Собственно движок поиска изменения состояния ссылки и выведения окошка (запуск функции showLTip с передачей параметра - текста ссылки) или закрытие окошка (функция hideLTip())
Поиск расчитан на одну уникальную ссылку в тексте (если она повторяется то надо изменить алгоритм).
Забивается в xml стандартно:
<![CDATA[ .....<a href="asfunction:showLTip,Исономия – равенство гражданских прав."><u>исономии</u></a>....]]>
Блин, без агвы не разберешься... Ну спасибо, изучим! :)
Этот пример я сделал где-то в маеimport TextField.StyleSheet;
//// обычный цвет и цвет при наведении на ссылку
var css:String = "A {color: #000000;}, A:HOVER {color: #000001;}, .test {color: #FF0000;}";
var style:StyleSheet = new StyleSheet ();
style.parseCSS (css);
var txt:TextField = this.createTextField ("txt", 0, 10, 10, 200, 200);
txt.html = true;
txt.multiline = true;
txt.wordWrap = true;
txt.styleSheet = style;
txt.border = true;
//// пример текста
txt.htmlText = "<font size='20'>ABC <a href='#'>DEF</a> GHI <a class='test' href='#'>JKL</a></font><br>";
//// описываем ссылки
var arrayLink:Array = [];
//// pos - позиция первого символа ссылки
//// valOver - цвет до наведения
//// valOut - цвет при наведении (всегда совпадает с A:HOVER)
//// msg - произвольный текст
arrayLink.push ({pos:5, valOver:0x000001, valOut:0x000000, msg:"ссылка 1"});
arrayLink.push ({pos:13, valOver:0x000001, valOut:0xFF0000, msg:"ссылка 2"});
this.onEnterFrame = function () {
for (var i:Number = 0; i < arrayLink.length; i++) {
var obj:Object = arrayLink[i];
var fmt:TextFormat = txt.getTextFormat (obj.pos, obj.pos + 1);
if (!obj.d) {
obj.d = obj.valOut;
} else if (fmt.color != obj.d) {
if (fmt.color == obj.valOver) {
trace (obj.msg + " RollOver");
}
if (fmt.color == obj.valOut) {
trace (obj.msg + " RollOut");
}
obj.d = fmt.color;
}
}
};
Возможно ли узнать, над какой строкой от начала тексфилда находится в данный момент мышиный курсор? Без тупого перелопачивания ВСЕГО содержимого по буковке на каждый onMouseMove/onEnterFrame.
Спасибо.
Эх.. Ограниченная функциональность текстового поля. Печально. :( В Директоре вот например можно..
Теперь вместо одного поля со строками придется плодить пачки текстфилдов в мувиклипах по одной строчке в каждом. И все динамически.. Печально и обидно...
chingachgoog
05.09.2007, 10:06
Возможно ли узнать, над какой строкой от начала тексфилда находится в данный момент мышиный курсор? Без тупого перелопачивания ВСЕГО содержимого по буковке на каждый onMouseMove/onEnterFrame.
Спасибо.
А весь текст по буковке не перелопачивается: только гиперлинки (не по буковке, а строкой целиком) и до первого найденного изменения цвета.
У меня-то весь текст загиперлинкован.. Все строки... Длина этих текстов неизвестна.
Дело в том, что я почти все сделал в одном поле. Вернее, сделал. Вычисляется высота строчки при присвоении, применяется CSS, смотрится разница, округляются величины, смещения и с точностью до пикселя регистрируется ролловер на строчку. Но проблема в том, что на Маках вся эта музыка нафиг сползает и все вычисления накрываются... Так что приходится переделывать.. Хотя с самого начала подозревал, что косяки полезут с таким подходом...
Ariel, а что именно на маках изменяется?
Слетают все мои хитроумные вычисления высоты текстфилда до и после применения стилей, со одной строкой внутри, высоты строки, смещений и прочая. На всех РС с точностью до пикселя все обсчитываеццо. На Ролловере при смене цвета гиперлинки тут же появляется мувиклип ролловера.. Ну и исчезает, соответственно, када гаснет... Но Мак подкузьмил, редиско..
Эта затея изначально была гиблая.
На ПС-ях все стройненько.. Во всех браузерах и операционках. И даже когда размер фонта меняешь через CSS.. Я ж все динамическия размеры считываю. Наверное и под МАК бы сделал, но МАКа для тестов нету.. Проблема.. Т.е., нету возможности толково выяснить, в чем проблема. А почему так делал? Просто очень не хотелось в лоб проблему решать, дупликейтить всю эту тучу мувиклипов с текстфилдами. В QA отдал как есть с пометкой бага на Маке. А сам буду переделывать... Такие вот дела.. А гиблость я тоже сначала чувствовал! :))
А посмотреть сие в действии где-нибудь можно?
Оно от меня хочет пароль.
Фу, блин.. Ну, тогда здесь (http://mega-studio.com/fee/build)! Будем говорить за дропдаун-лист верхней менюшечки и от нее прилетающей.
Будем говорить за дропдаун-лист верхней менюшечки и от нее прилетающей.
Взрыв мозга.
Я что-то не пойму, весь сыр-бор лишь для того, чтобы в дропдауне был фон у линков? Если да, то надо напрочь все переделывать и оставить утопичную идею этой темы.
Головного?
И спинного тоже.
Читай ответ выше.
Если затея действительно была для фона линков, то это явная ошибка проектирования.
Не понял я..
Весь сыр-бор лишь для того, чтобы в дропдауне был этот синий ролловер.
1) В чем утопичность?
2) Почему ее надо оставлять?
3) Я итак переделываю. Из-за Маков. Из-за чего-то еще надо?
4) Почему все мозги повзрывались?
1) В изврате;
2) Потому что надо делать иначе;
4) Прочитай свою цитату из моего поста вслух.
Вердикт: от одного поля отказаться, клепать подряд в столбик N клипов с текстом и заданным функционалом. Ноль геморроя и проблем.
Там две цитаты. Прочитал обе вслух по два раза каждую. Обе прекрасны! Я собственно и говорил, что переделываю всю музыку на ворох клипов/филдов. А то, что в одном поле я пытаюсь изображать - ЧРЕЗВЫЧАЙНО похвально. Проект здоровый, людей занято немеряно, памяти отжирает много. Один пустой фреймворк - 100 кил. Ресурсов, опять же, будет немеряно. И как Вы может, заметили, дропдаун лист обновляется при каждом обновлении текстфилда, куды текст вводим. При этом осуществляется ацкий поиск включений по отпарсенным словарям в массивах. Что процессоронапряжно. Списки заранее неизвестны. И все должно появяться мгновенно. Так что приходиться думать о производительности. Одно дело ОДИН текстфилд, заселяемый отобранными значениями, а другое дело пытаться создавать вагон вложенных клипов/филдов и их заселять.. Все уже насмотрелись на богатые мультимедийные сайты, что после пяти минут бульканий туда-сюда-обратно валят браузер или выжирают всю память. Вообще странно, что мне приходится это все Вам излагать, ведь выше Вас только небо и круче - только гора Казбек..
«Будем говорить за дропдаун-лист верхней менюшечки и от нее прилетающей.»
Как можно говорить ЗА дропдаун-лист? Это не укладывается в моем мозге.
«от нее прилетающей» — прилетающей чего? И как можно говорить ЗА (это как? А почему не говорить «над» или «под»?) что-то от чего-то, да ещё прилетающей (чего?)?
Что касается сабжа, то если все же экономим ресурсы, то изврат с поиском надписи и размещением там фона сожрет едва ли не больше. Не говоря уже о глючности сего решения. Вердикт: убрать нафиг фон, оставить только выделение цветом текста ссылки и все, все довольны.
UPD: И вообще, список из двадцати (а зачем больше? Все равно все на экран не поместится) элементов можно заранее составить (потом скрывать и показывать), а потом просто менять тексты в элементах и все, точно также реализовать и прокрутку вариантов. Если вариантов меньше, то просто скрыть оставшиеся ячейки. Экономия ресурсов налицо, в отличие от постоянного вычисления непонятно чего.
UPD II: Ушел спать.
Нельзя, однако.. Так говорят у нас на дальнем Севере. Нельзя убрать ролловер. Я честно пытался. Мощный запрос засылал. Попросили делать ролловер в точном соответствии с мокапами (как говорят у нас за рубежом). По этой же причине я даже и не заставляю пока дизайнеров перерисовать формы в векторах, а просто вставляю ПНГ-24 из Фотошопа.
«от нее прилетающей» - это как тот самый спор о лаконичности булевых выражений. Всем вроде понятно, что у верхней менюшечки есть только одна кнопа, ее все видят и жмут соответственно. При нажатии верхняя поисковая менюшечка улетает нафиг (как говорят у нас вообще везде), и замест ее прилетает расширенная поисковая менюшечка. У которой тот же самый дропдаун лист (как говорят опять-таки у нас за рубежом). Все это можно написать, было бы время и желание. Ежели еще тщателнЕе объяснять, то, как говорят у нас в городе Лонд0не, успотеешь кувыркамши!! Одн0му и так понятно, а другому, если не понятно, надо на десять секунд дольше смотреть на форму, чтоб осознать, что там только одна кнопа и ....
"список из двадцати (а зачем больше? Все равно все на экран не поместится)" - не пойдет. Сколько будет совпадений по буковам заранее не известно. Размер словарей - неизвестен. Закащик просит выводить дропдаун высотой в треть фуллскриновой высоты (так понятно?). Все остальное - под скролл.
"Глючность решения" - лезет только на МАКе. Переделывать буду ТОЛьКО потому, что МАКа нет для тестинга. Легче день потерять на редевелопмент, чем об пол стучать, МАК искать.
"изврат с поиском надписи и размещением там фона сожрет едва ли не больше" - посмотрели бы код уже. Поиск надписи и размещение там ОДНОГО мувиклипа осушествляется по простенькой формулке ::
if (this._ymouse<MAIN_LISTFIELD_OFFSET || this._ymouse>listFieldWrapper._height+STUPID_ROLLOVER_MARGIN_BOTTOM) stupidRollover._visible=false;
else{
stupidRollover._visible=true;
stupidRollover._y=Math.floor((this._ymouse/stupidRolloverHeight)-.1)*stupidRolloverHeight+STUPID_ROLLOVER_MARGIN_TOP;
}
Поэтому если мы уже будем говорить ЗА производительность, как говорят у нас В Одессе, то делать надо именно на одном поле. Алгоритмик только усовершенствовать нада..
С Уважением,
Ариель :bye:
А линк уже убили? Хотел взглянуть о чем речь.
Ariel, а давайте вот без этих «как говорят в». Я не знаю, как говорят в Одессе, Чувашии, во Владивостоке, Белоруси и т.д. (как и бОльшая часть участников форума). Принятым языком конференции является русский, без какого либо местечкового сленга. Можно было ещё написать на старославянском, чтобы ещё больше сузить круг тех, кому понятно. Я первую половину твоего поста с трудом переварил (и то, не уверен, что правильно) из-за этих «как говорят в». По ссылке там было ещё куча разных кнопок, между прочим.
Что касается сабжа, то мое дело предложить безглючное нормальное оптимизированное (и быстрое!) решение. Твое дело — отказаться и использовать глючный вариант, который якобы быстрее (меньше не кода — не значит, что быстрее). В код мне смотреть лень, т.к. flasm далеко, а запускать венду в окошке ради ASV слишком жирно.
А договариваться и объяснять заказчику, чем он рискует, если выберет именно такое решение нужно уметь. Тем более, в конкретно данном случае никаких внешних изменений дизайна не будет. А вот потенциальных глюков будет точно меньше.
Засим считаю тему себя исчерпавшей.
"список из двадцати (а зачем больше? Все равно все на экран не поместится)" - не пойдет. Сколько будет совпадений по буковам заранее не известно. Размер словарей - неизвестен. Закащик просит выводить дропдаун высотой в треть фуллскриновой высоты (так понятно?). Все остальное - под скролл.
__etc все правильно говорит. Если у вас будет 100 слов, но выводить вы будете одновременно только 20, то и надо сгенирить эти 20 мувиков, а при сроллинге менять их значения. А ваши игры с вычислением размеров - карточный домик.
Всем спасибо за рекомендации.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.