Я использую var
экстенсивно. Была критика, что это уменьшает удобочитаемость кода, но никакой аргумент для поддержки того требования.
По общему признанию, это может означать, что не ясно, что вводит, мы имеем дело с.И что же? Это - на самом деле точка разъединенного дизайна. При контакте с интерфейсами Вы решительно не заинтересованы типом, который имеет переменная. var
берет это гораздо дальше, верный, но я думаю, что аргумент остается тем же с точки зрения удобочитаемости: программист не должен на самом деле интересоваться типом переменной, а скорее в том, что переменная делает . Поэтому Microsoft также называет вывод типа “duck вводом. ”
Так, что делает переменная, когда я объявляю его с помощью var
? Легкий, это делает любой IntelliSense, говорит мне, что это делает. Любое обоснование о C#, который игнорирует IDE, далеко от действительности. На практике каждый код C# программируется в IDE, который поддерживает IntelliSense.
, Если я использую var
объявленный переменной и запутываюсь, для чего переменная там, существует что-то существенно неправильно с моим кодом. var
не причина, она только делает признаки видимыми. Не обвиняйте средство рассылки.
Теперь, команда C# выпустила инструкцию по кодированию, заявив, что var
должен [только 1 113] использоваться для получения результата оператора LINQ, который создает анонимный тип (потому что здесь, у нас нет реальной альтернативы var
). Ну, винт это. Пока команда C# не дает мне звуковой аргумент в пользу этой инструкции, я собираюсь проигнорировать его, потому что по моему профессиональному и личному мнению, это - чистый вздор. (Извините; у меня нет ссылки на рассматриваемую инструкцию.)
На самом деле, существуют немного (поверхностно) хорошие объяснения на том, почему Вы не должны использовать var
, но я все еще полагаю, что они в основном неправы. Возьмите пример “searchabililty”: автор утверждает, что var
сложно искать места, где MyType
используется. Право. Сделайте интерфейсы. На самом деле, почему я хотел бы знать, где класс используется? Я мог бы больше интересоваться тем, где это инстанцируют, и это все еще будет доступно для поиска, потому что где-нибудь его конструктор должен быть вызван (даже если это сделано косвенно, имя типа должно быть упомянуто где-нибудь).
Это очень интересная проблема. Используя предложение Кея, я придумал метод, который возвращал бы 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
, мышь изменит свой курсор, ведя себя точно так же, как и было, если бы ссылка в тексте работала.
Я определил множество переменных, чтобы код было легче понять. Код можно сократить и оптимизировать, но он тоже должен работать нормально.
Это адский обходной путь для простейших задач, но он работает. Надеюсь на это
Насколько я знаю, это невозможно. Вы можете использовать CSS для стилизации ссылки при наведении курсора (что само по себе является проблемой), но вы не можете зафиксировать этот переход как событие AS. Вы можете зафиксировать щелчок по ссылке с помощью события LINK .
Вы не можете назначать слушателей, но в качестве обходного пути вы можете проверить положение мыши и определить, когда она наводит курсор на какую-то часть текста ... Как только вы определите прямоугольник ссылки (см. TextField.getCharBoundaries ()), вы можете либо создать небольшой спрайт для прослушивания событий, либо проверить, содержит ли прямоугольник Point (mouseX, mouseY) на enterFrame.