Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Загрузка CSS


Автор: MrDmitry 8.4.2013, 01:21
Здраствуйте. Столкнулся с такой задачей. 


Формирую html код 


Код

var objects = new Array();

var div = 'test';

$.post("Create.php", {object:div}, function(data){
          objects = data;
         },
         "json"
       );


В php файле формирую html и css(только не спрашивайте зачем smile)

Код

$div = '<div id="'.$_POST['object'].'" onclick=alert("Тест")>текст</div>';

$csscode = "border: 1px solid #000000; width:100px; height:100px; left:471px; top:500px;";
$file=fopen("style.css","a"); 
     $text="#".$_POST['object']."{ ".$csscode."} \r\n";
     fwrite($file,$text);
     fclose($file);

$array = array($div, $csscode);

echo json_encode($array);


Ну и в js пытаюсь вставить такой обьект на страницу.

Код

$('#work').append(objects[1]);


По итогу получаю что обьект вставляется на страницу, но стили из формированого css не отоброжается. (Тоесть визуально обьект на страницу не отоброжается. 

Хотя если после этого добавить такой обьект в html страницу "Ручками" 

Код

<div id="work" ><div id="test" onclick="alert('Тест')">текст</div></div>


то стили из файла style.css применяются.

Автор: Arantir 8.4.2013, 02:00
Только не говорите, что запись в style.css производится между завершением загрузки страницы и добавлением элемента #test...

Автор: MrDmitry 8.4.2013, 03:48
Не совсем понял вопроса. Что значит между завершением загрузки страницы? Да, страница уже загружена и добавление происходит по нажатию кнопочки. Теоретически я конечно догадываюсь почему не работает, но надеюсь что решение можно найти или тут мне подскажут иной путь решения задачи ))

Автор: MrDmitry 8.4.2013, 16:21
Есть у кого нибуть какие нибуть мысли? 

Автор: Arantir 8.4.2013, 17:45
Цитата(MrDmitry @  8.4.2013,  02:48 Найти цитируемый пост)
Что значит между завершением загрузки страницы?

Там еще вторая половина предложения есть после "и"... И именно это оно и значит.
Цитата(MrDmitry @  8.4.2013,  02:48 Найти цитируемый пост)
Да, страница уже загружена и добавление происходит по нажатию кнопочки

Вы с помощью PHP добавляете CSS в файл, находящийся на удаленном сервере и хотите, чтобы при этом браузер моментально изменил стиль у пользователя? Это же глупость. Но ничего другого из ваших объяснений понять не удалось.

Автор: MrDmitry 8.4.2013, 20:21
я это понимаю
Цитата

Вы с помощью PHP добавляете CSS в файл, находящийся на удаленном сервере и хотите, чтобы при этом браузер моментально изменил стиль у пользователя? 


Нууууу, именно это я и хочу, менять стиль у пользователя на лету. А какие варианты есть еще? Учитывая что сам css стиль формируется в php, передавать его в массив jq, и применять к обьеку через addClass?

Автор: Sanchezzz 8.4.2013, 22:01
:yes либо Создать 
Код

<style id="reload"></style>

и
Код

$.post("Create.php", {object:div}, function(data){
          $('#reload').html(data.css);
          $('#work').append(objects[1]);
         },
         "json"
       );

должно сработать но не проверял.

Автор: Arantir 8.4.2013, 22:28
Суть работы протокола HTTP знаете? Запрос — ответ. Изменение файла на сервере никаким образом не сказывается на уже загруженной странице. Минимум — файл будет просто перезагружен при обновлении страницы. Но, в зависимости от настроек кеша, он еще неделю может старым у пользователя оставаться.

Чтобы файл обновился, этому должен предшествовать запрос. Вы должны явным образом заставить браузер загрузить содержимое этого файла. 
Для этого можно воспользоваться способом, аналогичным добавлению/изменению картинок средствами JS. При добавлении картинки браузер автоматически ее загрузить (чтобы показать на странице, конечно же). 
Так вот, для тега link действует такой же принцип.
Код

$('head').append('<link rel="stylesheet" href="/css/style.css" type="text/css" />');
Этот код заставит браузер запросить с сервера файл /css/style.css и применить все его содержимое к стилю страницы. Точно так же, как браузер это делает при загрузке страницы, но только в любое нужное вам время. Желательно, чтобы имя файла не повторяло уже существующих подключенных стилей, иначе поведение браузера в этом случае не очень предсказуемо (вдруг не загрузит из-за того, что такой же файл уже загружен).
Второй из способов следует тому же принципу, это добавление тега style. При добавлении style через JS браузер так же попытается применить все стили внутри него, ибо это есть единственная суть сия тега.
Код

$('head').append('<style>body { background: green }</style>');
При этом сохранять стили в удаленном файле не требуется. Можно только генерировать их сервером, а применять сразу у пользователя.


Кстати, есть одна полезная особенность — любые скрипты в любом случае загружаются уже после тега head в DOM (так как они всегда либо в нем, либо ниже него). Так что для добавления нового стиля на страницу даже не обязательно ждать загрузки страницы (события load), можно вписать добавление первой же строкой первого скрипта и это будет работать. Так что, если стиль должен быть применен сразу, то эта особенность может помочь избежать эффекта блика, когда стиль резко меняется где-то между началом загрузки страницы и догрузкой DOM, css и js.

Добавлено через 2 минуты и 20 секунд
Sanchezzz, долго писал =)

Автор: Sanchezzz 8.4.2013, 22:46
Arantir, Зато развернутый ответ как статья + еще один способ о котором я не вспомнил.

Можно попробывать еще аттребут сменить у линка с гет параметром в виде времени тоже может сработать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)