- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个主题更改的工作PHP,附加了一个cookie,当用户离开网站时它会记住主题颜色。但我需要将其更改为 javascript,并且仍然利用 CSS 文件。我该怎么做?
这是我的 php 文件
<html>
<head>
<?php
//GET method to retrieve the theme for the user
if (isset($_GET["theme"])) {
if ($_GET["theme"] == 'blue') {
// set theme to be blue by default unless the user has selected red or
yellow theme then change
// once user has selected theme browser will remember for 1 year
setcookie("theme", "blue", strtotime('+1 year'));
} else if ($_GET["theme"] == 'red') {
setcookie("theme", "red", strtotime('+1 year'));
} else if ($_GET["theme"] == 'yellow') {
setcookie("theme", "yellow", strtotime('+1 year'));
}
header("Location: index.php");
}
/* once user logs out. session is to rememebr the color chosen as above,
logging out to location index.php */
if (isset($_GET["logout"]) && $_GET["logout"] == 'true') {
session_destroy();
header("Location: index.php");
die;
}
// use theme cookie
if (isset($_COOKIE["theme"])) {
if ($_COOKIE["theme"] == "yellow") {
/* if yellow theme is selected use stylesheet yellow
otherwise if not select */
red style sheet
echo '<link rel="stylesheet" type="text/css" href="styles/styleyellow.css">';
} else if ($_COOKIE["theme"] == "red") {
echo '<link rel="stylesheet" type="text/css" href="styles/stylered.css">';
} else {
/* if yellow or red were not selected
then set to default blue stylesheet theme */
echo '<link rel="stylesheet" type="text/css" href="styles/styleblue.css">';
}
} else {
echo '<link rel="stylesheet" type="text/css" href="styles/styleblue.css">';
}
?>
</head>
<body>
<?php
/* once the user has logged in
this shows options for the user to change theme colors. */
if (isset($_SESSION["username"])) {
echo '<div id="theme">';
echo 'Set a Theme:<br>';
echo '<a href="index.php?theme=blue">Blue (Default)</a><br>';
echo '<a href="index.php?theme=red">Red</a><br>';
echo '<a href="index.php?theme=yellow">Yellow</a><br>';
echo '</div>';
}
?>
</body>
</html>
最佳答案
要让 JavaScript 访问 cookie,它们必须设置为 httponly=false
(默认)。请参阅PHP.net更多细节;这是基础知识:
httponly
When TRUE the cookie will be made accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript.
JS 将无法读取任何先前使用 httponly=true
设置的 cookie .
JavaScript 无法在加载前准备好页面;它只能对浏览器解析后的内容起作用。
我们需要做的第一件事是监视 readyState
document
的;我们需要它至少为 "interactive"
然后我们才能设置新内容或更改现有内容。由于我们需要添加新的 stylesheet
根据用户设置,我们必须等待浏览器理解DOM
在尝试插入之前。
接下来我们需要检索已为该站点设置的 cookie(如果有)。 document.cookie
返回以分号分隔的字符串 key=value
对。我们需要解析该字符串以查找其中之一是否是“主题”,如果是,则获取其 value
.
如果之前没有设置 cookie,并且没有查询字符串给我们 theme=<color>
,我们需要默认为“蓝色”,并附加 <link>
到document
的<head>
。我们可以使用 XMLHTTPRequest
对于资源并添加 responseText
到 <style>
元素,但在这种情况下,额外的工作不会带来任何好处。
现在我们已将样式表设置为适当的颜色,下次只需设置或更新 cookie。
此脚本处理上面 PHP 完成的大部分工作,但与登录或注销、更改位置或设置任何 HTML 无关。
只需将其添加到 <script>
<head>
中的元素您希望执行这些操作的文档,您应该可以开始了。
如有任何不明白的地方,请随时询问,或者如果有任何问题无法按预期工作,请告诉我;我很乐意跟进编辑和/或讨论以提供帮助。
( function( W, D ) {
"use strict";
const init = function() {
var cookie_string = D.cookie,
query_theme = /theme\=([a-z]+)/.exec( location.search ),
style_sheet = D.createElement( "link" ),
date = new Date,
theme;
if ( cookie_string ) {
var cookie_array = cookie_string.split( ";" ), vs;
cookie_array.forEach( function( v ) {
vs = v.trim().split( "=" );
if ( vs[ 0 ] === "theme" ) {
theme = vs[ 1 ];
}
} );
}
// prioritize: query string > cookie > default
theme = !!query_theme ? query_theme[ 1 ] : theme || "blue";
// add the stylesheet
style_sheet.href = "styles/style" + theme + ".css";
style_sheet.type = "text/css";
style_sheet.rel = "stylesheet";
D.querySelector( "head" ).appendChild( style_sheet );
// set/update the cookie
date.setDate( date.getDate() + 365 );
D.cookie = "theme=" + theme +
"; expires=" + date.toString().replace( /\+.*$/, "" );
};
if ( /^(?:interactiv|complet)e$/.test( D.readyState ) ) {
init();
} else {
W.addEventListener( "DOMContentLoaded", init, false );
}
} ( window, document ) );
localStorage
API localStorage
不会过期,因此不需要像 cookie 那样处理日期。
localStorage
仅可供浏览器访问;提供内容的服务器将无权访问这些值,除非这些值被显式传递给它。通过关注相对 .css
的请求,服务器可以隐式知道正在使用哪个主题。来自这个 PHP session 。
如果查询字符串中存在主题值,这将优先考虑主题值,如果不存在,将检查 localStorage
对于“主题”字符串,如果找不到,将使用默认字符串“blue”。
( function( W, D ) {
"use strict";
const init = function() {
var style_sheet = D.createElement( "link" ),
query_theme = /theme\=([a-z]+)/.exec( location.search ),
// prioritize: query string > localStorage > default
theme = !!query_theme ? query_theme[ 1 ] :
W.localStorage.getItem( "theme" ) || "blue";
// set the current theme in localStorage
W.localStorage.setItem( "theme", theme );
// add the stylesheet
style_sheet.href = "styles/style" + theme + ".css";
style_sheet.type = "text/css";
style_sheet.rel = "stylesheet";
D.querySelector( "head" ).appendChild( style_sheet );
};
if ( /^(?:interactiv|complet)e$/.test( D.readyState ) ) {
init();
} else {
W.addEventListener( "DOMContentLoaded", init, false );
}
} ( window, document ) );
localStorage
API有个妹妹 sessionStorage
用于临时存储 session 数据。
两者localStorage
和sessionStorage
可存储 stringyfied
JSON
因此,处理复杂数据比 cookie 容易得多。
关于javascript - 如何将 css 文件插入其中而不是声明颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44602595/
我正在阅读 java swing,但在理解它时遇到问题。 Color 是一个类吗? Color[] col= {Color.RED,Color.BLUE}; 这在java中是什么意思? 最佳答案 Is
我正在研究用 python 编写的 pacman 程序。其中一个模块是处理吃 bean 游戏的图形表示。这当然是一些主机颜色。列表如下: GHOST_COLORS = [] ## establishe
本网站:http://pamplonaenglishteacher.com 源代码在这里:https://github.com/Yorkshireman/pamplona_english_teache
我最近将我的手机更新为 Android Marshmallow 并在其上运行了我现有的应用程序,但注意到颜色行为有所不同:将更改应用到 View (可绘制)的背景时,共享相同背景的所有 View (引
所有 X11/w3c 颜色代码在 Android XML 资源文件格式中是什么样的? I know this looks a tad ridiculous as a question, but giv
试图让 ffmpeg 创建音频波形,同时能够控制图像大小、颜色和幅度。我已经尝试过这个(以及许多变体),但它只是返回无与伦比的 "。 ffmpeg -i input -filter_complex "
我很好奇你是否有一些关于 R 中颜色酿造的技巧,对于许多独特的颜色,以某种方式使图表仍然好看。 我需要大量独特的颜色(至少 24 种,可能需要更多,~50 种)用于堆叠区域图(所以不是热图,渐变色不起
我看到的许多 WPF 示例和示例似乎都有硬编码的颜色。这些指南 - http://msdn.microsoft.com/en-us/library/aa350483.aspx建议不要硬编码颜色。在构建
我想更改文件夹的默认蓝色 如何设置? 最佳答案 :hi Directory guifg=#FF0000 ctermfg=red 关于Vim NERDTree 颜色,我们在Stack Overflow上
是否有关于如何将任意字符串哈希为 RGB 颜色值的最佳实践?或者更一般地说:3 个字节。 你问:我什么时候需要这个?这对我来说并不重要,但想象一下任何 GitHub 上的那些管图 network pa
我正在尝试将默认颜色设置为自定义窗口小部件。 这是有问题的代码。 class ReusableCard extends StatelessWidget { ReusableCard({this.
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.Ta
我有一个 less 文件来定义一堆颜色/颜色。每个类名都包含相关颜色的名称,例如 .colourOrange{..} 或 .colourBorderOrange{..} 或 navLeftButtOr
我有一个RelativeLayout,我需要一个黑色背景和一个位于其中间的小图像。我使用了这段代码: 其中@drawable/bottom_box_back是: 这样我就可以将图像居中了。但背
我需要设置 浅色 的 JPanel 背景,只是为了不覆盖文本(粗体黑色)。 此刻我有这个: import java.util.Random; .... private Random random =
我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色? 我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字
我想改变我整个应用程序的颜色。 在我的 AndroidManfiest.xml 中,我有正确的代码: 在 values 文件夹中,我有 app_theme.xml: @style/MyAc
是否可以使用 android 数据绑定(bind)从 xml 中引用颜色? 这很好用: android:textColor="@{inputValue == null ? 0xFFFBC02D : 0
有没有办法在 Android 应用程序中设置“空心”颜色? 我的意思是我想要一个带有某种背景的框,而文本实际上会导致背景透明。换句话说,如果整个 View 在蓝色背景上,文本将是蓝色的,如果它是红色的
我用CGContextStrokePath画在白色背景图片中的一条直线上,描边颜色为红色,alpha为1.0画线后,为什么点不是(255, 0, 0),而是(255, 96, 96)为什么不是纯红色?
我是一名优秀的程序员,十分优秀!