在Backbone视图中呈现reCAPTCHA v2.0小部件

时间:2015-12-10 21:41:03

标签: javascript backbone.js recaptcha

这是我的问题,我有一个index.html页面,它明确地加载了reCAPTCHA脚本:

<form id="payment-<%= model.Id %>" class="form" action="" method="POST">
    ...
    <div class="captcha-container"></div> //not being used yet
</form>

我有一个包含reCAPTCHA容器元素(div)的模板:

'use strict';
var Backbone = require('Backbone');

var Validation = require('backbone-validation');
Backbone.Validation = Validation;
Backbone.$ = $;

module.exports = BaseView.extend({
    events: {},
    formView: null,
    initialize: function (options) {
       var loadCaptcha = function() {
            window.alert('captcha is ready');
        };
    },
    render: function () {
       // renders view using my form template
    }
});

我有一个骨干视图,它将模板注入index.thml:

a

此时我甚至无法触发回调函数(loadCaptcha),我怀疑问题在于加载顺序,索引页面是否加载以及&#34; onload = loadCaptcha&#34 ;事件发生在骨干视图初始化之前。我试过删除&#34; async&#34;来自脚本标签的属性,但没有运气。有关如何使其工作的任何想法?

2 个答案:

答案 0 :(得分:2)

我通过直接从呈现它的视图中拉回recaptcha脚本来找出解决方案。希望这可以帮助将来的某个人。

loadCaptcha: function() {
    var self = this;
    var getRecaptchaResponse = function(response) {
      self.captchaResponse = response;
    };

    var renderCaptcha = function() {
      self.captchaWidgetId = grecaptcha.render('recaptcha-container-' + self.model.get('Id'), {
          sitekey : service.settings.recaptchaSiteKey,
          callback: getRecaptchaResponse
      });
    };

    window.renderCaptcha = renderCaptcha;

    $.getScript('https://www.google.com/recaptcha/api.js?onload=renderCaptcha&render=explicit', function() {});
},

答案 1 :(得分:0)

我会将您的captch脚本放在骨干视图中。然后将它放在主视图的渲染中。就像它是模块化的一样,你有一个主视图和一个子视图,其中包含在渲染主视图时加载的验证码。