PDA

Просмотр полной версии : TextField & asfunction


_serge_
09.03.2007, 19:49
Суть проблемы: создается динамическое текстовое поле (html) туда заносится текст с сылками. При нажатии на ссылку изменяется содержимое текстового поля, НО при этом весь новый текст(вместе со своим форматированием) становится этой же ссылкой? В случае, если создать поле во Flash такого не наблюдается.


Примерный код:

var txt:TextField = this.createTextField("txt", 2, 10, 10, 200, 200);

with (txt) {
background = true; backgroundColor= "0xCCCCCC";
multiline = true; selectable = true;
autoSize = false; wordWrap = true;
textColor = 0x000000; html = true;
txt.htmlText = "pretext <a href='asfunction:my'>link</a>";
}


function my() {
txt.htmlText = "<p>new text</p>";
}

etc
09.03.2007, 20:05
Забавная штука. На перевод строки не реагирует.
Причем ссылку просто так не убить.
Только если выключить html. Ну или:

var txt:TextField = this.createTextField("txt", 2, 10, 10, 200, 200);
with (txt) {
background = true;
backgroundColor = 0xCCCCCC;
multiline = true;
selectable = true;
autoSize = false;
wordWrap = true;
textColor = 0x000000;
html = true;
htmlText = "pretext <a href='asfunction:my'>link</a>\n\n";
}
function my() {
var f = new TextFormat();
f.url = '';
txt.setNewTextFormat(f);
txt.htmlText = '<p>new text</p>';
}

Вот результат ковыряний.

