Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как удалить <script> ? (https://javascript.ru/forum/misc/44604-kak-udalit-script.html)

melky 26.01.2014 14:47

Цитата:

Сообщение от danik.js (Сообщение 294130)
melky я не понимаю к чему ты клонишь.

Цитата:

Сообщение от Poznakomlus (Сообщение 294146)
какой смысл удаять тег если скрипт будет все равно в памяти?

вот это я имел в виду. Скрипт на момент "удаления" уже пропарсен движком JS с скомпилен в байт-код (неоптимизированный).


Цитата:

Сообщение от danik.js (Сообщение 294130)
Впрочем я оказался не прав: даже во время парсинга скрипт исполнится асинхронно:
<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>

что?

попробуй достать до <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ори за оффтоп.

danik.js 26.01.2014 15:15

Цитата:

Сообщение от melky
что?

Я не о том. Понятно что вставленный парсером скрипт исполняется тут же, а парсер ждет. Я о том, что внешний скрипт, вставленный во время парсинга юзером (через appendChild) будет исполнен асинхронно. Если не ошибаюсь, все внешние скрипты (то есть имеющие [src]), вставленные через appendChild, помечаются как асинхронные.

Но я вновь ошибся. Если вставлять скрипт даже синхронно, через 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>

danik.js 26.01.2014 15:21

Цитата:

Сообщение от рони
а так? или это не про то?

Нет гарантий, что сработает. Сработает только когда скрипт закэширован.Danxil, может ты прокомментируешь ситуацию со своим кодом? Он не может работать ну никак.
Цитата:

Сообщение от Poznakomlus
header("Content-Encoding: gzip"); //сжатие если не работает удалить строку

В каком смысле не работает? Мож ты думаешь что сжатие происходит путем установки заголовка?

Danxil 26.01.2014 15:26

Цитата:

Сообщение от Poznakomlus (Сообщение 294169)
что мешает прописать значения php переменных вручную
и пример с <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');

Вручную нельзя прописать потому что значение одной из переменных генерируется рандомно
$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

Vlasenko Fedor 26.01.2014 15:31

Цитата:

Сообщение от danik.js
В каком смысле не работает

не сработает если сервер будет сжимать используя другие методы сжатия
я не зря так написал, потому как сталкивался на разных серверах с разными настройками данная строка может быть причиной ошибки
а это доки http://tools.ietf.org/html/rfc2616#section-14.3

melky 26.01.2014 15:45

Цитата:

Сообщение от danik.js (Сообщение 294174)
...

итог:


похоже что да, асинхронно.
странно, почему при document.write он не отправляется на "загрузку".
наверное, связано с механизом парсинга и нужно неплохо знать всё это дело, чтобы разобраться.

Vlasenko Fedor 26.01.2014 15:45

Цитата:

Сообщение от Danxil
$id_sfx = rand(1,100) . rand(1,100);

var id_sfx = Math.random() * 10000;

можно заменить

Danxil 26.01.2014 15:51

Цитата:

Сообщение от Poznakomlus (Сообщение 294181)
var id_sfx = Math.random() * 10000;

можно заменить

Я использую эту переменную при выводе верстки, нужно именно на пхп
<ul class="slider__list" id="slider__list_<?php echo $id_sfx; ?>">
<?php foreach($last_prod as $curr){ ?>
	<li>
        //...

Vlasenko Fedor 26.01.2014 16:09

Danxil,
это генератор случайных чисел, используй себе на php свой на js cвой
они генерируют разные значения и уже попахивает на г-код ибо незачем добавлять каждый раз свой ид. В модулях Joomla для разделения мух от котлет, достаточно было добавляеть ид модуля
$module->id

Danxil 26.01.2014 16:22

Цитата:

Сообщение от Poznakomlus (Сообщение 294183)
Danxil,
это генератор случайных чисел, используй себе на php свой на js cвой
они генерируют разные значения и уже попахивает на г-код ибо незачем добавлять каждый раз свой ид. В модулях Joomla для разделения мух от котлет, достаточно было добавляеть ид модуля
$module->id

В js должен быть тот же id что и пхп, во ткак я использую этот id в js
<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 не понял, можно поподробнее ?


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