VisualForceページの静的リソース

Sep 09 2020

私は以下のように私のビジュアルフォースページでグーグルReキャプチャを使用しています

<apex:page sidebar="false" showHeader="false">
    <apex:slds />    
    <html>  
        <head> 
            <script type="text/javascript">
            var verifyCallback = function(response) {
                parent.postMessage("formvalidated", "{!$Site.BaseSecureUrl}");
            }; 
            var onloadCallback = function() {                
                grecaptcha.render('html_element', {
                    'sitekey' :'XXXXXXXXXXXXXXXXX',
                    'callback' : verifyCallback,
                });
            };
            </script>
        </head>
        <body>
            <form action="?" method="POST">
                <div id="html_element"></div>
                <br/>
                <input type="submit" value="Submit" style="display:none"/>
            </form>
            <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async="" defer="">
            </script>
        </body>
    </html> 
</apex:page>

上記のコードは正常に機能しています。

今、私はStatic resource以下のようにスクリプトタグにjsURLをロードする代わりに使用しようとしています。

これは機能していません

<apex:includeScript value="{! $Resource.RecaptchaAPI}"/>

私https://www.google.com/recaptcha/api.jsはブラウザでこのURLをヒットし、jsをとして保存し、recaptchaApi.js以下のような名前で新しい静的リソースを作成しました

私がここで欠けているものを教えてくれませんか。

回答

2 arut Sep 09 2020 at 14:12

静的リソースをロードすることにより(以下のコードを使用)、JSファイルがロードされた後に何が発生または実行されるかをVFページに具体的に指示する必要はありません。

<apex:includeScript value="{! $Resource.RecaptchaAPI}"/>

&?onload=onloadCallback&render=explicitページの最後にあるURLもそれを行いません(明示的なonload属性が組み込まれているスクリプトタグとは異なります)。したがって、以下に示すようにコードを更新する必要があります。

<apex:page sidebar="false" showHeader="false">
    <apex:slds />
    <apex:includeScript value="{! $Resource.RecaptchaAPI }"/>
    <script type="text/javascript">
    grecaptcha.ready(function(){
        grecaptcha.render('html_element', {
            'sitekey' :'<Place your site key here>',
            'callback' : verifyCallback,
        });
    });
    
    var verifyCallback = function(response) {
        console.log('inside verifyCallback');
        parent.postMessage("formvalidated", "{!$Site.BaseSecureUrl}");
    };
    </script>
    <form action="?" method="POST">
        <div id="html_element"></div>
        <br/>
        <input type="submit" value="Submit" style="display:none"/>
    </form>
</apex:page>

grecaptcha.ready関数は、静的リソースが読み込まれ、google recaptchaapiの準備ができた後に実行されます。渡されたコールバック関数は、残りのロジックを処理するために使用する必要があります。

別の解決策:次のこともできます(ここではg-recaptcha、data-sitekey&などのタグ属性を利用できますdata-callback)。

<apex:page sidebar="false" showHeader="false">
    <apex:slds />
    <apex:includeScript value="{! $Resource.RecaptchaAPI }"/>
    <script type="text/javascript">    
        function verifyCallback(response) {
            console.log('inside verifyCallback');
            parent.postMessage("formvalidated", "{!$Site.BaseSecureUrl}");
        };
    </script>
    <form action="?" method="POST">
        <div class="g-recaptcha" data-sitekey="<Place your site key here>" data-callback="verifyCallback"></div>
        <br/>
        <input type="submit" value="Submit" style="display:none"/>
    </form>
</apex:page>