Как удалить <script> ?
Пишу модуль для joomla. При загрузке модуля, из php-файла вставляется <script> такого вида:
<script> (function($) { $(document).ready(function() { if (!$(document).bxSlider) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "<?php echo JURI::root()?>modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js"; $("head").append(script); } $("#slider__list_<?php echo $id_sfx; ?>").bxSlider(); }); })(jQuery) </script> Как удалить этот <script> после того, как он отработан, не создавая при этом новых скриптов на странице ? |
пометь скрипт ID'шником и
$('#foo').remove(); только непонятно, зачем |
Как подключать скрипты описал здесь
http://joomlaforum.ru/index.php/topi...tml#msg1240518 Тег скрипт конечно можно и удалить, только смысл в этом какой и для чего |
Цитата:
$('#foo').remove(); нужно создать еще один скрипт, который потом тоже нужно будет удалить. Удалять для того что бы страница не захламлялась скриптами. |
Цитата:
Цитата:
$doc->addScriptDeclaration($js); //вставляем код js все ок если модуль используется только в одном месте на странице, но если в двух, то содержимое $js-ов вставлялось в один и тот же скрипт выдавало ошибку |
Цитата:
вы можете инициализировать статическую переменную и в зависимости от ее состояния подключать скрипт, также вы можете проверить находится ли данный скрипт в массиве $this->_scripts ($doc->_scripts) тематика данного решения не связана с этим форумом никак |
Фу я туплю, нормально удалил по id)
Цитата:
|
Цитата:
вы пробовали, прежде чем отвергать? Цитата:
|
Цитата:
|
Я вобще как-то сомневаюсь что код скрипта отработает без ошибки. После окончания парсинга документа скрипты исполняются асинхронно, так что нельзя взять просто так и сразу после добавления скрипта вызвать из него функцию - файл попросту не успеет к этому моменту загрузиться или исполниться.
|
Цитата:
|
melky я не понимаю к чему ты клонишь. Впрочем я оказался не прав: даже во время парсинга скрипт исполнится асинхронно:
<script> var script = document.createElement('script'); script.src = 'data:application/javascript,function%09fn(){alert("ok")}'; document.head.appendChild(script); fn(); </script> <script> document.addEventListener('DOMContentLoaded', function(){ var script = document.createElement('script'); script.src = 'data:application/javascript,function%09fn(){alert("ok")}'; document.head.appendChild(script); fn(); }); </script> |
danik.js,
интересно что должны продемонстрировать примеры, когда нажмёшь кнопку посмотреть. куда смотреть чего ждать? |
Цитата:
Синхронно скрипт можно вставить через document.write() во время парсинга. |
danik.js,
:write: а так? или это не про то? <!DOCTYPE HTML> <html> <head> <title>Untitled</title> </head> <body> <script> document.addEventListener('DOMContentLoaded', function(){ var script = document.createElement('script'); script.src = 'data:application/javascript,function%09fn(){alert("ok")}'; document.head.appendChild(script); window.setTimeout('fn()', 0) //fn(); }); </script> </body> </html> |
какой смысл удаять тег если скрипт будет все равно в памяти?
можете перегрузить обернув все в фунцию, но все эти действия похожи на извращенческие, с неправильной архитектурой и порядком действий |
Цитата:
Так он и обернут в функцию <script> (function($) { $(document).ready(function() { if (!$(document).bxSlider) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "<?php echo JURI::root()?>modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js"; $("head").append(script); } $("#slider__list_<?php echo $id_sfx; ?>").bxSlider(); }); })(jQuery) </script> |
Цитата:
Всегда выносите js код в отдельные файлы, не засоряйте html разметку страницы |
Цитата:
соответсвенно из этого пхп-файла будет в любом случае на страницу вставлятся тег script |
Цитата:
и пример с <script src="/script.php" type="text/javascript"></script> также имеет право на жизнь где код script.php <?php header('Content-type: text/javascript; charset: UTF-8'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 2592000) . ' GMT'); header("Content-Encoding: gzip"); //сжатие если не работает удалить строку header('Last-Modified: '.gmdate('D, d M Y H:i:s',filemtime(__FILE__)).' GMT'); ?> //здесь уже js alert('Work'); |
Цитата:
Цитата:
Цитата:
попробуй достать до <body> из <head>, если они исполняются асинхронно. Парсер HTML приостанавливается, когда встречает <script>. Продолжает работу, когда <script> пропарсен. твой первый пример полностью подтверждает это :) <html> <head> <script> try { alert( 'document.getElementsByTagName("body").length: ' + document.getElementsByTagName("body").length ); } catch (e) { alert( 'ошибка при доступе к document.getElementsByTagName("body").length \n\n\t' + e.message ); } </script> </head> <body>Должен быть алерт</body> </html> асинхронно (не задерживая парсер HTML) скрипты загружаются, если их пометить атрибутом async (в старых IE называется defer). Но это не даёт никаких гарантий, что этот асинхронный скрипт будет работать после парсинга дерева. Cори за оффтоп. |
Цитата:
Но я вновь ошибся. Если вставлять скрипт даже синхронно, через document.write, то конечно же он исполнится только когда текущий скрипт отработает. Я просто запутался. Есть еще вариант вставки через appendChild инлайн-скрипта. Так вот он отработает незамедлительно, прям в момент вставки. Вставка через appendChild, не сработает, так как это внешний скрипт, вставленный юзером (отрабатывает всегда асинхронно). <script> var script = document.createElement('script'); script.src = 'data:application/javascript,function%09fn(){alert("ok")}'; document.head.appendChild(script); </script> <script> fn(); </script> Вставка через document.write, сработает, так как скрипт будет разобран парсером сразу же и отправлен на выполнение. <script> var script = document.createElement('script'); script.src = 'data:application/javascript,function%09fn(){alert("ok")}'; document.write('<script src=\'data:application/javascript,function%09fn(){alert("ok")}\'><\/script>'); </script> <script> fn(); </script> Сработает, чем-то похоже на eval. <script> var script = document.createElement('script'); script.innerText = 'function fn() {alert("ok")}'; document.head.appendChild(script); fn(); </script> |
Цитата:
Цитата:
|
Цитата:
$id_sfx = rand(1,100) . rand(1,100);, ну и вообще хардкод фигачить не тру. Попробовал подключить файл с заголовками - пишет ошибку как только доходит до первой php-вставки <?php header('Content-type: text/javascript; charset: UTF-8'); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 2592000) . ' GMT'); header('Last-Modified: '.gmdate('D, d M Y H:i:s',filemtime(__FILE__)).' GMT'); ?> (function($) { $(document).ready(function() { if (!$(document).bxSlider) { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "<?php echo JURI::root() ?>/modules/mod_ext_jshopping_slider_products/assets/js/jquery.bxSlider.min.js"; // тут ошибка Unexpected token ILLEGAL |
Цитата:
я не зря так написал, потому как сталкивался на разных серверах с разными настройками данная строка может быть причиной ошибки а это доки http://tools.ietf.org/html/rfc2616#section-14.3 |
Цитата:
![]() похоже что да, асинхронно. странно, почему при document.write он не отправляется на "загрузку". наверное, связано с механизом парсинга и нужно неплохо знать всё это дело, чтобы разобраться. |
Цитата:
var id_sfx = Math.random() * 10000; можно заменить |
Цитата:
<ul class="slider__list" id="slider__list_<?php echo $id_sfx; ?>"> <?php foreach($last_prod as $curr){ ?> <li> //... |
Danxil,
это генератор случайных чисел, используй себе на php свой на js cвой они генерируют разные значения и уже попахивает на г-код ибо незачем добавлять каждый раз свой ид. В модулях Joomla для разделения мух от котлет, достаточно было добавляеть ид модуля $module->id |
Цитата:
<ul class="slider__list" id="slider__list_<?php echo $id_sfx; ?>"> <?php foreach($last_prod as $curr){ ?> <li> //... $("#slider__list_<?php echo $id_sfx ?>").bxSlider(); т.е. если модуль без id и используется, например, в двух местах на странице, т.е. $(".slider__list_").bxSlider(); вызывается 2 раза, то при первом вызове слайдер создастся в двух родителях .slider__list_ и и при втором вызове слайдер снова создастся в тех же родителях, а с id каждый раз будет создаватся только в нужном элементе. Про $module->id не понял, можно поподробнее ? |
var
Цитата:
var_dump($module); |
Цитата:
var elem = $(".slider__list_"); elem .bxSlider(); если elem на странице больше одного ? Или ты имеешь введу использовать вместо $id_sfx, id модуля ? Тогда при вызове var elem = $(".slider__list_<?php echo $module->id ?>"); elem .bxSlider(); все равно нужно использовать php в js |
Может подтолкнет, как передать параметры
http://learn.javascript.ru/play/Sgpguc |
Danxil, ты мог бы подтвердить, что код из первого поста корректно отрабатывает в ситуациях когда скрипт bxSlider'а не подключен?
У меня есть сомнения. |
Цитата:
http://danxil.bget.ru/ тут на главной странице этот слайдер, до него bxSlider нигде не подключен, все работает, в консоль сейчас выводится console.log('bxSlider: ' + $(document).bxSlider);перед if-ом |
Цитата:
|
Хотя все равно костыльный способ, если будет 10 модулей, то для каждого цикл будет по 10 раз крутится, в итоге 100 итераций, и плюс нужно для каждого элемента проверять создан ли в нем уже слайдер. А так через $id_sfx я напрямую к конкретному элементу обращаюсь ...
|
Скажи, а в чем проблема статически прописать эти ид вручную создав для каждого модуля альтернативный макет
|
Цитата:
Короче сделано в стиле Query: сделано через жуткие костыли, но зато все работает именно так, как этого ждет типичный "jQuery-программист" ... (простите, назвать таких javascript-программистами не могу). |
Цитата:
В смысле создать для каждого модуля альтернативный макет, вьюху что ли? Если так то тогда нужно будет при каждом создании модуля прописывать руками ид. Если что, я до этого расширения для джумлы не делал. |
Часовой пояс GMT +3, время: 19:07. |