Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   html текст, как отловить событие наведения на ссылку? (http://www.flasher.ru/forum/showthread.php?t=99633)

chingachgoog 09.08.2007 21:33

html текст, как отловить событие наведения на ссылку?
 
с помощью CSS сам текст видоизменяется как надо, asfunction по клику тоже работает, а вот как отловить СОБЫТИЕ наведения на ссылку?

(тема начала обсуждаться тут, но ответа там нет)

Usnul 09.08.2007 23:25

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

Wolsh 10.08.2007 01:33

Да как обычно ловишь событие джаваскриптом (онмаусовер) и запускаешь нужную функцию...
Код HTML:

<a href="http://my_site.ru" onmouseover="my_function(my_parameter);">типа мой сайтик</a>

etc 10.08.2007 02:25

Wolsh, какой нафиг onmouseover внутри флеша для html?

Я делал подобную вещь, насколько я помню, отслеживалось изменение цвета линка при наведении на него мышью.

Wolsh 10.08.2007 10:42

Простите, зарапортовался :) Я думал на хтмл-странице...

chingachgoog 10.08.2007 12:07

Цитата:

Сообщение от __etc
Wolsh, какой нафиг onmouseover внутри флеша для html?

Я делал подобную вещь, насколько я помню, отслеживалось изменение цвета линка при наведении на него мышью.

Я тоже об этом думал, но если ссылок несколько, как узнать над которой именно находиться мышь? Или отслеживание цвета именно этого линка? Тогда как?

etc 10.08.2007 13:01

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

chingachgoog 10.08.2007 13:15

Могу понять, как найти ссылку в текстовом поле.
Но не могу понять, как определить цвет ФРАГМЕНТА текстового поля?

etc 10.08.2007 13:30

getTextFormat

chingachgoog 10.08.2007 14:00

Понял.
Это третий вариант синтаксиса:
my_txt.getTextFormat(beginIndex:Number, endIndex:Number) : Object

Спасибо.

Wolsh 10.08.2007 15:43

А свойство полученного объекта можно в watch поставить?

PS chingachgoog, ты уж поделись со всеми технологией, когда получится, ОК?

etc 10.08.2007 15:46

Код:

txt = this.createTextField('txt',0,10,10,100,20);
txt.text = 'test';
trace(txt.getTextFormat(0,1)==txt.getTextFormat(0,1)); // false


Wolsh 10.08.2007 15:55

При каждом гете создается новый объект и они не равны?
Но мы же можем сделать один объект и ватчить только одно его свойство?
Или придется определять через переменную?

etc 10.08.2007 15:58

Код:

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);


Wolsh 10.08.2007 16:05

Ну вот. Объекты-то нам сравнивать не надо, только свойство.
Оно отлавливается. Так можно его как-то в ватч запихать?

etc 10.08.2007 16:53

Если все-таки непонятно: оно не меняется. Что и иллюстрирует написанный мною пример.

Wolsh 10.08.2007 17:13

Да нет, понятно что переменная ХРАНИТ значение.
А свойство-то меняется :) Но оно, конечно, привязано к объекту...

etc 10.08.2007 17:15

Не привязано оно ни к чему.

Wolsh 10.08.2007 17:35

__etc, чесслово я не программер, и вашей фени не знаю :)
Извини если не так сказал, ОК? Я имел в виду, что новое значение свойства мы получим только с новым объектом, а у старого, хранимого в переменной, ничего не изменится.
Итак, при каждом вызове гетТекстФормат мы получаем новый объект с интересующим нас свойством color, на известное заранее значение которого надо среагировать. В watch мы не можем следить ни за чем, кроме переменной - так? Переменная не меняется :) сама по себе. Значит надо создать вызов опроса по интервалу, соотв. watch уже не нужен, хватит просто if.
В общем, решение совсем некрасивое, интервалы всякие... Эх, будет ли когда-нибудь событие изменения курсора :)

etc 10.08.2007 17:37

Достаточно повесить onMouseMove+updateAfterEvent.

chingachgoog 10.08.2007 17:43

