我測試使用Jquery ToolsjQuery的工具阿賈克斯登錄使用ColdFusion,問題取消模態
這裏是我的測試頁的AJAX模式登錄。
<cfparam name="session.auth.isLoggedIn" default="false">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>jQuery modal logon test</title>
<!-- include the Tools -->
<script src="http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js"></script>
<!--- add styles --->
<!--- <link rel="stylesheet" type="text/css" href="css/loginbox.css" /> --->
<link rel="stylesheet" type="text/css" href="http://static.flowplayer.org/tools/css/standalone.css"/>
<style>
/* error message */
.error {
height:15px;
background-color:#FFFE36;
font-size:13px;
border:1px solid #E1E16D;
padding:4px 10px;
color:#000;
display:none;
z-index: 9999;
-moz-border-radius:4px;
-webkit-border-radius:4px;
-moz-box-shadow:0 0 6px #ddd;
-webkit-box-shadow:0 0 6px #ddd;
}
.error p {
margin:0;
}
.modal {
background-color:#fff;
display:none;
width:350px;
padding:15px;
text-align:left;
border:2px solid #333;
opacity:0.8;
-moz-border-radius:6px;
-webkit-border-radius:6px;
-moz-box-shadow: 0 0 50px #ccc;
-webkit-box-shadow: 0 0 50px #ccc;
}
.modal h2 {
background:url(/img/global/info.png) 0 50% no-repeat;
margin:0px;
padding:10px 0 10px 45px;
border-bottom:1px solid #333;
font-size:20px;
}
</style>
</head>
<body>
<p>
<div id="loginMenu">
<cfif session.auth.isLoggedIn>
<a href="logout.cfm">Log out</a>
<cfelse>
<a href class="modalInput" rel="#login">Login</a>
</cfif>
<a href class="modalInput" rel="#register">Register</a>
</div>
</p>
<!-- user input dialog -->
<cfif isDefined("session.auth.failedLogins")>
<cfset loginMsg=#session.auth.failedLogins# & " failed logins">
<cfelse>
<cfset loginMsg="Please log in">
</cfif>
<div><em/></div>
<div class="modal" id="login">
<!-- login form -->
<form name="loginForm" id="loginForm" autocomplete="off">
<div id="loginMsg"><p><cfoutput>#loginMsg#</cfoutput></p></div>
<p><input type="text" name="username" placeholder="username..." title="Must be at least 8 characters." required="required" ></p>
<p><input type="password" name="password" placeholder="password..." title="Try to make it hard to guess" required="required"></p>
<p>
<button type="submit"> Login </button>
<button type="button" class="close"> Cancel </button>
</p>
</form>
</div>
<div class="modal" id="register">
<!-- signup form-->
<form id="signupForm" autocomplete="off" method="get" action="" novalidate="novalidate">
<CFSET structDelete(session, 'form')>
<cfset session.form.validate_require="username|'Username' is a required field.;password|'Password' is a required field.;confirmpassword|'Confirm password' is a required field.;">
<fieldset>
<p>
<label>username *<br>
<input type="text" name="username" placeholder="username..." /> </label>
</p>
<p>
<label>password *<br>
<input type="password" name="password" required="required" minlength="6" placeholder="password..." /></label>
</p>
<p>
<label>confirm password *<br>
<input type="password" name="confirmpassword" data-equals="password" placeholder="password..."/></label>
</p>
<p>
<button type="submit">Sign Up</button>
<button type="button" class="close"> Cancel </button>
</p>
</fieldset>
</form>
</div>
<script>
$(document).ready(function() {
var triggers = $(".modalInput").overlay({
// some mask tweaks suitable for modal dialogs
mask: {
color: '#ebecff',
loadSpeed: 200,
opacity: 0.9
},
closeOnClick: false,
onClose: function() {
$('.error').hide();
}
});
$("#loginForm").submit(function(e) {
var form = $(this);
// submit with AJAX
$.getJSON("/yourGPpractice/cfcs/security.cfc?method=testSignup&returnformat=JSON&queryformat=column&" + form.serialize(), function(json) {
// everything is ok. (server returned true)
if (json === true) {
// close the overlay
triggers.eq(0).overlay().close();
$("#loginMenu").html("<a href='logout.cfm'>Log out</a>");
// server-side validation failed. use invalidate() to show errors
} else {
var tempString
tempString = "<p>" + json + " failed logins</p>"
$("#loginMsg").html(tempString);
}
});
// prevent default form submission logic
e.preventDefault();
});
// initialize validator and add a custom form submission logic
$("#signupForm").validator().submit(function(e) {
var form = $(this);
// client-side validation OK.
if (!e.isDefaultPrevented()) {
// submit with AJAX
$.getJSON("/yourGPpractice/cfcs/security.cfc?method=testSignup&returnformat=JSON&queryformat=column&" + form.serialize(), function(json) {
// everything is ok. (server returned true)
if (json === true) {
// close the overlay
triggers.eq(0).overlay().close();
$("#loginMenu").html("<a href='logout.cfm'>Log out</a>");
// server-side validation failed. use invalidate() to show errors
} else {
form.data("validator").invalidate(json);
}
});
// prevent default form submission logic
e.preventDefault();
}
});
$.tools.validator.fn("[minlength]", function(input, value) {
var min = input.attr("minlength");
return value.length >= min ? true : {
en: "Please provide at least " +min+ " character" + (min > 1 ? "s" : ""),
};
});
$.tools.validator.fn("[data-equals]", "Value not equal with the $1 field", function(input) {
var name = input.attr("data-equals"),
field = this.getInputs().filter("[name=" + name + "]");
return input.val() == field.val() ? true : [name];
});
});
</script>
</body>
</html>
security.cfc包含以下方法
<cffunction name="testSignup" access="remote" returnType="any" output="false">
<cfset var validationVar= structNew()>
<cfset validationVar = true>
<cfreturn validationvar>
</cffunction>
在Firebug中,我可以看到返回的是「真」和我的虛擬登錄的loginmenu格設置正確地更改爲「註銷」。但是,這發生在未被取消的模態層下。
triggers.eq(0).overlay()。close();正確關閉登錄表單的模式,但不會取消登記表單的疊加,儘管下面的行確實正確地更改了'loginmenu'div以註銷,下的模式。這是怎麼回事?
這是真氣。
// everything is ok. (server returned true)
if (json === true) {
// close the overlay
alert("about to close the overlay!");
triggers.eq(0).overlay().close();
$("#loginMenu").html("<a href='logout.cfm'>Log out</a>");
顯示警報,但triggers.eq(0).overlay()。close();不??
我試圖更換即在$(「#signupForm」)。validator()。底部提供false的函數preventDefault()。提交(函數(e)代碼塊但沒有區別我很害怕 – Saul