26.01.2014, 14:47
|
sinistral
|
|
Регистрация: 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.
|
|
26.01.2014, 15:15
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Я не о том. Понятно что вставленный парсером скрипт исполняется тут же, а парсер ждет. Я о том, что внешний скрипт, вставленный во время парсинга юзером (через 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>
__________________
В личку только с интересными предложениями
|
|
26.01.2014, 15:21
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от рони
|
а так? или это не про то?
|
Нет гарантий, что сработает. Сработает только когда скрипт закэширован. Danxil, может ты прокомментируешь ситуацию со своим кодом? Он не может работать ну никак.
Сообщение от Poznakomlus
|
header("Content-Encoding: gzip"); //сжатие если не работает удалить строку
|
В каком смысле не работает? Мож ты думаешь что сжатие происходит путем установки заголовка?
__________________
В личку только с интересными предложениями
|
|
26.01.2014, 15:26
|
Аспирант
|
|
Регистрация: 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
|
|
26.01.2014, 15:31
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Сообщение от danik.js
|
В каком смысле не работает
|
не сработает если сервер будет сжимать используя другие методы сжатия
я не зря так написал, потому как сталкивался на разных серверах с разными настройками данная строка может быть причиной ошибки
а это доки http://tools.ietf.org/html/rfc2616#section-14.3
Последний раз редактировалось Vlasenko Fedor, 26.01.2014 в 15:55.
|
|
26.01.2014, 15:45
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от danik.js
|
...
|
итог:
похоже что да, асинхронно.
странно, почему при document.write он не отправляется на "загрузку".
наверное, связано с механизом парсинга и нужно неплохо знать всё это дело, чтобы разобраться.
|
|
26.01.2014, 15:45
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Сообщение от Danxil
|
$id_sfx = rand(1,100) . rand(1,100);
|
var id_sfx = Math.random() * 10000;
можно заменить
|
|
26.01.2014, 15:51
|
Аспирант
|
|
Регистрация: 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>
//...
|
|
26.01.2014, 16:09
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Danxil,
это генератор случайных чисел, используй себе на php свой на js cвой
они генерируют разные значения и уже попахивает на г-код ибо незачем добавлять каждый раз свой ид. В модулях Joomla для разделения мух от котлет, достаточно было добавляеть ид модуля
$module->id
|
|
26.01.2014, 16:22
|
Аспирант
|
|
Регистрация: 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.
|
|
|
|