繁体   English   中英

重新加载验证码图像

[英]Reload captcha image

我有一个PHP脚本生成一个png图像,其中验证码为图像文本。

session_start();   
$captchanumber = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz'; 
$captchanumber = substr(str_shuffle($captchanumber), 0, 8); 
$_SESSION["code"] = $captchanumber; 
$image = imagecreatefromjpeg("cap.jpg");     
$black  = imagecolorallocate($image, 160, 160, 160);   
$font = '../assets/fonts/OpenSans-Regular.ttf';  
imagettftext($image, 20, 0, 35, 27, $black, $font, $captchanumber);   
header('Content-type: image/png');    
imagepng($image);
imagedestroy($image);

我想通过jQuery或JavaScript重新加载图像,所以我使用这样的东西:

$(document).ready(function(e) {
    $('.captcha').click(function(){
        alert('yolo');
        var id = Math.random();
        $(".captcha").replaceWith('<img class="captcha" src="img/captcha.php?id='+id+'" />');
        id ='';

    });
});

场:

<img class="captcha" src="img/captcha.php">

作为第一次尝试,它有效,但在那之后,如果我再次点击该字段,它将不再工作,我不知道为什么。

您正在用新元素替换dom元素,它将销毁所有附加的事件处理程序。

方法1:您可以通过使用事件委派来侦听动态添加的元素事件来解决此问题。

$(document).ready(function(e) {
    $('body').on('click', '.captcha', function(){
        alert('yolo');
        var id = Math.random();
        $(this).replaceWith('<img class="captcha" src="img/captcha.php?id='+id+'" />');
    });
});

 $(document).ready(function(e) { $('body').on('click', '.captcha', function() { alert('yolo'); var id = Math.random(); $(this).replaceWith('<img class="captcha" src="img/captcha.php?id=' + id + '" />'); }); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img class="captcha" src="img/captcha.php"> 


方法2:只需用新url更新img src属性,而不是替换整个元素。

$(document).ready(function(e) {
    $('.captcha').click(function(){
        alert('yolo');
        var id = Math.random();
        $(this).attr('src', 'img/captcha.php?id='+id);
    });
});

 $(document).ready(function(e) { $('.captcha').click(function() { alert('yolo'); var id = Math.random(); $(this).attr('src', 'img/captcha.php?id=' + id); }); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img class="captcha" src="img/captcha.php"> 


方法3:您也可以使用与之前相同逻辑的纯JavaScript完成它。

 document.querySelector('.captcha').addEventListener('click', function() { alert('yolo'); var id = Math.random(); this.setAttribute('src', 'img/captcha.php?id=' + id); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img class="captcha" src="img/captcha.php"> 


方法4:onClick属性设置为元素并使用纯JavaScript处理click事件,您需要将this作为参数传递以引用元素。

 function captcha(ele) { alert('yolo'); var id = Math.random(); ele.setAttribute('src', 'img/captcha.php?id=' + id); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img class="captcha" onclick="captcha(this)" src="img/captcha.php"> 

您的代码仅工作一次的原因是因为替换了具有验证码类的原始元素并且不再检测到单击

一个干净的解决方案是替换图像的src而不是完整的元素。

工作实例

jQuery的

  $(document).ready(function () {
        $("#changeThis").click(
            function () {
                changeImage();
            }            
        );
    });

function changeImage() {
   //we want whole numbers not numbers with dots here for cleaner urls
   var id = Math.floor((Math.random() * 1000) + 1);
   $('#changeThis').attr("src",'img/captcha.php?id='+id);
   //Not sure why you want to empty id though.
   id ='';
}

或者在线:

$("#changeThis").click($('#changeThis').attr("src",'img/captcha.php?id='+Math.floor((Math.random() * 1000) + 1)));

HTML对于唯一元素,使用id =“”语法而不是class =“”,当多个元素可以具有相同的类时使用class,id是唯一元素的标识符。

<img class="captcha" id="changeThis" src="img/captcha.php">

可能只是将事件绑定到代码替换的元素的问题。 考虑委托绑定到文档:

// Replace
$(document).ready(function(e) {
    $('.captcha').click(function(){
// With
$(document).ready(function(e) {
    $('.captcha').on('click', document, function(){

好的。 问题是你声明了id变量,当你已经有一个id变量时,你尝试在第二个函数调用中重新声明它,所以它将被静默忽略,而是使用空字符串。

尝试移动var id =''; 退出函数,并在函数中使用id = Math.random()

这是一个委托问题,因为您已插入新元素,因此删除了事件侦听器,有许多解决方案:

解决方案1:

使用内联事件绑定

function rebindCaptcha()
{
var id = Math.random();
        $(".captcha").replaceWith('<img onclick="rebindCaptcha()" class="captcha" src="img/captcha.php?id='+id+'" />');
}

解决方案2:

将您的元素保存在dom中,只需更改src属性:

$(document).ready(function(e) {
      $('.captcha').click(function(){
          var id = Math.random();
          this.src = 'img/captcha.php?id='+id+';
          id ='';

      });
  });  

仅供您参考,jQuery委托可以完成如下:

$(".parent .child").on("event",function(){/*your handler here*/}) 

要么

$(".parent").on("event",".child",function(){/*your handler here*/})

通常选择一个您确定它将始终存在于您的dom中的父级,并始终在文档就绪事件之后附加侦听器。

对我来说,它的工作,因为我说你必须在javascript中使用id来改变事物

// reload is your button reload and captcha must be a div who surrounding the captcha img

document.querySelector('#reload').addEventListener('click', function(e){
  var reload = document.getElementById('captcha')
  reload.innerHTML = "your new logic"
})

//reload.innerHTML将成为新的验证码html代码

为了使用新代码加载图像,您可以使用版本参数for captcha.php。 请参阅以下代码。

<img class="captcha" id="secure_code" src="img/captcha.php"> <a href="#" id="reload_captcha">Reload</a> 

$(document).ready(function(e) {
    $('#relaod_captcha').click(function(e) {
        e.preventDefault() ;
        $('#secure_code').attr('src', "img/captcha.php?ver="+Math.random()) ;
    }) ;
}) ;

我希望它会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM