function logout(secUrl, redirUrl) {
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "\nYou must close the browser to log out.");
}
setTimeout(function () {
window.location.href = redirUrl;
}, 200);
}
I tried using the above in the following way.
?php
ob_start();
session_start();
require_once 'dbconnect.php';
// if session is not set this will redirect to login page
if( !isset($_SESSION['user']) ) {
header("Location: index.php");
exit;
}
// select loggedin users detail
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
$userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="style.css" type="text/css" />
<script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
if (bowser.msie) {
document.execCommand('ClearAuthenticationCache', 'false');
} else if (bowser.gecko) {
$.ajax({
async: false,
url: secUrl,
type: 'GET',
username: 'logout'
});
} else if (bowser.webkit) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", secUrl, true);
xmlhttp.setRequestHeader("Authorization", "Basic logout");
xmlhttp.send();
} else {
alert("Logging out automatically is unsupported for " + bowser.name
+ "\nYou must close the browser to log out.");
}
window.location.assign(redirUrl);
/*setTimeout(function () {
window.location.href = redirUrl;
}, 200);*/
}
function f1()
{
alert("f1 called");
//form validation that recalls the page showing with supplied inputs.
}
</script>
</head>
<body>
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
<li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
<li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-user"></span> Hi' <?php echo $userRow['userEmail']; ?> <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span> Sign Out</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div id="wrapper">
<div class="container">
<div class="page-header">
<h3>Coding Cage - Programming Blog</h3>
</div>
<div class="row">
<div class="col-lg-12" id="div_logout">
<h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
</div>
</div>
</div>
</div>
<script src="assets/jquery-1.11.3-jquery.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
</body>
</html>
<?php ob_end_flush(); ?>
But it only redirects you to new location. No logout.
Если вам нужно другое поведение, когда вы имеете дело со значением типа, вам, очевидно, потребуется выполнить какой-то тест. Вам не нужна явная проверка для значений значений в коробке , так как все типы значений будут помещены в бокс ** из-за параметра, который вводится как object
.
Это код должен соответствовать вашим заявленным критериям: Если value
является типом (в штучной упаковке), то вызовите полиморфный метод Equals
, в противном случае используйте ==
для проверки ссылочного равенства.
public void SetValue(TEnum property, object value)
{
bool equal = ((value != null) && value.GetType().IsValueType)
? value.Equals(_properties[property])
: (value == _properties[property]);
if (!equal)
{
// Only come here when the new value is different.
}
}
( ** И, да, я знаю, что Nullable<T>
является ценностным типом со своими собственными специальными правилами, касающимися бокса и распаковки, но здесь это почти не имеет значения.)
Я полагаю
Я хотел бы сохранить простое сравнение ссылок, если значение не помещено в поле.
blockquote>несколько эквивалентен
Если значение помечено в квадрат, я сделаю «простое сравнение ссылок».
blockquote>Это означает, что первое, что вам нужно сделать, это проверьте, включено ли значение или нет.
Если существует метод проверки того, является ли объект типом вложенного типа или нет, он должен быть, по меньшей мере, таким же сложным, как этот метод «overkill», который вы предоставили если это не самый простой способ. Тем не менее, должен быть «самый простой способ» определить, является ли объект типом с коротким значением или нет. Маловероятно, что этот «самый простой способ» проще, чем просто использовать метод Equals (), но я задал этот вопрос, чтобы узнать на всякий случай.
(не уверен, был ли я логичен)
Как насчет этого:
if(object.ReferenceEquals(first, second)) { return; }
if(first.Equals(second)) { return; }
// they must differ, right?
Обновить
Я понял, что это не работает как ожидалось для определенного случая:
Equals
, который ведет себя как ожидалось. ReferenceEquals
возвращает true, мы считаем их «одинаковыми», как ожидалось. ReferenceEquals
возвращает false и Equals
возвращает false, мы считаем их «разными», как ожидалось. ReferenceEquals
возвращает false и Equals
возвращает true, мы считаем их «одинаковыми», хотя мы хотим «разные» Итак, урок «не получается умным»
if
всегда будет давать false, поэтому он не решит проблему OP.
– Simone
1 June 2011 в 18:34
Равен (), как правило, является предпочтительным подходом.
. По умолчанию реализация .Equals () выполняет простое сравнительное сравнение для ссылочных типов, поэтому в большинстве случаев это то, что вы получите. Equals () может быть переопределен, чтобы обеспечить другое поведение, но если кто-то переопределил .Equals () в классе, это потому, что они хотят изменить семантику равенства для этого типа, и лучше, если это произойдет, есть веская причина не делать этого. Обход его с помощью == может привести к путанице, когда ваш класс видит две вещи как разные, когда каждый другой класс соглашается, что они одинаковы.
Equals
можно было бы переопределить. Хотя два объекта равны, это не означает, что новый объект (с другой ссылкой) не задан.
– Steven Jeuris
1 June 2011 в 19:03
Поскольку тип входного параметра равен object
, вы всегда получите значение в коробке внутри контекста метода.
Я думаю, что ваш единственный шанс - изменить подпись метода и написать разные перегрузки.