Форум 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 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, а что именно на маках изменяется?


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

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