_serge_
09.03.2007, 20:17
Если добавить css для ссылок, можно увидеть, что вставляемый текст форматируется соответствующим образом(даже если отключить html). Причем trace htmlText, TF.length показывают все правильно(((

iNils
09.03.2007, 20:17
Забавный случай, причем url всегда неопределен у текст формата.

etc
09.03.2007, 20:18
Я думаю, это связано с тем, что htmlText и TextFormat завязаны друг с другом. Можно считать это багом.

_serge_
09.03.2007, 20:34
Попробовал вроде бы все возможные манипуляции с TextFormat, styleSheet, результат отрицательный.

etc
09.03.2007, 20:35
Я написал выше код, который убивает ссылку.

_serge_
09.03.2007, 20:44
Я написал выше код, который убивает ссылку.
Вопрос, а как убить общее форматирование ссылки при использовании styleSheet?

etc
09.03.2007, 20:59
Мммммм.

var txt:TextField = this.createTextField("txt", 2, 10, 10, 200, 200);
s = new TextField.StyleSheet();
s.parseCSS('a:link {color:#FF0000}');
with (txt) {
background = true;
backgroundColor = 0xCCCCCC;
multiline = true;
selectable = true;
autoSize = false;
wordWrap = true;
textColor = 0x000000;
html = true;
styleSheet = s;
htmlText = "pretext <a href='asfunction:my'>link</a>\n\n";

}
function my() {
var f = new TextFormat();
f.url = '';
f.color = 0;
txt.styleSheet = null;
txt.setNewTextFormat(f);
txt.htmlText = '<p>new text</p>';
}
Жесть полная. С убийством стилей. Но работает.

_serge_
09.03.2007, 21:19
Да, все это конечно здорово. Только проблема в том, что новый текст также может содержать html-форматирование, соответственно оно будет убито...

iNils
09.03.2007, 21:22
Удалить поле и создать новое.

etc
09.03.2007, 21:25
Уверен?
var txt:TextField = this.createTextField("txt", 2, 10, 10, 200, 200);
s = new TextField.StyleSheet();
s.parseCSS('a:link {color:#FF0000}');
with (txt) {
background = true;
backgroundColor = 0xCCCCCC;
multiline = true;
selectable = true;
autoSize = false;
wordWrap = true;
textColor = 0x000000;
html = true;
styleSheet = s;
htmlText = "pretext <a href='asfunction:my'>link</a>\n\n";
}
function my() {
var f = new TextFormat();
f.url = '';
f.color = 0;
txt.styleSheet = null;
txt.setNewTextFormat(f);
txt.styleSheet = s;
txt.htmlText = 'new text <a href="#">test</a>';
}

А вообще забавно, если последние две строки в функции поменять местами, то новый htmlText не будет присваиваться. Косяк на косяке багом погоняет :D
А вообще да, проще поле снести к черту.

flash33
10.03.2007, 00:46
псевдопротокол asfunction "заточен" под взаимодействие с браузером, вписывание его в тег <a> есть не что иное, как вызов функции getURL. Если вы посмотрите свои глючные примеры в Publish Preview -> HTML, то всё встает на места :)

iNils
10.03.2007, 01:06
Причем тут getURL и что я должен увидеть в Publish Preview -> HTML?

etc
10.03.2007, 02:25
flash33, ты тему вообще читал, а?

Kinsler
10.03.2007, 03:09
var txt:TextField = this.createTextField("txt", 2, 10, 10, 200, 200);

with (txt) {
background = true; backgroundColor= "0xCCCCCC";
multiline = true; selectable = true;
autoSize = false; wordWrap = true;
textColor = 0x000000; html = true;
txt.htmlText = "pretext <a href='asfunction:my'>link</a>";
}


function my() {
sd="my_text";
txt.htmlText = "<b>new text</b>" + sd;
}
мда даже не знал....
после повторного нажатия текст жирным становитца....

etc
10.03.2007, 03:11
Я уже накатал маляву об этом в блоге:
http://dev.etcs.ru/blog/shit/textfield_asfunction_and_stylesheet_wonders/
Честно говоря, никогда не сталкивался с подобным (не было необходимости замены текста ни разу).

Kinsler
10.03.2007, 03:16
мда, чудновато, тоже не сталкивался
на адобе ничего особо не сказно
http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary073.html

kruasan
10.03.2007, 14:15
Убрал "var txt:TextField = ":
this.createTextField("txt", 2, 10, 10, 200, 200);

with (txt) {
background = true; backgroundColor= 0xCCCCCC;
multiline = true; selectable = true;
autoSize = false; wordWrap = true;
textColor = 0x000000; html = true;
htmlText = "pretext <a href='asfunction:my'>link</a>";
}


function my() {
txt.htmlText = "<p>new text</p>";
}
Опубликовал под 7-й плеер.
Баг отсутствует.

etc
10.03.2007, 14:23
Ну значит это проблемы восьмерки.

iNils
10.03.2007, 16:22
Тогда уж и 9-ки

etc
10.03.2007, 16:33
Возможно, но в девятке не смотрел.

Molecula
21.05.2007, 15:53
В 9-ке такой же глюк...сейчас копаюсь с этим.

etc
21.05.2007, 16:07
Паблиш, надеюсь, в FP9/AS3?

Molecula
21.05.2007, 16:24
Блин! Вечный мой баг - торопливость.
"Не говори 'гоп' пока не перепрыгнешь!"
Работает, ошибка была своя.

iNils
21.05.2007, 17:40
Проблема возникала из-за того, что фокус клавиатуры попадал прямо на ссылку. Добавление одной строчки когда все решало.
var txt:TextField = this.createTextField ("txt", 2, 10, 10, 100, 100);
txt.html = true;
s = new TextField.StyleSheet ();
s.parseCSS ('a {color:#FF0000}');
txt.styleSheet = s;
txt.htmlText = "pretext <a href='asfunction:my'>link</a>\n\n";
function my () {
Selection.setSelection (0, 0);
txt.htmlText = 'new text <a href="asfunction:my1">test</a>';
}
function my1 () {
txt.htmlText = 'new text 333<a href="">test</a>';
}

Kikasso
21.05.2007, 19:06
Странно, что ссылка постирается аж до низа текстового поля (если нет другого текста внизу).
iNils, круто.

iNils
21.05.2007, 20:21
Со стилями много проблем. Вот еще одна.
вот еще баг
1. сделайте клип в библиотеки с линком lib (квадарт размером 60 на 60)
2. вставьте код, запустите и наведите мышку на оранжевый текст, строка ниже сдвигается на ширину клипа из библиотеки.
3. потом последовательно раскомментарьте строки, сначала одну потом другую, это как с этим бороться. то есть либо отказать от <br> перед картинкой либо после каждой ссылки делать невидимую пустую строку

import TextField.StyleSheet;
var css:String = "A {color: #FF4E00;} A:HOVER {color: #0000FF;}";
var style:StyleSheet = new StyleSheet ();
style.parseCSS (css);
var xml:XML = new XML ("<![CDATA[<a href='123'>macromedia</a><br/>macromedia<br/>macromedia<br/><img src='lib'></img>]]>")
//var xml:XML = new XML ("<![CDATA[<a href='123'>macromedia</a><br/>macromedia<br/>macromedia<img src='lib'></img>]]>")
//var xml:XML = new XML ("<![CDATA[<a href='123'>macromedia</a><br/><textformat leading='-17'><br/></textformat>macromedia<br/>macromedia<br/><img src='lib'></img>]]>")
xml.ignoreWhite = true
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 = xml.firstChild.nodeValue

Kikasso
21.05.2007, 20:45
Да, прикольно. Я помню еще джипеги любят обрезаться по границе текстового поля, и приходится css пересаживать. Глюков больше, чем пользы.

iNils
21.05.2007, 20:49
Обрезаться или под маску залезать?

Kikasso
21.05.2007, 21:10
Именно обрезаться. То есть текстовое поле невысокое, высота текста больше. Все картинки не влезающие в поле обрезаются по границе поля, а те что не видны - вообще не показываются. Или это было когда я размер поля менял, счас не помню точно - нет под рукой этой проблемы. После повторного указания css все становилось норм.

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

Kikasso
21.05.2007, 21:30
Попытался повторить глюк, не получилось, поймал другой. Картинка не режется, но почему-то поле считает, что его _height это textHeight. Ничего не понимаю.
var myX:XML = new XML;
var txt:TextField = createTextField( "txt", 1, 0,0,300,100);
txt.multiline = true;
txt.html = true;
txt.selectable = true;
txt.border = true;
myX.onLoad = function ( ok ){
if(ok && this.status == 0) txt.htmlText = this.firstChild;
else txt.text = "не ok " + this.status;
}

b1.onPress = function(){
var path = 'test.xml';
myX.load( path );
}
b2.onPress = b2.onRelease = function(){
txt._height -= 1;
txt.scroll++;
}
b3.onPress = b3.onRelease = function(){
txt._height += 1;
txt.scroll--;
}xml:<xml>text<img src='test.png' /><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>text</xml>Стоит убрать картинку, все ок.

Если просто писать txt._height = 100 все нормально, а getter явно не то выдает.