如何刷新页面刷新/加载上的验证码图像?

如何解决如何刷新页面刷新/加载上的验证码图像?

| 我想强迫我的网站在每次加载时都刷新验证码图像,所以我有一个用onload()事件触发的javascript方法。在这里,我有以下几行:
document.getElementById(\'yw0_button\').click;
Firebug不会检测到任何错误,出于测试目的,我在显示的行后立即添加了一个警报,每次加载页面时都会弹出警报。但是,图像不会刷新! 我认为这与视图文件有关:
<?php if(extension_loaded(\'gd\')): ?>
    <div class=\"row\">
        <?php echo $form->labelEx($model,\'verifyCode\'); ?>
        <div>
            <?php
            $this->widget(\'CCaptcha\',array(\'showRefreshButton\'=>true,\'buttonType\'=>\'button\',\'buttonOptions\'=>
                                                    array(\'type\'=>\'image\',\'src\'=>\"/path/images/refresh-icon.png\",\'width\'=>30,),\'buttonLabel\'=>\'Refrescar imagen\'),false); 
            ?>
            <br>
            <?php echo $form->textField($model,\'verifyCode\'); ?>
        </div>
    <div class=\"hint\">
        Porfavor ingrese las letras como las ve en la imagen superior.
        <br/>No hay distincion entre minúsculas y mayúsculas.</div>
    </div>
<?php endif; ?>
有任何想法吗? @k到z刚看到了这个!是的,如果您能帮助我找到更合适的解决方案,那就太好了!这是我认为与视图文件有关的内容:
<?php if(extension_loaded(\'gd\')): ?>
        <div class=\"row\">
            <?php echo $form->labelEx($model,\'verifyCode\'); ?>
            <div>
                <?php
                $this->widget(\'CCaptcha\',\'buttonOptions\'=>
                                                        array(\'type\'=>\'image\',false); 
                ?>
                <br>
                <?php echo $form->textField($model,\'verifyCode\'); ?>
            </div>
        <div class=\"hint\">
            Porfavor ingrese las letras como las ve en la imagen superior.
            <br/>No hay distincion entre minúsculas y mayúsculas.</div>
        </div>
    <?php endif; ?>
在控制器中,我将在accessRules()方法中向授权用户授予验证码操作的权限,仅此而已。还有什么我可以张贴的吗?     

解决方法

        如果有人在开始使用Yii时遇到类似的问题。.这就是我解决了触发点击的CAPTCHA问题:我有一个事件触发了onload事件,该事件具有以下代码: $(\'#yw0_button \')。click(); 当然一定有更好的方法,即时开放的建议!但是,作为一种临时解决方案,它可以很好地工作,每次加载页面时刷新验证码图像。祝好运! 编辑:我所做的是像这样处理我的html页面的onload事件
<body onload=\"initialize()\"> 
.. 
</body> 
然后在我的js文件中:
function initialize() 
{ 
     $(\'#yw0_button\').click(); 
} 
    ,        我希望我可以提出一种更好的方法来解决Soph提到的问题。我知道这不是这个问题上瘾的与JavaScript相关的解决方案,但是正如我所看到的,这是最正确的方法。 我面临着相同的要求-在页面刷新时刷新标题,但是当用户的输入在其他字段上无效时保留该标题,因为在每次验证失败时都重复一个新的验证码很烦人。因此,此任务看起来好像不刷新
POST
请求的标题,否则刷新它(
GET
请求)。 Soph自己提出的解决方案无法实现这一目标-因为可能知道“ 5”个请求已发送到服务器,并且客户端JavaScript无法分析其数据。 因此,我决定看一下Yii的验证码实现。它由位于“ 8”包中的两个类组成。前者是从ѭ10扩展为
CCaptcha
,我们在视图中使用这种方式将验证码添加到网络表单中,如下所示:
<?php 
    $this->widget(\"CCaptcha\",array(
    \'buttonLabel\' => \"Generate another code\",\'showRefreshButton\' => false,\'clickableImage\' => true
));
?>
后者是
CCaptchaAction
,它通过生成验证码和创建图像来提供验证码的工作最为重要。考虑到Yii被设计为面向对象,我们可以创建几个我们自己的类
Captcha
CaptchaAction
,它们分别相对于
CCaptcha
CCaptchaAction
扩展,并将它们放置在Web应用程序目录的
components
子目录中。 这两个类的实现如下。 覆盖了
CCaptchaAction
run()
方法,该方法与原始方法非常相似,不同之处在于,当设置了
render_refreshed
GET参数并且正在动态生成新的验证码并渲染并返回相应的新图像时,将执行一个附加的
if
分支。作为行动的结果。
Captcha
类中引入了公共
refresh
变量,默认变量为
false
,这意味着小部件的行为类似于
CCaptcha
的行为。重写“ 26”方法时,我们更改了负责准备小部件的输出HTML代码的代码。为了更加精确,在此处准备了指向验证码操作的链接,将其用作an28ѭ标签的
src
属性。如果将“ 22”成员设置为“ 30”,则会在此链接后附加一个“ 21”参数。 这是
CaptchaAction.php
<?php

Yii::import(\"system.web.widgets.captcha.CCaptchaAction\");

class CaptchaAction extends CCaptchaAction
{
    const RENDER_REFRESHED_GET_VAR = \"render_refreshed\";

    public function run()
    {
        if (isset($_GET[self::REFRESH_GET_VAR]))  // AJAX request for regenerating code
        {
            $code = $this->getVerifyCode(true);
            echo CJSON::encode(array(
                \'hash1\' => $this->generateValidationHash($code),\'hash2\' => $this->generateValidationHash(strtolower($code)),// we add a random \'v\' parameter so that FireFox can refresh the image
                // when src attribute of image tag is changed
                \'url\'=> $this->getController()->createUrl($this->getId(),array(
                    \'v\' => uniqid()
                )),));
        }
        else if (isset($_GET[self::RENDER_REFRESHED_GET_VAR]))
        {
            $this->renderImage($this->getVerifyCode(true));
        }
        else
            $this->renderImage($this->getVerifyCode());
        Yii::app()->end();
    }
}
这是
Captcha.php
<?php

Yii::import(\"web.system.widgets.CCaptcha\");

class Captcha extends CCaptcha
{
    public $refresh = false;

    protected function renderImage()
    {
        if (!isset($this->imageOptions[\'id\']))
            $this->imageOptions[\'id\'] = $this->getId();

        if ($this->refresh)
        {
            $url = $this->getController()->createUrl($this->captchaAction,array(
                \'v\' => uniqid(),CaptchaAction::RENDER_REFRESHED_GET_VAR => 1
            ));
        }
        else
        {
            $url = $this->getController()->createUrl($this->captchaAction,array(
                \'v\' => uniqid()
            ));
        }
        $alt = isset($this->imageOptions[\'alt\']) ? $this->imageOptions[\'alt\'] : \'\';
        echo CHtml::image($url,$alt,$this->imageOptions);
    }
}
因此用法非常简单。在为网站页面准备模型数据时,请执行以下操作:
...

// Creating order model\'s instance
$model = new MyModel();
$refreshCaptcha = true;

if (isset($_POST[\'MyModel\']))
{
    $refreshCaptcha = false;
    ...
}

...

$this->render(\"myView\",array(
    \'model\' => $model,\'refreshCaptcha\' => $refreshCaptcha
));
之后,在此页面操作的
myView
模板中修改验证码的小部件调用:
<?php 
    $this->widget(\"Captcha\",\'clickableImage\' => true,\'refresh\' => $refreshCaptcha
));
并且不要忘记通过将
CCaptchaAction
类替换为
CaptchaAction
来修改页面控制器的
actions
方法:
public function actions()
{
    return array(
        \'captcha\'=>array(
            \'class\'=>\'CaptchaAction\',\'backColor\'=>0xFFFFFF
        )
    );
}
在我看来,它按预期工作。希望这会帮助到别人。     ,        我想在Ezze的答案中添加一些内容: 为了使clientValidation正常工作,您可以使用自定义的验证码验证:
class CaptchaValidatorRefresh extends CCaptchaValidator
{
    public function clientValidateAttribute($object,$attribute)
{
    $js=\"\";

    if(!$this->allowEmpty)
    {
        $message=$this->message!==null ? $this->message : Yii::t(\'yii\',\'The verification code is incorrect.\');

        $js=\"
            if($.trim(value)==\'\') {
                messages.push(\".CJSON::encode($message).\");
            }
        \";
    }       
    return $js;
    }
}
接着
public function rules()
{
    return array(
        array(\'verifyCode\',\'CaptchaValidatorRefresh\',\'on\'=>\'request\',\'allowEmpty\'=>!CCaptcha::checkRequirements()),);
}
    ,        添加此javascript:
jQuery(document).ready(function() {
    jQuery.ajax({
        \'success\':function(html){jQuery(\"#yw0\").attr(\"src\",html)},\'url\':\'/checkout/finish/captcha?refresh=1\',\'cache\':false
    });
    return false;
});
    ,        您可以在表格beginWedget之前编写脚本。 每次加载页面时,都会生成新的验证码。
  $script=\' $(document).ready(function() {

            document.getElementById(\"yw0_button\").click();
    });\';
  Yii::app()->clientScript->registerScript(\'yw0_button\',$script);

  $form=$this->beginWidget(\'CActiveForm\',array(
    \'id\'=>\'test-form\',\'action\'=>Yii::app()->createUrl(\'controllerName/actionName\'),\'enableClientValidation\'=>true,\'clientOptions\'=>array(
        \'validateOnSubmit\'=>true,),));
它为我工作。 希望它也对您有用     ,        这是另一种(正确的)方法(讨论):
Yii::app()->getController()->createAction(\'captcha\')->getVerifyCode(true);
    ,我曾经使用过:http://www.yiiframework.com/extension/captcha-extended/ 并更改CaptchaExtendedAction.php(路径:扩展名/ captchaExtended) 在第154行
$this->renderImage($this->getVerifyCode());  
$this->renderImage($this->getVerifyCode(true));
    ,        我为你们提供了更好的解决方案:
public function beforeAction($action)
{
    if($action->id == \'captcha\'){
        $action->getVerifyCode(true);
    }
    return parent::beforeAction($action); 
}
将这些代码放入包含验证码操作的控制器中!     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-