Как я переключаю внешние файлы CSS? - PullRequest
5 голосов
/ 19 января 2010

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

PS: У меня есть jQuery в этом проекте, так что, если оттуда что-то встроено, даже лучше!

PPS: я понимаю, что не включил важную информацию (не стреляйте в меня!):

  1. Конечной целью этого будет создание раздела настроек пользователя, где пользователь может щелкнуть переключатель и выбрать цветовую схему, которую он хочет использовать для нашего приложения. Таким образом, в конечном итоге у нас будет что-то вроде 8 различных стилей CSS на выбор. Не уверен, что это изменит лучший метод для достижения этой цели.

  2. Пользователь входит в свою учетную запись и изменяет свои настройки там. Я хочу, чтобы их изменения «прилипали», пока они не решат снова изменить таблицу стилей. Я могу сделать это вручную в MySQL, так как у нас есть таблица, называемая таблицами стилей, с нумерацией различных пользовательских таблиц стилей ... так что в действительности мне нужно изменить это значение MySQL асинхронно, чтобы CSS сразу загружался.

Ответы [ 6 ]

16 голосов
/ 19 января 2010

Добавьте атрибут id к тегу CSS link, чтобы управлять тегом с помощью JavaScript:

<link id="cssfile" href="css/avocado.css" type="text/css" rel="stylesheet">

Javascript для установки атрибута href напоминает:

document.getElementById('cssfile').href = 'css/carrot.css';

Пользователь может настроить цвета, щелкнув ссылку:

<a href="#"
 onclick="document.getElementById('cssfile').href='css/carrot.css';">Carrots</a>

Изменение типа носителя также позволяет пользователям быстро менять макеты печати, предпочтительный макет на мобильных устройствах (или планшетах).и многое другое.

Для этого решения не требуется jQuery.

См. также: http://www.webmasterworld.com/forum91/4554.htm

4 голосов
/ 19 января 2010

Переключатель таблиц стилей в jQuery.

В ответ на комментарий 'newbie followup' я постараюсь сделать его немного более инструктивным.

Страница, на которой я играл для тестированияв то время как запись может быть найдена здесь .

Отображение страницы

Вы захотите, чтобы ваша текущая таблица стилей отображалась в теге <link> в <head>каждой из ваших страниц.Для тега <link> потребуется идентификатор для последующего использования в JavaScript.Примерно так:

<?php 
  // Somewhere in the server side code, $current_stylesheet is read from the user's 
  // "preferences" - most likely from a database / session object
  $current_stylesheet = $user->stylesheet;
?>
<link href='<?php echo $current_stylesheet ?>' rel='stylesheet' type='text/css' id='stylelink' />

Изменение предпочтения

После того, как вы отображаете таблицу стилей пользователя, вам нужен способ ее изменить.Создайте <form>, который будет отправлять запрос на сервер, когда пользователь изменяет свою таблицу стилей:

<form method="GET" id="style_form" >
  <select name="stylesheet" id="styleswitch">
    <option value="css1.css">Black &amp; White</option>
    <option value="css2.css" selected="selected">Shades of Grey</option>
   </select>
   <input value='save' type='submit' />
</form>

Сторона сервера

Теперь, без jQuery, отправка этой формы должна получить (вы могли быизмените его на POST, если хотите) stylesheet={new stylesheet} на текущей странице.Итак, где-то в вашем загрузочном / сидячем включаемом файле, вы делаете для него проверку, пример php:

$styles = array(
  'css1.css' => 'Black &amp; White',
  'css2.css' => 'Shades of Grey',
);

if (!empty($_GET["sytlesheet"]) {
  // VALIDATE IT IS A VALID STYLESHEET - VERY IMPORTANT
  // $styles is the array of styles:
  if (array_key_exists($_GET["stylesheet"], $styles)) {
    $user->stylesheet = $_GET["stylesheet"];
    $user->save();
  }
}

Live Preview

На данный момент у вас есть работающий переключатель стилей для lameлюди без JavaScript.Теперь вы можете добавить jQuery, чтобы сделать все это немного элегантнее.Вы захотите использовать jQuery Form Plugin , чтобы создать замечательную ajaxForm() функцию, которая будет обрабатывать отправку формы.Добавьте библиотеку jQuery и jQuery Form на страницу:

<script type='text/javascript' src='/js/jquery.js'></script>
<script type='text/javascript' src='/js/jquery.form.js'></script>

Теперь, когда у нас есть библиотеки -

$(function() {
  // When everything has loaded - this function will execute:


  $("#style_form").ajaxForm(function() {
    // the style form will be submitted using ajax, when it succeeds:
    // this function is called:
    $("#thediv").text('Now Using: '+$('#styleswitch').val());
  });

  $("#styleswitch").change(function() {
    // When the styleswitch option changes, switch the style's href to preview
    $("#stylelink").attr('href', $(this).val());
    // We also want to submit the form to the server (will use our ajax)
    $(this).closest('form').submit();
  });

  // now that you have made changing the select option submit the form,
  // lets get rid of the submit button
  $("#style_form input[type=submit]").remove();
});
3 голосов
/ 19 января 2010

Вот пример, который использует jQuery.

<!DOCTYPE html>
<html>
    <head>
    <link rel="stylesheet" type="text/css" href="style1.css" />
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"
            type="text/javascript"></script>
        <script type="text/javascript">
            $(function(){
                $('#change-css').click(function(e){
                    e.preventDefault();
                    $('link[rel="stylesheet"]').attr('href', 'style2.css');
                });
            });
        </script>
    </head>
    <body>
        <a id="change-css" href="#">change css</a>
    </body>
</html>

Оперативная строка - $('link[rel="stylesheet"]').attr('href', 'style2.css');.Он находит любой тег <link>, который имеет rel="stylesheet", и изменяет его атрибут href на style2.css.

1 голос
/ 29 января 2010

Вы также можете загрузить оба файла CSS и предварять все селекторы во втором файле именем класса тела.

body.secondsheet {}
body.secondsheet a {}
body.secondsheet hr {}

Тогда все, что вам нужно сделать, это добавить / удалить класс «секундную таблицу» к тегу body для переключения таблиц стилей.

1 голос
/ 19 января 2010

Это не имеет ничего общего с Ajax.Он имеет все, что связано с манипуляциями с JS и DOM (некоторые ключевые слова для поиска учебника).
Я использую Mootools, которая является библиотекой JS, и для этого есть встроенная функция.
Если делать это вручнуюэто ваше дело, тогда я бы просто добавил элемент <link> к <head> или скорректировал атрибут href существующего элемента <link>.

 <link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6063" id='bobo'>
...
...
...
<script>document.getElementById('bobo').href="http://my.doamin.com/new.css";</script>
0 голосов
/ 19 января 2010

Чтобы добавить новый CSS-файл на страницу, просто создайте новый тег <link>:

function addCss (url) {
    var s = document.createElement('link');
    s.rel = 'stylesheet';
    s.type = 'text/css';
    s.href = url;
    document.getElementsByTagName('head')[0].appendChild(s);
}

addCss('http://path/to/stylesheet.css');

Чтобы удалить файл css со страницы, просто удалите <link> на него:

function removeCss (search) {
    var css = document.getElementsByTagName('link');
    for (var i=0;i<css.length;i++) {
        var c = css[i];
        if (c.rel === 'stylesheet' || c.type === 'text/css') {
            if (c.href && c.href.match(search)) {
                c.parentNode.removeChild(c);
            }
        }
    }
}

// Remove all css that contains 'mycss_', can use regexp if necessary:
removeCss(/mycss_.*\.css/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...