Цитата:

Сообщение от Wolsh
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>....]]>

Wolsh 17.08.2007 09:56

Блин, без агвы не разберешься... Ну спасибо, изучим! :)

iNils 17.08.2007 15:05

Этот пример я сделал где-то в мае
Код:

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;
                }
        }
};


Ariel 05.09.2007 03:11

Возможно ли узнать, над какой строкой от начала тексфилда находится в данный момент мышиный курсор? Без тупого перелопачивания ВСЕГО содержимого по буковке на каждый onMouseMove/onEnterFrame.

Спасибо.

etc 05.09.2007 03:15

Нет, это невозможно.

Ariel 05.09.2007 03:36

Эх.. Ограниченная функциональность текстового поля. Печально. :( В Директоре вот например можно..
Теперь вместо одного поля со строками придется плодить пачки текстфилдов в мувиклипах по одной строчке в каждом. И все динамически.. Печально и обидно...

chingachgoog 05.09.2007 10:06

Цитата:

Сообщение от Ariel
Возможно ли узнать, над какой строкой от начала тексфилда находится в данный момент мышиный курсор? Без тупого перелопачивания ВСЕГО содержимого по буковке на каждый onMouseMove/onEnterFrame.

Спасибо.

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

Ariel 05.09.2007 19:40

У меня-то весь текст загиперлинкован.. Все строки... Длина этих текстов неизвестна.

Дело в том, что я почти все сделал в одном поле. Вернее, сделал. Вычисляется высота строчки при присвоении, применяется CSS, смотрится разница, округляются величины, смещения и с точностью до пикселя регистрируется ролловер на строчку. Но проблема в том, что на Маках вся эта музыка нафиг сползает и все вычисления накрываются... Так что приходится переделывать.. Хотя с самого начала подозревал, что косяки полезут с таким подходом...

udaaff 05.09.2007 22:16

Ariel, а что именно на маках изменяется?

Ariel 05.09.2007 23:25

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

etc 06.09.2007 00:29

Эта затея изначально была гиблая.

Ariel 06.09.2007 01:04

На ПС-ях все стройненько.. Во всех браузерах и операционках. И даже когда размер фонта меняешь через CSS.. Я ж все динамическия размеры считываю. Наверное и под МАК бы сделал, но МАКа для тестов нету.. Проблема.. Т.е., нету возможности толково выяснить, в чем проблема. А почему так делал? Просто очень не хотелось в лоб проблему решать, дупликейтить всю эту тучу мувиклипов с текстфилдами. В QA отдал как есть с пометкой бага на Маке. А сам буду переделывать... Такие вот дела.. А гиблость я тоже сначала чувствовал! :))

etc 06.09.2007 01:22

А посмотреть сие в действии где-нибудь можно?

etc 06.09.2007 01:33

Оно от меня хочет пароль.

Ariel 06.09.2007 01:49

Фу, блин.. Ну, тогда здесь! Будем говорить за дропдаун-лист верхней менюшечки и от нее прилетающей.

etc 06.09.2007 01:55

Цитата:

Сообщение от Ariel
Будем говорить за дропдаун-лист верхней менюшечки и от нее прилетающей.

Взрыв мозга.

Я что-то не пойму, весь сыр-бор лишь для того, чтобы в дропдауне был фон у линков? Если да, то надо напрочь все переделывать и оставить утопичную идею этой темы.

Ariel 06.09.2007 01:57

Головного?

etc 06.09.2007 02:04

Цитата:

Сообщение от Ariel
Головного?

И спинного тоже.

Читай ответ выше.
Если затея действительно была для фона линков, то это явная ошибка проектирования.

Ariel 06.09.2007 02:08

Не понял я..

Весь сыр-бор лишь для того, чтобы в дропдауне был этот синий ролловер.

1) В чем утопичность?
2) Почему ее надо оставлять?
3) Я итак переделываю. Из-за Маков. Из-за чего-то еще надо?
4) Почему все мозги повзрывались?


Часовой пояс GMT +4, время: 02:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.