Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Передача переменных с неэкранированными кавычами


Автор: Farik 13.5.2005, 12:10
Задачка такая - на сервере генерится контент из тимплейта, получается здоровая таблица
Таблица форматирована фигово
Код

<td>%SPECIAL_BAD_LINK%</td>
<TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE1%</td>
<TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE2%</td>
<TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE3%</td>

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

function line(a1,a2,a3) {
 document.write("
 <TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE1%</td>
 <TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE2%</td>
 <TD bgcolor=#ffffff align=right><FONT color=#%COLOR%>%VALUE3%</td>
 ";
}

line('a','b','c');
line('e','f','g');
line('h','g','k');


Собственно затык возник в связи с тем, что некоторые переменные содержат все мыслимые кавычки и при генерации странички на сервере переменная %SPECIAL_BAD_LINK% заменяется на <a href="javascript:graph('634','1783051763',0)">graph</a> и при попытке это передать в функцию получается фигня
Код

line('<a href="javascript:graph('634','1783051763',0)">graph</a>','b','c');


Я себе представляю выход из такой ситуации только следующий, изменить старый тимплейт
Код

<td>%SPECIAL_BAD_LINK%</td>

на
Код

<div style="display:none;" id='sp_bad_code'>%SPECIAL_BAD_LINK%</div>

и в функцию вывода передавать
Код

line(escape(document.GetElementById('sp_bad_code').innerHTML),'g','k');


И вот собственно вопрос - есть ли какие либо варианты дальнейшего уменьшения размера странички, передаваемой пользователю в сложившихся обстоятельствах?

Автор: Aliance 13.5.2005, 15:09
Цитата(Farik @ 13.5.2005, 13:10)
Собственно затык возник в связи с тем, что некоторые переменные содержат все мыслимые кавычки и при генерации странички на сервере переменная %SPECIAL_BAD_LINK% заменяется на <a href="javascript:graph('634','1783051763',0)">graph</a> и при попытке это передать в функцию получается фигня

Просто используй escape-последовательности, замени все кавычки на \".

Цитата(Farik @ 13.5.2005, 13:10)
И вот собственно вопрос - есть ли какие либо варианты дальнейшего уменьшения размера странички, передаваемой пользователю в сложившихся обстоятельствах?

Дык циклом можно делать. Покажи какой код должен получить браузер?

А зачем в твоей функции аргументы? Или ты ее (функция) сократил?

Автор: Farik 13.5.2005, 18:42
так
видимо неясно обьяснил...
есть шаблон
Код

 <td id=AAA>%SPECIAL_BAD_LINK%</td>


cgi-шник на сервере возвращает страничку, сформированную по этому шаблону
Код

 <td id=AAA><a href="javascript:graph('634','1783051763',0)">graph</a></td>


и эта страничка отправляется к пользователю
так вот в связи с тем, что фактически это огромная таблица, заполненная цифрами, есть возможность сократить её размер, вынеся структуру таблицы в JavaScript, а данные передавая в виде параметров функции

Код

function line(a1,a2,a3) {    
 document.write("    
 <TD bgcolor=#ffffff align=right><FONT color=#a1>a2</td>    
 <TD bgcolor=#ffffff align=right><FONT color=#a1>a2+a3</td>    
 <TD bgcolor=#ffffff align=right><FONT color=#a1>a3</td>    
 ";    
}    
line('a','b','c');    
line('e','f','g');    
line('h','g','k');


в связи с тем, что структура - для всей таблицы одна и та же
Код

<tr><td bgcolor=red>A</td><td bgcolor=green>B</td><td bgcolor=blue>C</td>...<td bgcolor=white>Z</td></tr>
и так - 150 строчек

экономия при вынесении этой структуры в JScript, как показано выше, получается очень и очень существенной - в моём случае вместо 150кб - 20кб, из которых 5кб - кеширующийся после первого использования .js файл, то есть получается 150кб к 15кб

так вот всю эту красоту портит парочка аргументов, те сгененённая по шаблону
Код

 <tr><td>%SPECIAL_BAD_LINK%</td><td>%data%</td></tr>

страничка получается такой
Код

 <tr><td><a href="javascript:graph('634','1783051763',0)">graph</a></td><td>634</td></tr>


и при попытке передать в виде аргумента переменную <a href="javascript:graph('634','1783051763',0)">graph</a>
Код

 line('<a href="javascript:graph('634','1783051763',0)">graph</a>', '634');

получается фигня 8(

экранировать кавычки внутри этой переменной я не могу, тк есть возможность изменения только тимплейта, а не формата вставляемых в него переменных. Для того, чтобы экранировать, нужно сначала пременную обьявить, а этого сделать не получается.
Страничка, сгенерённая по шаблону
Код

 line('%SPECIAL_BAD_LINK%','%data%');

обработанна корректно быть не может
Код

 line('<a href="javascript:graph('634','1783051763',0)">graph</a>','634');

потому как внутри переменной %SPECIAL_BAD_LINK% содержатся оба вида кавычек 8(

Так вот собственно и вопрос - есть ли возможность изменить шаблон так, чтобы как то использовать переменную <a href="javascript:graph('634','1783051763',0)">graph</a> в JScript коде?

Автор: Aliance 13.5.2005, 18:55
Я ж говорю - замени там кавычки. Или escape-последовательности, или &quot;

ЗЫ: не JScript, а JavaScript коде 8))

Автор: Farik 31.5.2005, 18:51
JScript - это интерпретация JavaScript в IE
не могу я "там заменить кавычки"

есть код, возвращающий страничку, к нему я доступа не имею
Код

 $str = "<a href="javascript:graph('634','1783051763',0)">graph</a>";
 $template = '%s';
 sprintf($template, $str);


переменная $template задаётся мной, а всё остальное - нет
вопрос как раз в том, есть ли возможность изменить тимплейт так, чтобы работало то, что я описываю выше

Автор: Black 31.5.2005, 19:47
Farik

А так:

Код

$str = "<a href=javascript:graph('634','1783051763',0)>graph</a>";
$template = '%s';
sprintf($template, $str);


????

или так:

Код

$str = "<a href='javascript:graph(634,1783051763,0)'>graph</a>";
$template = '%s';
sprintf($template, $str);


или так:

Код

$str = "<a href='javascript:graph(\'634\',\'1783051763\',0)'>graph</a>";
$template = '%s';
sprintf($template, $str);

Автор: Farik 1.6.2005, 00:55
Цитата(Farik @ 31.5.2005, 18:51)
есть код, возвращающий страничку, к нему я доступа не имею


Цитата(Farik @ 31.5.2005, 18:51)
переменная $template задаётся мной, а всё остальное - нет


я могу изменить содержимое переменной $template
могу так
$template = 'ASDASDAD %s $!@#$!#@$@#';
могу так
$template = '$!@#$!#@$@# %s ASDASDAD';

изменить содержимое скрипта - не могу.

Автор: Sardar 1.6.2005, 01:08
Farik не меняя код никак, но не пойму почему нельзя подредактировать строчку кода на:
Код
sprintf($template, addslashes($str));

Автор: Farik 1.6.2005, 19:36
я бы с удовольствием подредактировал, не будь эта строчка кода скомпилированным cgiшником.... 8(
у меня есть доступ только к тимплейту, который используется при генрации таблицы (то бишь при подставлении туда данных из БД)
в пхп я бы это сделал через
Код

echo <<<END
Такой синтаксис. ' и " пройдут в моей ситуации
END;

вот надеялся, что есть какой либо подобный приём жаве, да видимо нету....

М
 

Думаю стоит открыть коллекцию постов, где JS называют Jav`ой - лувр будет завидовать...

Автор: Sardar 1.6.2005, 19:44
Увы heredoc фича PHP, редко где ещё встретишь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)