代码之家  ›  专栏  ›  技术社区  ›  Omtechguy

从数据回调函数中重述对保存DOM元素的局部变量的访问

  •  1
  • Omtechguy  · 技术社区  · 6 年前

    在我的站点中,我有google reCaptcha组件,它允许我在属性“data callback”中指定一个回调函数。

    这是我的html文件:

    <html>
        <script src='https://www.google.com/recaptcha/api.js'></script>    
        <script type="text/javascript">
    
        var txtClientResponse = document.getElementById('txtClientResponse');
        var txtServerResponse = document.getElementById('txtServerResponse');
    
        function successCallback(value) {
    
            this.txtClientResponse.value = value;
            this.txtServerResponse.innerText.clear();
    
        }
    </script>
    <body>
        <div class="g-recaptcha" data-callback="successCallback" data-error-callback="errorCaptcha" data-sitekey="xxxxxx" />
    
        <input ID="txtClientResponse" />
        <input ID="txtServerResponse" />
    
    </body>
    

    除了无法从回调函数“successCallback”访问包含DOM元素的局部变量txtClientResponse之外,其他一切都很正常。对于像var test=1这样的局部变量,我可以使用this.test访问。

    我试图通过“这个”使用像我做的角度,但它没有工作。我需要一个纯javascript解决方案-而不是角度:

    <div class="g-recaptcha" data-callback="successCallback.bind(this)" data-error-callback="errorCaptcha" data-sitekey="xxxxxx"/>
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Omtechguy    6 年前

    我很长时间没有使用纯JavaScript,因为我使用的是Angular,我忘记了带有JavaScript代码的script标记应该在body标记内容的最底部,或者至少在document.onreadystatechange事件中用getElementById分配变量。

    问题是线路:

    var txtClientResponse = document.getElementById('txtClientResponse');
    var txtServerResponse = document.getElementById('txtServerResponse');
    

    在HTML元素就绪之前执行。

    以下是使用google可能会发现这个问题的用户的修复方法

    <html>    
    <body>
        <div class="g-recaptcha" data-callback="successCallback" data-error-callback="errorCaptcha" data-sitekey="xxxxxx" />
    
        <input ID="txtClientResponse" />
        <input ID="txtServerResponse" />
    
        <script src='https://www.google.com/recaptcha/api.js'></script>
        <script type="text/javascript">
    
            var txtClientResponse = document.getElementById('txtClientResponse');
            var txtServerResponse = document.getElementById('txtServerResponse');
    
            function successCallback(value) {
    
                this.txtClientResponse.value = value;
                this.txtServerResponse.innerText.clear();
    
            }
        </script>
    
    </body>
    </html>