これは、ユーザーが必要に応じて画像を再読み込みするリンクを含むキャプチャ画像です。このコードはGoogleChromeでのみ機能します。他のブラウザで動作させるにはどうすればよいですか?
<img id="captcha" src="captcha.php">
<a id='reload'>Refresh now</a>
$('#reload').click(function(){
$('#captcha').attr('src','captcha.php')
})
これは、ユーザーが必要に応じて画像を再読み込みするリンクを含むキャプチャ画像です。このコードはGoogleChromeでのみ機能します。他のブラウザで動作させるにはどうすればよいですか?
<img id="captcha" src="captcha.php">
<a id='reload'>Refresh now</a>
$('#reload').click(function(){
$('#captcha').attr('src','captcha.php')
})
他のブラウザはおそらく画像をキャッシュします。次のことを試してください。
$("#captcha").attr("src", "captcha.php?"+(new Date()).getTime());
キャッシュ方法を使用せずにこれを試してください(ところで、タグにはhref属性を設定する必要があります)。
<a id='reload' href='#'>Refresh now</a>
$('#reload').click(function(){
var timestamp = new Date().getTime();
$('#captcha').attr('src','captcha.php?'+timestamp)
})
ブラウザのキャッシュである可能性があります。つまり、ブラウザはすでにロードされていることを認識しているcaptcha.php
ため、再度ロードする必要はありません。
現在の時刻を含むクエリ文字列を画像ソースに追加してみてください。画像ソースは、ブラウザが再読み込みを試みる前に読み込まれていないURLになります。
<img id="captcha" src="captcha.php">
<a id='reload'>Refresh now</a>
$('#reload').click(function(){
$('#captcha').attr('src','captcha.php?' + (new Date()).getTime());
});
captcha.php
さらに良いことに、ブラウザがHTTPヘッダーをキャッシュしないように、HTTPヘッダーをオンに設定します。
<?php
// Set headers to NOT cache a page
header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
header("Pragma: no-cache"); //HTTP 1.0
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
これを試して:
DOM
<div id="captcha-container">
<img src="captcha.php" id="captcha">
</div>
jQuery
$('#reload').click(function() {
$('#captcha').remove();
$('#captcha-container').html('<img src="captcha.php" id="captcha">');
});
NETログ
[再読み込み]をクリックするたびに、新しいリクエストが作成されます。
GET captcha.php
200 OK
127.0.0.1:80
GET captcha.php
200 OK
127.0.0.1:80
GET captcha.php
200 OK
127.0.0.1:80
新しいimg要素を追加すると、ブラウザはそれをリロードします。
これまでの回答はすべてjQueryを使用しているので、プレーンなJavascriptのみを使用するものを投稿したいと思いました。
// Helper function to attach event listener functions to HTML elements.
function attach(el, event, fun) {
if (el.addEventListener) {
el.addEventListener(event, fun);
}
else {
el.attachEvent("on"+event, fun);
}
}
// Find the <a id='reload'> element.
var id_reload = document.getElementById("reload");
if (null !== id_reload) {
// Find the <img id='captcha'> element. We assume this works, so no check against null.
var id_captcha = document.getElementById("captcha");
attach(id_reload, "click", function() {
id_captcha.src = "captcha.php?" + (new Date()).getTime();
});
}
画像のsrcが同じである場合、ブラウザは新しいHTTPリクエストをサーバーに送信しません。したがって、役に立たないタイムスタンプを追加してsrcを変更します。
ブラウザのjavascript:
var capImage = document.getElementById("captcha-image");
capImage.addEventListener("click", function () {
capImage.src = "/captcha?timestamp=" + (new Date()).getTime();
});
これは、キャプチャ画像を更新するためのデモです。
また、タイムスタンプは常に前のソースURLと連結されるため、削除する必要があります。ユーザーがリロードボタンを何度もクリックすると、問題が発生する可能性があります。したがって、新しいタイムスタンプを追加する前に、URLから以前のタイムスタンプを削除することをお勧めします。
$('#reload').on('click', function(){
var img=$('#captchaimage');
var src=img.attr('src');
var i=src.indexOf('?dummy=');
src=i!=-1?src.substring(0,i):src;
d = new Date();
img.attr('src',src+'?dummy='+d.getTime());
});