十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
右键审查元素,查看对应字体采用了什么样式,然后在重定义对应的样式即可
创新互联从2013年创立,是专业互联网技术服务公司,拥有项目网站设计制作、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元屏山做网站,已为上家服务,为屏山各地企业和个人服务,联系电话:13518219792
是不是img标记被转义了
一般模板应该有配置项,可以让其对html标记不进行转义吧
由于项目用的是SSH框架,又用到了Freemarker模板页面,数据库是Mysql5.0,主要内容如下所示:
1. 注册页面,用Freemarker所写,这里使用了JQuery的一个表单验证框架formvalidator:
对前台注册页面register.ftl进行表单验证,当符合基本验证规则后,再通过JQuery formvalidator Ajax将数据传到action中。
register.ftl:
html
head
meta http-equiv=Content-Type content=text/html; charset=utf-8 /
title会员注册/title
link href=${base}/forum/css/pass.css rel=stylesheet type=text/css
link href=${base}/css/validator.css rel=stylesheet type=text/css/
script type=text/javascript src=@s.url value='/js/showError.js'//script
script type=text/javascript src=@s.url value='/js/jquery-1.3.2.min.js'//script
script type=text/javascript src=${base}/js/formValidator.js charset=UTF-8/script
script type=text/javascript src=${base}/js/formValidatorRegex.js charset=UTF-8/script
!—下面的JS代码是,实时验证用户名或注册邮箱是否存在 --
script type=text/javascript
$(document).ready(function(){
$.formValidator.initConfig({formid:form1,onerror:function(msg){},onsuccess:function(){return true;}});
$(#username)
.formValidator({onshow:请输入用户名,onfocus:请您记住填写的用户名,以后登录时需要用到!,oncorrect:该用户名可以注 册})
.inputValidator({min:4,max:15,onerror:用户名长度不能小于4个字符})
.ajaxValidator({
type : get,
datatype: json,
data: username:+$(#username).val(),
url : ${base}/user/ajax/userCheck!checkUser.action,
success : function(data){if(data.userExist){return false;}else{return true;}},
buttons: $(#button),
error: function(){alert(服务器没有返回数据,可能服务器忙,请重试);},
onerror : 该用户名已经存在,请更换用户名,
onwait : 正在对用户名进行合法性校验,请稍候…
});
$(#email)
.formValidator({onshow:请输入邮箱,onfocus:邮箱6-100个字符,请正确输入,oncorrect:恭喜你,邮箱可以注册,forcevalid:true})
.inputValidator({min:6,max:100,onerror:你输入的邮箱长度非法,请确认})
.regexValidator({regexp:^([\\w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([\\w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$,onerror:你输入的邮箱格式不正确})
.ajaxValidator({
type : get,
datatype: json,
data: email:+$(#email).val(),
url : ${base}/user/ajax/userCheck!checkUser.action,
success : function(data){if(data.emailExist){return false;}else{return true;}},
buttons: $(#button),
error: function(){alert(服务器没有返回数据,可能服务器忙,请重试);},
onerror : 该邮箱已经存在,请更换邮箱,
onwait : 正在对邮箱进行校验,请稍候…
});
});
/script
/head
body
div id=passmain
div class=passbottom
div class=pbleftb
h3 style=text-align:center;新用户注册/h3
p class=p2t带*号的项目为必选项, 请全部填写/p
ul class=p2ul
@s.form action=register method=POST theme=simple id=form1 name=form1
@s.token name=token/
li class=p2li
div class=p2left用户登录昵称span style=color:#FF0000;* /span/div
div class=p2right@s.textfield name=user.username id=username class=item_input size=30 maxlenght=20 required=true onblur=checkUser(); /
/div
div class=p2centerdiv id=usernameTip/
/div
/libr
li class=p2li
div class=p2left性别span style=color:#FF0000;* /span/div
div class=p2right@s.radio
name=user.gender
list={action.getText('user.gender.male'):action.getText(user.gender.male),action.getText('user.gender.female'):action.getText(user.gender.female)}
size=30//div
/libr
li class=p1t注意:邮箱必须是可以收到程序员之家激活码的。/li
li class=p1t用户注册后,需要激活,才可以使用!激活码只会发到您注册邮箱中。/li
li class=p2li
div class=p2leftEmail地址span style=color:#FF0000;* /span/div
div class=p2right@s.textfield name=user.email id=email class=item_input size=30 onblur=checkEmali(); required=true/
/div
div class=p2centerdiv id=emailTip/div/div
/libr
li class=p1t5-20位字母、数字或字符组合,首字母必须为字母。/li
li class=p1t为了您的帐户安全,强烈建议您的密码使用字符+数字+特殊字符方式,并且密码长度大于8位。/li
li class=p2li
div class=p2left密码span style=color:#FF0000;* /span/div
div class=p2right
@s.password name=user.password id=userPassword class=item_input size=30 maxlength=16 onblur=checkPassword(); required=true/
/div
div class=p2centerdiv id=divHintPassword style=display:none;/div
/div
/libr
li class=p2li
div class=p2left重复输入密码span style=color:#FF0000;* /span/div
div class=p2right@s.password name=verifyPassword id=verifyPassword class=item_input size=30 maxlength=16 onblur=validatePassword(); required=true//div
div class=p2center
div id=divHintverifyPassword style=display:none;/div
/div
/libr
br
li class=p2li
div class=p2left输入校验码span style=color:#FF0000;*/span /div
div class=p2right@s.textfield name=validationCode class=item_input size=10 required=true/
/div
/li
li class=p2li
div class=p2left校验码span style=color:#FF0000;*/span /div
div class=p2rightimg src=@s.url value='/vcode.jpg'/ align='absmiddle' border='0'//div
/li
li class=p1tinput name=提交 type=submit value=注册用户 /
/li
/ul
/div
/@s.form
/div
/div
/body
/html
2.后台Action类,UserAjaxAction.java:
基于Hibernate与数据库进行交互验证用户名和邮箱是否存在,同时返回的数据格式为JSon类型的。
package com.qiuyanluocheng.action;
import IO.IOException;
import com.googlecode.jsonplugin.annotations.JSON;
/**
*
* @author qiuyanluocheng
*
*/
public class UserAjaxAction extends BaseAction
{
/**
* BaseAction是自己封装的
*/
private static final long serialVersionUID = 1L;
private String username;// 用户名
private String email;// 邮箱
private boolean userExist;
private boolean emailExist;
// 表示返回的Json数据中不含此属性
@JSON(serialize=false)
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public boolean isUserExist()
{
return userExist;
}
public void setUserExist(boolean userExist)
{
this.userExist = userExist;
}
public boolean isEmailExist()
{
return emailExist;
}
public void setEmailExist(boolean emailExist)
{
this.emailExist = emailExist;
}
// 检查用户是否存在
public String checkUser() throws IOException
{
if(username != null){
if(this.getUserService().isUsernameExist(username)){
// System.out.println(用户存在!!!!!+username);
userExist = true;
}else{
// System.out.println(用户不存在!!!!!+username);
userExist = false;
}
}
if(email != null){
if(this.getUserService().isEmailExist(email)){
// System.out.println(邮箱存在!!!!!+email);
emailExist = true;
}else{
// System.out.println(邮箱不存在!!!!!+email);
emailExist = false;
}
}
return ajax;
}
}
注意需要导入jsonplugin-0.34.jar包。
3. 配置文件struts.xml:
配置action,并且注意package要继承json-default包,且结果集类型为json。
?xml version=1.0 encoding=utf-8?
!DOCTYPE struts PUBLIC -//Apache Software Foundation//DTD Struts Configuration 2.0//EN dtds/struts-2.0.dtd
struts
package name=userAjax extends=json-default namespace=/user/ajax
action name=userCheck class=com.qiuyanluocheng.action.UserAjaxAction
!—返回结果类型必须为json --
result name=ajax type=json/result
/action
/package
/struts
jQuery框架中增加对输入框的验证,在设计页面表单时,常常因为需要写大量的验证信息,还要写复杂的正则表达式,现在这样一个验证框架可以解决这样的繁杂问题。这样jquery.validate.js就诞生了,jquery.validate.js是jquery旗下的一个验证框架,借助jquery的优势,我们可以迅速验证一些常见的输入,并且可以自己扩充自己的验证方法,并且对国际化也有很好的支持 。
validate自带的默认验证
required: 必选字段,
remote: 请修正该字段,
email: 请输入正确格式的电子邮件,
url: 请输入合法的网址,
date: 请输入合法的日期,
dateISO: 请输入合法的日期 (ISO).,
number: 请输入合法的数字,
digits: 只能输入整数,
creditcard: 请输入合法的信用卡号,
equalTo: 请再次输入相同的值,
accept: 请输入拥有合法后缀名的字符串,
maxlength: jQuery.format(请输入一个长度最多是 {0} 的字符串),
minlength: jQuery.format(请输入一个长度最少是 {0} 的字符串),
rangelength: jQuery.format(请输入一个长度介于 {0} 和 {1} 之间的字符串),
range: jQuery.format(请输入一个介于 {0} 和 {1} 之间的值),
max: jQuery.format(请输入一个最大为 {0} 的值),
min: jQuery.format(请输入一个最小为 {0} 的值)
不知道你的validator里面怎么写的哦,执行顺序是怎么样的。
可以尝试在后面改变temp.ftl中出现的效果。比如
success:function(label,element){
$(element).next().hide();
alert("aaaaaa");
}
你不需要保证,浏览器可以告诉你。
打开Chrome浏览器,F12唤出开发人员工具(这个比IE里的开发人员工具强百倍),点到Network下,确认一下有没有爆红的css请求吧。(然后再给我反馈,进行下一步推断~)
在本文中,Jake Rocheleau将为我们展示如何用jQuery来创建一个基于移动设备的Web App。在开发过程中,我们将使用CSS3的媒体查询功能来找出当前移动设备屏幕的的最大分辨率,根据不同的分辨率使用不同CSS。此外,Media Queries还可以帮助我们在小屏幕上隐藏导航菜单以展示更多的内容。我们还会使用jQuery来帮助我们使用Ajax.Load(),以便激活菜单栏和加载外部页面内容。
LIVE DEMO
SOURCE CODE
1. 定义页面布局
首先,我们先要查看HTML页面,并且使用CSS样式来确定页面的样式。在开头我会跳过许多不常见的Meta标签(对所创建的Web App没有直接的影响)。但是我们仍然要注意一些代码片段(在下面我已经列举出来)。
meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"
meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"
meta name="apple-mobile-web-app-capable" content="yes"
meta name="apple-mobile-web-app-status-bar-style" content="black"
X-UA-Compatible是用来描述文件在某些浏览器上的渲染程度。不得不说, 在HTML5编程过程中这是一个非常有趣的事情。所以我不用太担心这个问题。但重要的是,如果我们恰当地使用Meta标签,它会给我们许多意想不到的帮助。例如加入关键字会被大型搜索网站自动搜集,可以设定页面格式及刷新和让网页自动适应移动浏览器大小等。
内容主体
在BODY中,我通过ID#w创建了一个Wrapper Div。在其中我将页面布局分成了#pagebody和#navmenu两个部分。整个页面的宽度为640px,所以#pagebody和#navmenu的宽度可以精确地计算。
我给导航菜单赋了一个较低的z-index值来保证#pagebody总能在最顶部面显示。
div id="pagebody"
header id="toolbarnav"
a rel="external" href="#navmenu" id="menu-btn"/a
h1HK Mobile/h1
/header
section id="content" class="clearfix"
h2Welcome to the Mobile Site!/h2
/section
/div
div id="navmenu"
header
h1Menu Links/h1
/header
ul
lia rel="external" href="#homepage.html" class="navlink"Home/a/li
lia rel="external" href="#about.html" class="navlink"About Us/a/li
lia rel="external" href="#advertise.html" class="navlink"Advertise/a/li
lia rel="external" href="#write.html" class="navlink"Write for Us/a/li
lia rel="external" href="#contacts.html" class="navlink"Contacts/a/li
lia rel="external" href="#privacy.html" class="navlink"Privacy Policy/a/li
/ul
/div
我在每个.html页面前都添加了井字符(#)。每当点击一个链接时,URL栏都会出现和下推主体内容。当引用的ID没有被重载时,我们只能通过JavaScript来重新调用它。
2. CSS定位
我们CSS代码中并没有太多复杂的内容。大多数的定位工作都是通过手动完成的,完成之后才会交由jQuery来操作。同样,这里也有一些我们要注意的代码片段。
/** @group core body **/
#w #pagebody {
position: relative;
left: 0;
max-width: 640px;
min-width: 320px;
z-index: 99999;
}
#w #navmenu {
background: #475566;
height: 100%;
display: block;
position: fixed;
width: 300px;
left: 0px;
top: 0px;
z-index: 0;
}
上面的这段代码分别定义了页面中两个部分的样式。导航菜单的宽度为300px,这样一来,就为我们浏览页面内容留下了一点空间,打开和关闭菜单按钮也固定在左侧。这里最重要的部分就是导航菜单的z-index的属性值和位置(z-index: 0;position: fixed)。
我们顶部栏标题也是一个有趣的部分。它被放置在一个固定的位置,会随着页面内容的滚动而滚动,大多数的iOS App上都有这个效果。
/** @group header **/
#w #pagebody header#toolbarnav {
display: block;
position: fixed;
left: 0px;
top: 0px;
z-index: 9999;
background: #0b1851 url('img/tabbar-solid-bg.png') top left no-repeat;
border-radius: 5px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
-o-border-radius: 5px;
border-bottom-right-radius: 0;
-moz-border-radius-bottomright: 0;
-webkit-border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
-moz-border-radius-bottomleft: 0;
-webkit-border-bottom-left-radius: 0;
height: 44px;
width: 100%;
max-width: 640px;
}
#w #pagebody header#toolbarnav h1 {
text-align: center;
padding-top: 10px;
padding-right: 40px;
color: #e6e8f2;
font-weight: bold;
font-size: 2.1em;
text-shadow: 1px 1px 0px #313131;
}
移动规则
很容易注意到,在背景上我使用了蓝色的横条作为标题栏。这个标题栏的大小为640x44px,从而能够与页面的布局保持吻合。不仅如此,我还为iPhone/iPad视网膜显示屏设计了一张@2x图片。大家可以从上图看到这些图片,或者从SOURCE CODE中获取。
{System}/demo/img/tabbar-solid-bg@2x.png
{System}/demo/img/tabbar-solid-bg@2x.png
/** retina display **/
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min--moz-device-pixel-ratio: 1.5),
only screen and (min-device-pixel-ratio: 1.5) {
#w #pagebody header {
background: #0b1851 url('img/tabbar-solid-bg@2x.png') top left no-repeat;
background-size: 640px 44px;
}
#w #pagebody header #menu-btn {
background: url('img/nav-btn@2x.png') no-repeat;
background-size: 53px 30px;
}
}
菜单箭头的设计
在导航菜单方面,我为每个菜单链接的右侧设计了一个指向右方的箭头图标。相信大多数CSS3的爱好者都会喜欢这么做,这确实是一个不错的创意。
我使用transform变量在导航内容后面创建一个小边框,所以我们可以在左边的框架内任意的移动,除此之外,在悬停状态下我们可以很方便地改变边框的颜色和样式。更令人惊叹的是,你只需要使用基本的HTML5和CSS3样式就可以完成这些边框地设计。
但首先,我们要进入JavaScript编码世界。
#w #navmenu ul li a::after {
content: '';
display: block;
width: 6px;
height: 6px;
border-right: 3px solid #d0d0d8;
border-top: 3px solid #d0d0d8;
position: absolute;
right: 30px;
top: 45%;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
#w #navmenu ul li a:hover::after { border-color: #cad0e6; }
3. jQuery动画设计
在编写这些自定义代码过程中,我新建了一个script.js文件。大家可以根据自己的需要来直接编写script 标签,也可以从SOURCR CODE中直接下载我的模板。
$(document).ready(function(){
var pagebody = $("#pagebody");
var themenu = $("#navmenu");
var topbar = $("#toolbarnav");
var content = $("#content");
var viewport = {
width : $(window).width(),
height : $(window).height()
};
// retrieve variables as
// viewport.width / viewport.height
在开始之前,我设置一些页面变量,如此一来,我们就可以更为方便地引用文档中的变量。我从没用过视口值,但是如果你想调整动画阶段,设置视口值可以帮你一个大忙。例如:通过视口值,你可以检查当前浏览器的宽度,并能够的对你的菜单栏进行相应地缩放。
function openme() {
$(function () {
topbar.animate({
left: "290px"
}, { duration: 300, queue: false });
pagebody.animate({
left: "290px"
}, { duration: 300, queue: false });
});
}
function closeme() {
var closeme = $(function() {
topbar.animate({
left: "0px"
}, { duration: 180, queue: false });
pagebody.animate({
left: "0px"
}, { duration: 180, queue: false });
});
}
接下来,我为打开和关闭菜单定义了两个重要的函数。除非我们确实需要两种截然不同的动画元素,否则我们可以在一个单一的函数和回调切换中完成此项设计,但不幸的是, jQuery并不能帮助我们解决这个问题,所以我们需要求助于其它的替代语法。
这两个函数我暂且命名为topbar和pagebody。内容区域的白色背景就是pagebody;我们把标题栏放置在页面的顶部。这就意味着每当我们点击打开或者关闭按钮时,我们需要把topbar和pagebody向左和向右平移290px。
4. 加载动态内容
理论上,上述代码基本上就能满足大部分人创建一个简单移动的需求,但是,在这里我还想添加一些另外的东西。
每当用户点击一个菜单链接,页面会自动关闭当前的导航栏目和显示一个加载的GIF图像。当页面内容加载完成时,页面会去除GIF图片,并且显示已加载好的内容。通过使用static .htm,我们可以很轻松的完成这项工作,从而避免了PHP、Ruby、Perl或者任何后端语言所带来的困扰。
点击设置
首先,我们需要测试导航按钮。当用户点击导航按钮,页面会停止href的正常加载,此时,我们可以利用函数来显示外部内容。
// loading page content for navigation
$("a.navlink").live("click", function(e){
e.preventDefault();
var linkurl = $(this).attr("href");
var linkhtmlurl = linkurl.substring(1, linkurl.length);
var imgloader = 'center style="margin-top: 30px;"img src="img/preloader.gif" alt="loading..." //center';
通过上段代码,每当用户点击导航菜单链接时,我们会停止当前页面加载并且设置一个完整的URL变量。此外,我还创建一个包含标准图像Loader的HTML变量。如果你想定制自己的图像加载方式,Ajaxload会是一个很不错的助力。
Ajax.Load()
要实现这个功能我们需要两段不同的代码,下面这段代码不仅能帮助我们关闭导航菜单和滑动文档窗口,而且还能帮助我们使用一个较小的加载动画来替代当前页面内的主体内容。
closeme();
$(function() {
topbar.css("top", "0px");
window.scrollTo(0, 1);
});
当外部页面的内容加载完成时,我们要用外部的加载页面来取代页面上的加载动画。通常情况下,这将只需要几百毫秒甚至更快,所以我设置了超时功能。
content.html(imgloader);
setTimeout(function() { content.load(linkhtmlurl, function() { /* no callback */.}) }, 1200);