Flex: Прислушивание к 'Парению' по Ссылке в текстовой области

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

По общему признанию, это может означать, что не ясно, что вводит, мы имеем дело с.И что же? Это - на самом деле точка разъединенного дизайна. При контакте с интерфейсами Вы решительно не заинтересованы типом, который имеет переменная. var берет это гораздо дальше, верный, но я думаю, что аргумент остается тем же с точки зрения удобочитаемости: программист не должен на самом деле интересоваться типом переменной, а скорее в том, что переменная делает . Поэтому Microsoft также называет вывод типа “duck вводом. ”

Так, что делает переменная, когда я объявляю его с помощью var? Легкий, это делает любой IntelliSense, говорит мне, что это делает. Любое обоснование о C#, который игнорирует IDE, далеко от действительности. На практике каждый код C# программируется в IDE, который поддерживает IntelliSense.

, Если я использую var объявленный переменной и запутываюсь, для чего переменная там, существует что-то существенно неправильно с моим кодом. var не причина, она только делает признаки видимыми. Не обвиняйте средство рассылки.

Теперь, команда C# выпустила инструкцию по кодированию, заявив, что var должен [только 1 113] использоваться для получения результата оператора LINQ, который создает анонимный тип (потому что здесь, у нас нет реальной альтернативы var). Ну, винт это. Пока команда C# не дает мне звуковой аргумент в пользу этой инструкции, я собираюсь проигнорировать его, потому что по моему профессиональному и личному мнению, это - чистый вздор. (Извините; у меня нет ссылки на рассматриваемую инструкцию.)

На самом деле, существуют немного (поверхностно) хорошие объяснения на том, почему Вы не должны использовать var, но я все еще полагаю, что они в основном неправы. Возьмите пример “searchabililty”: автор утверждает, что var сложно искать места, где MyType используется. Право. Сделайте интерфейсы. На самом деле, почему я хотел бы знать, где класс используется? Я мог бы больше интересоваться тем, где это инстанцируют, и это все еще будет доступно для поиска, потому что где-нибудь его конструктор должен быть вызван (даже если это сделано косвенно, имя типа должно быть упомянуто где-нибудь).

5
задан Chin 3 August 2009 в 14:34
поделиться

3 ответа

Это очень интересная проблема. Используя предложение Кея, я придумал метод, который возвращал бы Array из Rectangle объектов, соответствующих местоположениям текста. Я использую множественное число, потому что может потребоваться несколько прямоугольников, если текст разбит на слова.

function getPhraseLocation(phrase:String, field:TextField):Array {
    // initialise the return array
    var locations:Array = new Array();
    // find the first and last chars
    var firstChar = field.text.indexOf(phrase);
    var lastChar = firstChar+phrase.length;
    // determine the bounding rectangle of the first char
    var firstCharRect = field.getCharBoundaries(firstChar);
    var crtLocation:Rectangle = new Rectangle(firstCharRect.left,firstCharRect.top,firstCharRect.width,firstCharRect.height);
    // while there are chars left in the string
    var crtChar:uint = firstChar;
    while (++crtChar<lastChar)
        // if they're on the same line, expand the current rectangle
        if (field.getCharBoundaries(crtChar).y==crtLocation.y) crtLocation.width = uint(crtLocation.width)+field.getCharBoundaries(crtChar).width;
        // if they're on the next line, due to word wrapping, create a new rectangle
        else {
            locations.push(crtLocation);
            var crtCharRect = field.getCharBoundaries(crtChar);
            crtLocation = new Rectangle(crtCharRect.left,crtCharRect.top,crtCharRect.width,crtCharRect.height);
        }
    // add the last rectangle to the array
    locations.push(crtLocation);
    // return the array
    return(locations);
}

Предположим, мы создали TextField следующим образом:

var field:TextField = new TextField();
this.addChild(field);
// move the text field to some random coordinates
field.x = 50;
field.y = 50;
// set wordwrap to true, to test the multiline behaviour of our function
field.wordWrap = true;
// set a smaller width than our text
field.width = 300;
// disable selectability, I'm not sure it would work properly, anyway
field.selectable = false;
// fill the textfield with some random html text
field.htmlText = 'Lorem ipsum dolor sit amet, consectetur adipiscing <a href="http://www.stackoverflow.com">elit. Aliquam et</a> elementum lorem. Praesent vitae nunc at mi venenatis auctor.';

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

// create a sprite and add it to the display list
var overlay:Sprite = new Sprite();
this.addChild(overlay);
// enable mouse actions on it and make the cursor change on hover
overlay.mouseEnabled = true;
overlay.buttonMode = true;
// call the function that returns the size and position of the bounding boxes
var locationArray:Array = getPhraseLocation('elit. Aliquam et',field);
// draw each rectangle in white transparent fill
for each (var bounds:Rectangle in locationArray) {
    overlay.graphics.beginFill(0xff0000,0);
    overlay.graphics.drawRect(bounds.x+field.x-overlay.x, bounds.y+field.y-overlay.y, bounds.width, bounds.height);
    overlay.graphics.endFill();
}

Затем добавьте прослушиватель событий для MouseOver :

overlay.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
function mouseOverHandler(evt:MouseEvent):void {
    trace('mouse over key phrase');
    // do whatever else you want to do
}

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

overlay.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(evt:MouseEvent):void {
    navigateToURL(new URLRequest('http://www.stackoverflow.com'));
}

Поскольку мы ранее установили для атрибута buttonMode значение true , мышь изменит свой курсор, ведя себя точно так же, как и было, если бы ссылка в тексте работала.

Я определил множество переменных, чтобы код было легче понять. Код можно сократить и оптимизировать, но он тоже должен работать нормально.

Это адский обходной путь для простейших задач, но он работает. Надеюсь на это

3
ответ дан 14 December 2019 в 08:56
поделиться

Насколько я знаю, это невозможно. Вы можете использовать CSS для стилизации ссылки при наведении курсора (что само по себе является проблемой), но вы не можете зафиксировать этот переход как событие AS. Вы можете зафиксировать щелчок по ссылке с помощью события LINK .

1
ответ дан 14 December 2019 в 08:56
поделиться

Вы не можете назначать слушателей, но в качестве обходного пути вы можете проверить положение мыши и определить, когда она наводит курсор на какую-то часть текста ... Как только вы определите прямоугольник ссылки (см. TextField.getCharBoundaries ()), вы можете либо создать небольшой спрайт для прослушивания событий, либо проверить, содержит ли прямоугольник Point (mouseX, mouseY) на enterFrame.

2
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: