проблема с html тегами @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 33 ] 
*   Список форумов / Технологии изображения / Flash » ответить » создать топик « | »
Автор Сообщение
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Заголовок сообщения: проблема с html тегами
Сообщение Добавлено: 11 Ноябрь 2005, 18:21:22 
Есть текстовое динамическое поле (A) , мне нужно чтобы загруженный текст печатался в нем , с заданной скорость , и при этом работали html теги. Вроде я сделал такой код , но проблема с тегом <b></b> не работает , перенос работает. Делаю так : программно создаю динамическое поле (B) размером 1 , дальше так:
html = true;
multiline = true;
wordWrap = true;

присваиваю ему мой текст :
htmlText = text_data;

а дальше в цикле переношу по частям текст из поля (B) в поле (A)
вот таким образом :
A.replaceText(i, i+shag, B.text.substring(i, i+shag));
i += shag;

в чем ошибка ?
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 12 Ноябрь 2005, 02:56:04 
Для SingleLine поля еще может прокатить такой варинат:
Код:
   var index = 0;

   function onEnterFrame()
   {
      if(index < a.text.length)
      {
            var tf = a.getTextFormat(index, index + 1);
            b.htmlText += a.text.substr(index, 1) + "\b";
            b.setTextFormat(index, index + 1, tf);
            index++;
      }
      else
      {
         delete onEnterFrame;
      }
   }
   


а для MultiLine увы все хуже и страшнее: нужно писать свой парсер.
Создавай XML, типа:
Код:
var xml = new XML("<p><b>Text</b><br /><i>Text</i></p>");

Дальше парси и выводи по символу содержание текстового узла не забывая про дерево тэгов в которое он упакован ;)

Код:
   1) <p><b>T</b></p>
   2) <p><b>Te</b></p>
   3) <p><b>Tex</b></p>
   4) <p><b>Text</b></p>
   5) <p><b>Text</b><br /></p>
   5) <p><b>Text</b><br /><i>T</i></p>
   
   …
   


Не нравится перспектива? ;), … мне тоже :) :) :)
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 12 Ноябрь 2005, 12:58:54 
@st@l@vist@, нда , с парсером не хочу заморачиватся , видимо придется отказатся от этой идеи .
спасибо !
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 12 Ноябрь 2005, 19:26:27 
Ну вообще то, если не использовать вложенность тэгов в html, то можно сделать довольно просто, посмотри, может быть подойдет, а можно и дописать скриптец, мало ли найдется доброволец :)

Код:
var source = new XML("<b>Description</b><br /><br />Use the methods and properties of the XML class to load, parse, send, build, and manipulate XML document trees.<br />You must use the constructor new XML() to create an XML object before calling any method of the XML class.<br /><br /><i>Note: The XML and XMLNode objects are modeled after the W3C DOM Level 1 recommendation:</i><br /><br /><a href=\"http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html\">http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html</a>");
   
   var node = 0;
   var char = 0;
   
   var output = "";
   var tmp = "";
   
   function onEnterFrame()
   {
      if(node < source.childNodes.length)
      {
         if(source.childNodes[node].nodeName != null)
         {
            var attr = "";
            
            for(var a in source.childNodes[node].attributes)
            {
               attr += " " + a + "=\"" + source.childNodes[node].attributes[a] + "\" ";
            }
            
            var startTag = "<" + source.childNodes[node].nodeName + attr + ">";
            var endTag = "</" + source.childNodes[node].nodeName + ">";
            var contents = source.childNodes[node].firstChild.toString();
         }
         else
         {
            var contents = source.childNodes[node].toString();
            var startTag = "";
            var endTag = "";
         }

         if(char < contents.length)
         {
            tmp += contents.substr(char, 1);
            char++            
            txt.htmlText = output + startTag + tmp + endTag;
         }
         else
         {
            output += startTag + tmp + endTag;
            tmp = "";
            char = 0;
            node++
            
            txt.htmlText = output;
         }
      }
      else
      {
         delete onEnterFrame;
      }
   }
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 13 Ноябрь 2005, 14:14:33 
@st@l@vist@, :beer: классный скрипт , жаль надо много доделывать чтоб он поддерживал вложения тегов . но мне наверное хватит и этого .
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 14 Ноябрь 2005, 01:31:36 
Eduard, скрипт фиговый :) - просто один из возможных путей решения …

Есть кстати еще один способ, но если делать одноцветный, однородный фон у текстового поля:

Код:
var html = "";
   
   html += "<html>";
   html += "<body>";
   html += "<p>";
   html += "<u><b><font size=\"20\" face=\"Courier\" color=\"#CC3300\"><a href=\"http://google.com\" target=\"_blank\">Description</a></font></b></u><br /><br />";
   html += "The <b>setTextFormat()</b> method changes the text formatting applied to an individual character, to a range of characters, or to the entire body of text in a text field.<br />";
   html += "</p>";
   html += "</body>";
   html += "</html>";
   
   var chars = 1;
   
   var tf = new TextFormat();
   tf.color = 0xCCCCCC;
   
   createTextField("_txt", 1, 50, 50, 600, 300);
   
   _txt.html = true;
   _txt.multiline = true;
   _txt.background = true;
   _txt.backgroundColor = tf.color;
   _txt.selectable = false;
   _txt.wordWrap = true;

   function onEnterFrame()
   {
      _txt.htmlText = html;
      _txt.setTextFormat(chars, _txt.length, tf);
      
      chars++;
   }



Но тут явная проблема с маркированными списками - это те что UL -> LI
Это кстати вообще проблема, которую так и не решили …
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 14 Ноябрь 2005, 13:54:16 
@st@l@vist@, странно получается , с фоном работает а без фона … а если мне прозрачный фон нужен , то тот классный/фиговый скрипт лучше :dandy:
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 14 Ноябрь 2005, 20:07:54 
а что за глюк такой , загружаю большой текст
Код:
loadVariables("data/text.txt", this)
, в котором есть двойной тег
Код:
<br><br>
и флеш жутко начинает тормозить , даже если просто присвоить текст полю , убираю один из бр-ов все нормально … :cry:
KUZEN Муж.
новый человек
0
Сообщения: 28
Зарегистрирован: 19.11.05
Откуда: Москва
Сообщение Добавлено: 21 Ноябрь 2005, 18:51:34 
Помоему флеша понимает только закрытые теги, т.е. в твоём случае нужно вот так <br></br><br></br>
BlooDHounD Муж.
соучастник
0
Сообщения: 585
Зарегистрирован: 12.03.04
Откуда: Беларусь - Борисов
Сообщение Добавлено: 21 Ноябрь 2005, 21:46:48 
KUZEN, правельнее всё-таки <br />
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 21 Ноябрь 2005, 22:16:02 
<br> - для html, но существует рекомендация, закрывать тэги, то есть <br></br> или покороче <br /> - это важно если загружать xml и пихать его в htmlText …

А что там у Eduard'a, науке не известно :) - смотреть нада, ну и на сколько я знаю, флеш вообще не очень любит огромные тексты, может быть там есть и лимит какойто …
KUZEN Муж.
новый человек
0
Сообщения: 28
Зарегистрирован: 19.11.05
Откуда: Москва
Сообщение Добавлено: 22 Ноябрь 2005, 06:03:24 
Да с HTML во влеше фигово … тегов очень мало поддерживается … хотябы добали бы <table> …
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 22 Ноябрь 2005, 13:30:22 
зачем? :confused:

_________________
можно на ТЫ.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 22 Ноябрь 2005, 13:32:20 
не можешь без <table> во флеше, значит тебе прямая дорога в HTML сайты ;)

_________________
можно на ТЫ.
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 22 Ноябрь 2005, 21:09:37 
без разницы , что <br><br> что <br><br /> одно и то же , после (или во время) загрузки текста из файла data.txt (в котором &t=…...большой текст.….& , флеш как бы замирает на секунду . Если убираю двойной БР или умегьшаю текст , то задержка исчезает. Может и правда флеш не расчитан на большие тексты , я проверил это , сделал чистую флешку в ней небольшое текстовое поле instant name = ttt

Код:
this.loadVariables("text.txt");
this.onData = function() {
   ttt.htmlText = this.t;
};


без разницы какое поле , и какая флешка , как приcсваивать текст полю через его имя или его Var name , задержка остается !
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 22 Ноябрь 2005, 22:21:48 
Eduard, знаешь, проблема скорее всего не в текстах и <br>`ах... Я загружаю через LoadVars () достаточно большие тексты с нектороым html форматированием, <br>`ов подряд там натыкано - будь здоров! (клиенты сами чёт набирают). Никаких торможений.

_________________
можно на ТЫ.
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 23 Ноябрь 2005, 00:31:16 
bE(o0L, проверил LoadVars () , результат то же самый что и при loadVariables

Код:
txt = new LoadVars();
txt.load("text.txt");
txt.onData = function(datatext) {
   ttt.htmlText = datatext;
};
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 23 Ноябрь 2005, 00:45:06 
Eduard, а дай ссылку на этот text.txt ?

_________________
можно на ТЫ.
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 23 Ноябрь 2005, 12:31:41 
bE(o0L, попробуй создай текстовый файл в котором повторяется много раз один и тот же текст (у меня около 10000 символов) , к примеру test text и в нем гденить <br><br> , кстати похоже задержка зависит от сложности текста , так как с таким повторяющимся текстом она уменьшилась , но при увеличении текста , опять стала прежней.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 23 Ноябрь 2005, 15:12:10 
ты про это?
флеш: http://www.create.lv/dofiga_br/

текстовой файл: http://www.create.lv/dofiga_br/dofigabr.txt

_________________
можно на ТЫ.
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 23 Ноябрь 2005, 18:25:41 
bE(o0L, вот http://www.flashtown.org/flash/br_test.rar (6 Кб)
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 23 Ноябрь 2005, 19:19:21 
нужно так:
// вторая кнопка
Код:
on (release) {
   txt2 = new LoadVars();
   txt2.load("text2.txt");
   txt2.onLoad = function() {
      _root.a=unescape(this)
   };
}


и полю ttt2 присвоить переменную a

_________________
можно на ТЫ.
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 23 Ноябрь 2005, 21:02:52 
bE(o0L, проверил , задержка осталась
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 23 Ноябрь 2005, 21:33:53 
у меня нету задержки :dandy:

_________________
можно на ТЫ.
KUZEN Муж.
новый человек
0
Сообщения: 28
Зарегистрирован: 19.11.05
Откуда: Москва
Сообщение Добавлено: 23 Ноябрь 2005, 23:10:45 

bE(o0L писал(а):
не можешь без <table> во флеше, значит тебе прямая дорога в HTML сайты ;)


ага так прям и пошёл :wink:
Eduard Муж.
участник
61
Сообщения: 1629
Зарегистрирован: 24.09.03
Откуда: St.Petersburg , Moscow
Сообщение Добавлено: 24 Ноябрь 2005, 00:03:20 

bE(o0L писал(а):
у меня нету задержки :dandy:

я запускал в 7 и в 8 флеше , и отдельно в плеерах и в браузере , задержка есть.
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 24 Ноябрь 2005, 02:10:13 
Eduard, мистика. щас повнимательней посмотрю всё.

_________________
можно на ТЫ.
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 24 Ноябрь 2005, 02:47:23 
Это не мистика :), и уж тем более проблема не в способе загрузки данных … - это фиговый парсер, чем сложнее структура html, чем больше нодов, чем больше текст - тем больше пройдет времени с момента от txt.htmlText = htmlString и до момента когда все это отобразится.

Это легко проверить, поставте таймер, и посмотрите зависимость.
p.s.: А кроме этого, с большими текстами, флеш не дружил всегда! :)
bE(o0L Муж.
постоянный участник
23
Сообщения: 3311
Зарегистрирован: 22.07.03
Откуда: сзабугра
Сообщение Добавлено: 24 Ноябрь 2005, 03:05:30 
@st@l@vist@, фишка именно в двух и более <br> подряд. если гденить в документе есть ещё хотябы один <br> то работает без задержки (парсинга). Во всяком случае у меня так. (вот тока проверил)

_________________
можно на ТЫ.
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 24 Ноябрь 2005, 03:32:55 
Посмотрел пример, и …. О да! Везет же Eduard'у на "черные дыры" ;)

Код:

   var timer = 0;
   
   var str1 = "test text test text <br><br>";
   
   // var str2 = "test text test text<br>"; // ~=330
   // var str2 = "test text test text<br><br>"; // ~=660
   var str2 = "test text test text"; // ~=6600
   
   for(var i = 0; i < 1000; i++)
   {
      str1 += str2;
   }
   
   createTextField("txt", 1, 0, 0, 200, 300);
   txt.html = true;
   txt.background = true;
   txt.multiline = true;
   txt.wordWrap = true;
   
   function onMouseDown()
   {
      txt.htmlText = "";
      timer = getTimer();
      txt.htmlText = str1;
      onEnterFrame = oEF;
   }
   
   function oEF()
   {
      if(txt.length > 1)
      {
         trace(getTimer() - timer);
         delete onEnterFrame;
         delete onMouseDown;
      }
   }
   
_iv Муж.
Модератор
32
Сообщения: 166
Зарегистрирован: 26.10.05
Откуда: Москва
Сообщение Добавлено: 29 Ноябрь 2005, 17:40:37 
сделал вот такую ботву, вроде работает:
Код:
this.setHtmlPrinterClass = function() {
   delete this.setHtmlPrinterClass;
   var HtmlPrinter = function (htmlText) {
      this.init(htmlText);
   };
   var tmp = HtmlPrinter.prototype;
   tmp.getHTMLText = function(length) {
      if (length>=this.length) {
         return this.xhtml.toString();
      }
      var len = 0;
      var i = 0;
      var text_array = this.text_array;
      while (text_array[i].to<length) {
         i++;
      }
      var item = text_array[i];
      var node = item.node;
      var add_str = node.nodeValue;
      add_str = add_str.substr(0, length-(item.to-item.length));
      var add_node = node.parentNode;
      while (add_node.parentNode) {
         add_str += "</"+add_node.nodeName+">";
         add_node = add_node.parentNode;
      }
      var delimiter = new XML("__HtmlPrinterDelimiter__").firstChild;
      node.parentNode.insertBefore(delimiter, node);
      var out_string = this.xhtml.toString();
      var str = out_string.substr(0, out_string.indexOf("__HtmlPrinterDelimiter__"));
      out_string = str+add_str;
      delimiter.removeNode();
      if (out_string.length) {
         return out_string;
      }
      return "";
   };
   /////////////////////////////////////// PRIVATE
   tmp.init = function(htmlText) {
      var name = "setHtmlPrinterClass"+new Date().getTime()+"_mc";
      var depth = _root.getNextHighestDepth();
      while (_root[name] != undefined) {
         name += new Date().getTime();
      }
      var mc = _root.createEmptyMovieClip(name, depth);
      mc.createTextField("t_txt", 0, 0, 0, 300, 300);
      var t_txt = mc.t_txt;
      t_txt.wordWrap = t_txt.multiline=t_txt.html=true;
      t_txt.htmlText = htmlText;
      this.registerXML(new XML(t_txt.htmlText));
      mc.removeMovieClip();
   };
   tmp.registerXML = function(in_xml) {
      this.xhtml = in_xml;
      var node = in_xml.firstChild;
      var text_array = [];
      this.length = 0;
      while (node) {
         if (node.nodeType == 3) {
            var length = node.nodeValue.length;
            this.length += length;
            text_array.push({node:node, length:length, to:this.length});
         }
         node = nextNode(node);
      }
      this.text_array = text_array;
   };
   // next node
   var nextNode = function (node) {
      if (node.firstChild != null) {
         return node.firstChild;
      }
      var n = node;
      while (n.nextSibling == null) {
         if (n.parentNode) {
            n = n.parentNode;
         } else {
            return null;
         }
      }
      return n.nextSibling;
   };
   //
   _global.org = _global.org || {};
   _global.org.dembicki = _global.org.dembicki || {};
   _global.org.dembicki.HtmlPrinter = _global.org.dembicki.HtmlPrinter || HtmlPrinter;
   _global.ASSetPropFlags(_global.org.dembicki, "HtmlPrinter", 7, 1);
};
this.setHtmlPrinterClass();
// USAGE  USAGE  USAGE  USAGE  USAGE  USAGE  USAGE  USAGE  USAGE */
html = '<P ALIGN=\"LEFT\"><FONT FACE=\"Courier\" SIZE=\"20\" COLOR=\"#CC3300\" LETTERSPACING=\"0\" KERNING=\"0\"><A HREF=\"http://google.com\" TARGET=\"_blank\"><B><U>Description</U></B></A></FONT></P><P ALIGN=\"LEFT\"><FONT FACE=\"Times New Roman\" SIZE=\"12\" COLOR=\"#000000\" LETTERSPACING=\"0\" KERNING=\"0\">The <B>setTextFormat()</B> method changes the text formatting applied to an individual character, to a range of characters, or to the entire body of text in a text field.</FONT></P><LI><FONT FACE=\"Times New Roman\" SIZE=\"12\" COLOR=\"#000000\" LETTERSPACING=\"0\" KERNING=\"0\">any text 1</FONT></LI><LI><FONT FACE=\"Times New Roman\" SIZE=\"12\" COLOR=\"#000000\" LETTERSPACING=\"0\" KERNING=\"0\">any text 2</FONT></LI><LI><FONT FACE=\"Times New Roman\" SIZE=\"12\" COLOR=\"#000000\" LETTERSPACING=\"0\" KERNING=\"0\">any text 3</FONT></LI><LI><FONT FACE=\"Times New Roman\" SIZE=\"12\" COLOR=\"#000000\" LETTERSPACING=\"0\" KERNING=\"0\">any text 4</FONT></LI>';
//
this.createTextField("in_txt", 0, 0, 0, 200, 300);
this.in_txt.html = this.in_txt.wordWrap=this.in_txt.multiline=true;
this.createTextField("out_txt", 1, 210, 0, 200, 300);
this.out_txt.html = this.out_txt.wordWrap=this.out_txt.multiline=true;
//
this.in_txt.htmlText = html;
this.foo = new _global.org.dembicki.HtmlPrinter(html);
this.k = 0;
this.onEnterFrame = function() {
   this.out_txt.htmlText = this.foo.getHTMLText(this.k++);
};
delete html;
// */
_iv Муж.
Модератор
32
Сообщения: 166
Зарегистрирован: 26.10.05
Откуда: Москва
Сообщение Добавлено: 29 Ноябрь 2005, 17:41:19 
- всё это нужно вставить в первый и единственный кадр нового FLA и тестануь.
@st@l@vist@
участник
70
Сообщения: 1606
Зарегистрирован: 20.03.03
Откуда: St.Petersburg
Сообщение Добавлено: 30 Ноябрь 2005, 03:04:59 
Оказывается Eduard'у везет не только на жуков, но и на добровольцев :laugh:

p.s.: занятная миграция народа происходит :)
*   Список форумов / Технологии изображения / Flash « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 33 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100