Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 26.01.2014, 14:47
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от danik.js Посмотреть сообщение
melky я не понимаю к чему ты клонишь.
Сообщение от Poznakomlus Посмотреть сообщение
какой смысл удаять тег если скрипт будет все равно в памяти?
вот это я имел в виду. Скрипт на момент "удаления" уже пропарсен движком JS с скомпилен в байт-код (неоптимизированный).


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

Последний раз редактировалось melky, 26.01.2014 в 14:51.
Ответить с цитированием
  #22 (permalink)  
Старый 26.01.2014, 15:15
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 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>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #23 (permalink)  
Старый 26.01.2014, 15:21
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от рони
а так? или это не про то?
Нет гарантий, что сработает. Сработает только когда скрипт закэширован.Danxil, может ты прокомментируешь ситуацию со своим кодом? Он не может работать ну никак.
Сообщение от Poznakomlus
header("Content-Encoding: gzip"); //сжатие если не работает удалить строку
В каком смысле не работает? Мож ты думаешь что сжатие происходит путем установки заголовка?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #24 (permalink)  
Старый 26.01.2014, 15:26
Аспирант
Отправить личное сообщение для Danxil Посмотреть профиль Найти все сообщения от Danxil
 
Регистрация: 08.11.2013
Сообщений: 37

Сообщение от Poznakomlus Посмотреть сообщение
что мешает прописать значения 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
Ответить с цитированием
  #25 (permalink)  
Старый 26.01.2014, 15:31
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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

Последний раз редактировалось Vlasenko Fedor, 26.01.2014 в 15:55.
Ответить с цитированием
  #26 (permalink)  
Старый 26.01.2014, 15:45
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от danik.js Посмотреть сообщение
...
итог:


похоже что да, асинхронно.
странно, почему при document.write он не отправляется на "загрузку".
наверное, связано с механизом парсинга и нужно неплохо знать всё это дело, чтобы разобраться.
Ответить с цитированием
  #27 (permalink)  
Старый 26.01.2014, 15:45
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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

можно заменить
Ответить с цитированием
  #28 (permalink)  
Старый 26.01.2014, 15:51
Аспирант
Отправить личное сообщение для Danxil Посмотреть профиль Найти все сообщения от Danxil
 
Регистрация: 08.11.2013
Сообщений: 37

Сообщение от Poznakomlus Посмотреть сообщение
var id_sfx = Math.random() * 10000;

можно заменить
Я использую эту переменную при выводе верстки, нужно именно на пхп
<ul class="slider__list" id="slider__list_<?php echo $id_sfx; ?>">
<?php foreach($last_prod as $curr){ ?>
	<li>
        //...
Ответить с цитированием
  #29 (permalink)  
Старый 26.01.2014, 16:09
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Danxil,
это генератор случайных чисел, используй себе на php свой на js cвой
они генерируют разные значения и уже попахивает на г-код ибо незачем добавлять каждый раз свой ид. В модулях Joomla для разделения мух от котлет, достаточно было добавляеть ид модуля
$module->id
Ответить с цитированием
  #30 (permalink)  
Старый 26.01.2014, 16:22
Аспирант
Отправить личное сообщение для Danxil Посмотреть профиль Найти все сообщения от Danxil
 
Регистрация: 08.11.2013
Сообщений: 37

Сообщение от Poznakomlus Посмотреть сообщение
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 не понял, можно поподробнее ?

Последний раз редактировалось Danxil, 26.01.2014 в 16:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить коммит github Maxmaxmaximus6 Оффтопик 59 01.01.2014 19:42
Освобождение памяти или как удалить this? Greck Общие вопросы Javascript 16 14.12.2011 11:29
Как удалить из набора элементы у которых дисплей нан KamalovRadik jQuery 3 30.10.2011 16:11
Как удалить таблицу созданную в JS? konstantinopol Общие вопросы Javascript 9 10.09.2011 10:55
как найти и удалить массив из массива? FRIE Общие вопросы Javascript 8 14.03.2011 15:48