Просмотр полной версии : TextField & asfunction
Суть проблемы: создается динамическое текстовое поле (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>";
}
Забавная штука. На перевод строки не реагирует.
Причем ссылку просто так не убить.
Только если выключить 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>';
}
Вот результат ковыряний.
Если добавить css для ссылок, можно увидеть, что вставляемый текст форматируется соответствующим образом(даже если отключить html). Причем trace htmlText, TF.length показывают все правильно(((
Забавный случай, причем url всегда неопределен у текст формата.
Я думаю, это связано с тем, что htmlText и TextFormat завязаны друг с другом. Можно считать это багом.
Попробовал вроде бы все возможные манипуляции с TextFormat, styleSheet, результат отрицательный.
Я написал выше код, который убивает ссылку.
Я написал выше код, который убивает ссылку.
Вопрос, а как убить общее форматирование ссылки при использовании styleSheet?
Мммммм.
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>';
}
Жесть полная. С убийством стилей. Но работает.
Да, все это конечно здорово. Только проблема в том, что новый текст также может содержать html-форматирование, соответственно оно будет убито...
Удалить поле и создать новое.
Уверен?
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
А вообще да, проще поле снести к черту.
псевдопротокол asfunction "заточен" под взаимодействие с браузером, вписывание его в тег <a> есть не что иное, как вызов функции getURL. Если вы посмотрите свои глючные примеры в Publish Preview -> HTML, то всё встает на места :)
Причем тут getURL и что я должен увидеть в Publish Preview -> HTML?
flash33, ты тему вообще читал, а?
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;
}
мда даже не знал....
после повторного нажатия текст жирным становитца....
Я уже накатал маляву об этом в блоге:
http://dev.etcs.ru/blog/shit/textfield_asfunction_and_stylesheet_wonders/
Честно говоря, никогда не сталкивался с подобным (не было необходимости замены текста ни разу).
мда, чудновато, тоже не сталкивался
на адобе ничего особо не сказно
http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary073.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>";
}
function my() {
txt.htmlText = "<p>new text</p>";
}
Опубликовал под 7-й плеер.
Баг отсутствует.
Ну значит это проблемы восьмерки.
Возможно, но в девятке не смотрел.
Molecula
21.05.2007, 15:53
В 9-ке такой же глюк...сейчас копаюсь с этим.
Паблиш, надеюсь, в FP9/AS3?
Molecula
21.05.2007, 16:24
Блин! Вечный мой баг - торопливость.
"Не говори 'гоп' пока не перепрыгнешь!"
Работает, ошибка была своя.
Проблема возникала из-за того, что фокус клавиатуры попадал прямо на ссылку. Добавление одной строчки когда все решало.
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>';
}
Странно, что ссылка постирается аж до низа текстового поля (если нет другого текста внизу).
iNils, круто.
Со стилями много проблем. Вот еще одна.
вот еще баг
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
Да, прикольно. Я помню еще джипеги любят обрезаться по границе текстового поля, и приходится css пересаживать. Глюков больше, чем пользы.
Обрезаться или под маску залезать?
Именно обрезаться. То есть текстовое поле невысокое, высота текста больше. Все картинки не влезающие в поле обрезаются по границе поля, а те что не видны - вообще не показываются. Или это было когда я размер поля менял, счас не помню точно - нет под рукой этой проблемы. После повторного указания css все становилось норм.
Картинки в текстфилде не обрезаются, а попападют под маску - которая есть обычный мувиклип. То есть ее можно двигать, вращать или менять размеры. Но это хак. )
Попытался повторить глюк, не получилось, поймал другой. Картинка не режется, но почему-то поле считает, что его _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 явно не то выдает.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.