私はphpでオンラインクイズアプリをやっています。ユーザーが試験に戻るのを制限したい。次のスクリプトを試しましたが、タイマーが停止します。私は何をすべきか?
私はソースコードを含めました。タイマーはcdtimer.jsに格納されています
<script type="text/javascript">
window.history.forward();
function noBack()
{
window.history.forward();
}
</script>
<body onLoad="noBack();" onpageshow="if (event.persisted) noBack();" onUnload="">
私はmysqlの値から試験に時間を要する試験タイマーを持っています。タイマーはそれに応じて起動しますが、戻るボタンを無効にするためにコードを入力すると停止します。私の問題は何ですか?
戻るボタンを無効にしても実際には機能しない理由は数多くあります。あなたの最善の策は、ユーザーに警告することです:
window.onbeforeunload = function() { return "Your work will be lost."; };
このページには、could戻るボタンを無効にしようとするいくつかの方法がリストされていますが、いずれも保証されていません:
通常、Webブラウザのデフォルトの動作を無効にすることは悪い考えです。 クライアントサイドスクリプトは、セキュリティ上の理由からこれを実行するのに十分な特権を持っていません。
同様の質問もいくつかあります。
あなた - できない 実際にブラウザの戻るボタンを無効にする。ただし、無効になっているような印象を与えるような、ユーザーが逆方向に移動するのを防ぐためにロジックを使用して魔法をかけることができます。方法は次のとおりです。次のスニペットをチェックしてください。
(function (global) {
if(typeof (global) === "undefined") {
throw new Error("window is undefined");
}
var _hash = "!";
var noBackPlease = function () {
global.location.href += "#";
// making sure we have the fruit available for juice (^__^)
global.setTimeout(function () {
global.location.href += "!";
}, 50);
};
global.onhashchange = function () {
if (global.location.hash !== _hash) {
global.location.hash = _hash;
}
};
global.onload = function () {
noBackPlease();
// disables backspace on page except on input fields and textarea..
document.body.onkeydown = function (e) {
var Elm = e.target.nodeName.toLowerCase();
if (e.which === 8 && (Elm !== 'input' && Elm !== 'textarea')) {
e.preventDefault();
}
// stopping event bubbling up the DOM tree..
e.stopPropagation();
};
}
})(window);
これは純粋なJavaScriptですので、ほとんどのブラウザで動作します。backspacekeyも無効になりますが、keyはinput
フィールドとtextarea
の中では正常に機能します。
このスニペットを別のスクリプトに入れて、この動作が必要なページに含めます。現在の設定では、このコードの理想的なエントリポイントであるDOMのonload
イベントを実行します。
次のブラウザでテストおよび検証済み
<script>
window.location.hash="no-back-button";
window.location.hash="Again-No-back-button";//again because google chrome don't insert first hash into history
window.onhashchange=function(){window.location.hash="no-back-button";}
</script>
私はこれに遭遇し、さまざまなブラウザ上で正しくそして「うまく」機能するソリューションを必要としていました Mobile Safariを含む (投稿時のiOS9)。解決策のどれも全く正しいものではありませんでした。私は以下を提供します(IE11、FireFox、Chrome、Safariでテスト済み):
history.pushState(null, document.title, location.href);
window.addEventListener('popstate', function (event)
{
history.pushState(null, document.title, location.href);
});
次の点に注意してください。
history.forward()
(私の古い解決策)はMobile Safariでは動きません---それは何もしないようです(すなわちユーザーはまだ戻ることができます)。 history.pushState()
はそれらすべてに働きます。history.pushState()
の3番目の引数は rl です。 'no-back-button'
や'pagename'
のような文字列を渡すソリューションは、ページ上でRefresh/Reloadを試みるまではうまくいくようです。ブラウザがそれを含むページを見つけるときに "Page not found"エラーが発生しますURL (ブラウザでも、ページ上のアドレスバーにその文字列が含まれている可能性があります。これは見苦しいです。)location.href
はUrlに使用する必要があります。history.pushState()
の2番目の引数は タイトル です。ウェブを見てみると、ほとんどの場所でそれは「使われていない」と言われており、ここでのすべての解決策はそのためにnull
を渡しています。ただし、少なくともMobile Safariでは、そのページのURLがユーザーがアクセスできる履歴ドロップダウンに表示されます。しかし、それが通常のページ訪問のためのエントリーを追加するとき、それは title を入れることが好ましい、それは好ましい。そのためにdocument.title
を渡しても同じ動作になります。このコードは、HTML 5履歴APIをサポートする最近のブラウザの戻るボタンを無効にします。通常の状況では、戻るボタンを押すと前のページに戻ります。 history.pushState()を使用すると、現在のページにサブステップを追加することになります。そのやり方は、history.pushState()を3回使ってから戻るボタンを押し始めると、最初の3回はこれらのサブステップで戻り、次に4回目に戻るというものです。前のページ.
この振る舞いをpopstate
イベントのイベントリスナと組み合わせると、基本的には無限大の下位状態のループを設定できます。ですから、あなたはページをロードし、サブ状態をプッシュし、次に戻るボタンを押します。これはサブ状態をポップし、また別のものをプッシュします。したがって、もう一度バックボタンを押すとサブ状態がなくなることはありません。 。戻るボタンを無効にする必要があると思われる場合は、このボタンをクリックしてください。
history.pushState(null, null, 'no-back-button');
window.addEventListener('popstate', function(event) {
history.pushState(null, null, 'no-back-button');
});
これは私がそれを達成することができた方法です。 window.locationを奇妙に変更しても、クロムとサファリでうまくいきませんでした。 location.hashがクロムとサファリの履歴にエントリを作成しないことが起こります。だからあなたはpushstateを使わなければならないでしょう。これはすべてのブラウザで私のために働いています。
history.pushState({ page: 1 }, "title 1", "#nbb");
window.onhashchange = function (event) {
window.location.hash = "nbb";
};
<html>
<head>
<title>Disable Back Button in Browser - Online Demo</title>
<style type="text/css">
body, input {
font-family: Calibri, Arial;
}
</style>
<script type="text/javascript">
window.history.forward();
function noBack() {
window.history.forward();
}
</script>
</head>
<body onload="noBack();" onpageshow="if (event.persisted) noBack();" onunload="">
<H2>Demo</H2>
<p>This page contains the code to avoid Back button.</p>
<p>Click here to Goto <a href="noback.html">NoBack Page</a></p>
</body>
</html>
history.pushState(null, null, location.href);
window.onpopstate = function () {
history.go(1);
};
jordanhollinger.com に関するこの記事は、私が感じる最良の選択肢です。 Razorの答えに似ていますが、もう少し明確です。以下のコードヨルダンホリンジャーの全クレジット:
前のページ:
<a href="/page-of-no-return.htm#no-back>You can't go back from the next page</a>
ノーリターンのJavaScriptのページ:
// It works without the History API, but will clutter up the history
var history_api = typeof history.pushState !== 'undefined'
// The previous page asks that it not be returned to
if ( location.hash == '#no-back' ) {
// Push "#no-back" onto the history, making it the most recent "page"
if ( history_api ) history.pushState(null, '', '#stay')
else location.hash = '#stay'
// When the back button is pressed, it will harmlessly change the url
// hash from "#stay" to "#no-back", which triggers this function
window.onhashchange = function() {
// User tried to go back; warn user, rinse and repeat
if ( location.hash == '#no-back' ) {
alert("You shall not pass!")
if ( history_api ) history.pushState(null, '', '#stay')
else location.hash = '#stay'
}
}
}
history.pushState(null, null, document.URL);
window.addEventListener('popstate', function () {
history.pushState(null, null, document.URL);
});
このjavascriptでは、どのユーザも元に戻れません(Chrome、FF、IE、Edgeで動作します)。
簡単に試してみてください。
history.pushState(null, null, document.title);
window.addEventListener('popstate', function () {
history.pushState(null, null, document.title);
});
ブラウザ制限イベントのバックイベント
window.history.pushState(null, "", window.location.href);
window.onpopstate = function () {
window.history.pushState(null, "", window.location.href);
};
後でページに干渉することなく、戻る矢印を壊す非常にシンプルでクリーンな機能。
利点:
onbeforeunload
を使用する他のソリューションのようなユーザーの干渉なしsetInterval
を使用しているため、低速なブラウザーを壊すことなく、常に機能します。unbeforeunload
を使用しません。注:他のソリューションのいくつかはonbeforeunload
を使用します。 しないこの目的でonbeforeunload
を使用してください。ユーザーがウィンドウを閉じたり、バックアローをヒットしようとするたびにダイアログがポップアップします。onbeforeunload
のようなモーダルは通常、まれな状況でのみ適切です。 veは実際には画面上で変更を行っており、この目的のためではなく、変更を保存していません。
仕組み
それでおしまい。さらにいじったり、バックグラウンドでイベントを監視したりする必要はありません。
1秒で使用
デプロイするには、これをページまたはJSのどこかに追加するだけです。
<script>
/* break back button */
window.onload=function(){
var i=0; var previous_hash = window.location.hash;
var x = setInterval(function(){
i++; window.location.hash = "/noop/" + i;
if (i==10){clearInterval(x);
window.location.hash = previous_hash;}
},10);
}
</script>
これは、ブラウザの戻るボタンと、戻るボタンを無効にするのに役立ちました。
history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
history.pushState(null, null, $(location).attr('href'));
});
最近のブラウザではこれはうまくいくようです:
// https://developer.mozilla.org/en-US/docs/Web/API/History_API
let popHandler = () => {
if (confirm('Go back?')) {
window.history.back()
} else {
window.history.forward()
setTimeout(() => {
window.addEventListener('popstate', popHandler, {once: true})
}, 50) // delay needed since the above is an async operation for some reason
}
}
window.addEventListener('popstate', popHandler, {once: true})
window.history.pushState(null,null,null)
私は完璧でありながら解決策が実際にはかなり簡単であると信じています。
それは基本的には進行中のドキュメントの 'mouseenter'/'mouseleave'イベントと共にウィンドウの "onbeforeunload"イベントを割り当てるので、クリックがドキュメントの範囲外になったときにのみアラートが発生します(ブラウザの戻るか進むボタンのどちらかです)
$(document).on('mouseenter', function(e) {
window.onbeforeunload = null;
}
);
$(document).on('mouseleave', function(e) {
window.onbeforeunload = function() { return "You work will be lost."; };
}
);
<script src="~/main.js" type="text/javascript"></script>
<script type="text/javascript">
window.history.forward();
function noBack() { window.history.forward(); } </script>
これを試して、デフォルトで "Back"として機能するIEのバックスペースボタンを防止してください。
<script language="JavaScript">
$(document).ready(function() {
$(document).unbind('keydown').bind('keydown', function (event) {
var doPrevent = false;
if (event.keyCode === 8 ) {
var d = event.srcElement || event.target;
if ((d.tagName.toUpperCase() === 'INPUT' &&
(
d.type.toUpperCase() === 'TEXT' ||
d.type.toUpperCase() === 'PASSWORD' ||
d.type.toUpperCase() === 'FILE' ||
d.type.toUpperCase() === 'EMAIL' ||
d.type.toUpperCase() === 'SEARCH' ||
d.type.toUpperCase() === 'DATE' )
) ||
d.tagName.toUpperCase() === 'TEXTAREA') {
doPrevent = d.readOnly || d.disabled;
}
else {
doPrevent = true;
}
}
if (doPrevent) {
event.preventDefault();
}
try {
document.addEventListener('keydown', function (e) {
if ((e.keyCode === 13)){
// alert('Enter keydown');
e.stopPropagation();
e.preventDefault();
}
}, true);
} catch (err) {}
});
});
</script>
<script language="JavaScript">
javascript:window.history.forward(1);
</script>
HTMLページを1つ作成します(index.html)。私は(script)フォルダ/ディレクトリの中にも一つ(mechanism.js)を作成します。次に、必要に応じてform、table、span、およびdivタグを使用して、すべてのコンテンツを(index.html)内に配置します。さて、ここでは前後に何もしないようにするトリックがあります!
まず、あなたは1ページしか持っていないという事実!次に、span/divタグ付きのJavaScriptを使用して、通常のリンクで必要に応じてコンテンツを同じページに表示したり非表示にしたりすることです。
「index.html」内:
<td width="89px" align="right" valign="top" style="letter-spacing:1px;">
<small>
<b>
<a href="#" class="traff" onClick="DisplayInTrafficTable();">IN</a>
</b>
</small>
[ <span id="inCountSPN">0</span> ]
</td>
「mechanism.js」内:
function DisplayInTrafficTable()
{
var itmsCNT = 0;
var dsplyIn = "";
for ( i=0; i<inTraffic.length; i++ )
{
dsplyIn += "<tr><td width='11'></td><td align='right'>" + (++itmsCNT) + "</td><td width='11'></td><td><b>" + inTraffic[i] + "</b></td><td width='11'></td><td>" + entryTimeArray[i] + "</td><td width='11'></td><td>" + entryDateArray[i] + "</td><td width='11'></td></tr>";
}
document.getElementById('inOutSPN').innerHTML = "" +
"<table border='0' style='background:#fff;'><tr><th colspan='21' style='background:#feb;padding:11px;'><h3 style='margin-bottom:-1px;'>INCOMING TRAFFIC REPORT</h3>" + DateStamp() + " - <small><a href='#' style='letter-spacing:1px;' onclick='OpenPrintableIn();'>PRINT</a></small></th></tr><tr style='background:#eee;'><td></td><td><b>###</b></td><td></td><td><b>ID #</b></td><td></td><td width='79'><b>TYPE</b></td><td></td><td><b>FIRST</b></td><td></td><td><b>LAST</b></td><td></td><td><b>PLATE #</b></td><td></td><td><b>COMPANY</b></td><td></td><td><b>TIME</b></td><td></td><td><b>DATE</b></td><td></td><td><b>IN / OUT</b></td><td></td></tr>" + dsplyIn.toUpperCase() + "</table>" +
"";
return document.getElementById('inOutSPN').innerHTML;
}
見た目は毛深いですが、関数名と呼び出し、埋め込みHTML、およびspanタグのid呼び出しに注目してください。これは、同じページの同じspanタグに異なるHTMLを挿入する方法を示すためです。戻る/進むはこのデザインにどのように影響しますか?同じページ上でオブジェクトを隠したり他のオブジェクトを置き換えたりするので、できません。
非表示にして表示するには?必要に応じて、「mechanism.js」内の関数内で、次のように使用します。
document.getElementById('textOverPic').style.display = "none"; //hide
document.getElementById('textOverPic').style.display = ""; //display
リンク内の 'index.html'呼び出し関数:
<img src="images/someimage.jpg" alt="" />
<span class="textOverPic" id="textOverPic"></span>
そして
<a href="#" style="color:#119;font-size:11px;text-decoration:none;letter-spacing:1px;" onclick="HiddenTextsManager(1);">Introduction</a>
私はあなたに頭痛を与えなかったことを願っています。私がした場合は申し訳ありません:-)
あなたはこれをすることはできないし、すべきではありません。しかし、これは役に立つかもしれません
<script type = "text/javascript" >
history.pushState(null, null, 'pagename');
window.addEventListener('popstate', function(event) {
history.pushState(null, null, 'pagename');
});
</script>
私のクロムとFirefoxで動作します
私の場合、これは買い物注文でした。だから私はボタンを無効にすることでした。ユーザーが戻ってクリックしても、ボタンは無効になっていました。彼らがもう一度もう一度クリックし、そして次に進むためにページボタンをクリックしたとき。私は彼らの注文が送信されたことを知っていて、別のページにスキップしました。
ページが実際に更新されたときに、ボタンが(理論的には)利用可能になります。私はそれから、注文が既に送信されていることをページロードで反応させることができて、その時リダイレクトもできました。