Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Вставка SMARTY функции в innerHTML (https://javascript.ru/forum/dom-window/20840-vstavka-smarty-funkcii-v-innerhtml.html)

fiw 19.08.2011 14:40

Вставка SMARTY функции в innerHTML
 
Ребята помогите грамотно решить следующую задачу.

Есть код:
{literal}
<script type="text/javascript">
document.getElementById('WallComments').innerHTML = '{/literal}{he_wall_display object="album_file" object_id="35156"}{literal}';
</script>
{/literal}


Тут я вставляю смарти функцию. Все собственно сделано правильно, но сама функция имеет следующее содержание, из за которого вставка корректно не происходит.
Функция производит вставку целого файла.

Содержимое вставляемого файла:

<style>
.media_container {ldelim}
    margin-left: 20px;
{rdelim}
.video_info {ldelim}
    margin-top: 6px;
    padding-top: 6px;
{rdelim}
</style>
<script type="text/javascript">
window.addEvent('domready', function(){ldelim}
    he_wall.action_ids = {$js_action_ids};
    he_wall.wall_object = '{$wall_object}';
    he_wall.wall_object_id = {$wall_object_id};
    he_wall.allow_post = {$allow_post};
    he_wall.actions_per_page = {$setting.setting_he_wall_actions_per_page},
    he_wall.disable_music_upload = {if !$setting.setting_he_wall_disable_music}false{else}true{/if};
    he_wall.construct( '{$wall_uid}' );
{rdelim});
</script>

{if $wall_object != 'userhome'}
<style type="text/css">
.wall_action .wall_link {ldelim}display: none;{rdelim}
</style>
{/if}
... // и так далее


В итоге готовая страничка в браузере имеет следующий вид:

<script type="text/javascript">
document.getElementById('WallComments').innerHTML = '<style> 
.media_container {
    margin-left: 20px;
}
.video_info {
    margin-top: 6px;
    padding-top: 6px;
}
</style>
<script type="text/javascript">
window.addEvent('domready', function(){
    he_wall.action_ids = ["44828","44656"];
    he_wall.wall_object = 'album_file';
    he_wall.wall_object_id = 35156;
    he_wall.allow_post = 1;
    he_wall.actions_per_page = 15,
    he_wall.disable_music_upload = true;
    he_wall.construct( 'wall_4e4e3c3079609' );
});
</script>
<style type="text/css">
.wall_action .wall_link {display: none;}
</style>
// и так далее


Вообщем что можно сделать чтобы не редактировать сам файл шаблона, который вставляет смарти функция.
Потому, там менять очень много чего придется...
При вставке {he_wall_display object="album_file" object_id="35156"}
В обычный HTML код все работает корректно.
Но как бы это вставлять через innerhtml?

B@rmaley.e><e 23.08.2011 23:42

Цитата:

Сообщение от fiw
Вообщем что можно сделать чтобы не редактировать сам файл шаблона, который вставляет смарти функция.

Создать скрытую textarea, куда поместить всё это. А потом просто получать её содержимое.
Должно работать, если только в генерируемом коде нет закрывающего тега </textarea>.

<textarea id="aaa">
<script><script><script>
<html></body><head><link>
</textarea>

<script>alert(document.getElementById('aaa').value)</script>
Но это грязный хак, и я бы не советовал им пользоваться.

Ещё можно попробовать поместить генерируемый код в комментарий и найти комментарий в DOM дереве. Но о работоспособности этого метода я ничего не знаю.

devote 23.08.2011 23:52

А можно использовать special chars для HTML и тогда даже закрытая textarea не помешает:
<textarea id="aaa"> 
&lt;script&gt;&lt;script&gt;&lt;script&gt; 
&lt;html&gt;&lt;/body&gt;&lt;head&gt;&lt;link&gt; 
</textarea>
<script>alert(document.getElementById('aaa').value)</script>

B@rmaley.e><e 23.08.2011 23:58

devote, тогда уж обработать строку (эксейпить кавычки, переносы строк, слеши) и засунуть в таком виде в document.getElementById('WallComments').innerHTML = '…';


Часовой пояс GMT +3, время: 22:30.