3

如何在 JSNI 代码中使用 Javascript 库(从 CDN 下载)?

例如,我想在这个 JSNI 方法中调用 javascript Stripe 方法:

    private native void contactStripe(String creditCard, String cvc, String expiryMonth, String expiryYear) /*-{
        $wnd.Stripe.setPublishableKey('my_stripe_publishable_key');
        $wnd.Stripe.createToken({
            number: creditCard,
            cvc: cvc,
            exp_month: expiryMonth,
            exp_year: expiryYear
        }, callBack);
    }-*/;

...但是 Stripe javascript 方法是未定义的。

(更多关于 Stripe.createToken 方法https://stripe.com/docs/tutorials/forms#create-a-single-use-token

使用 CDN url 注入 Stripe javascript 文件:

ScriptInjector.fromUrl("https://js.stripe.com/v1/").setCallback(
    new Callback<Void, Exception>() {
    public void onFailure(Exception reason) {
    }
    public void onSuccess(Void result) {
        contactStripe("0000111122223333", "456", "04", "2014");
    }
}).inject();
4

2 回答 2

9

如果您希望 JS 脚本以可以通过它定义的全局变量访问的方式注入$wnd,您必须这样做。setWindow(ScriptInjector.TOP_WINDOW)

于 2013-01-22T10:56:43.667 回答
0

尝试将您的代码更改为:

private native void contactStripe(String creditCard, String cvc, String expiryMonth, String expiryYear) /*-{

    console.log($wnd.Stripe);             // Should log 'Object'
    console.log($wnd.Stripe.createToken); // should log function
    var obj = {
        number: creditCard,
        cvc: cvc,
        exp_month: expiryMonth,
        exp_year: expiryYear
    };
    consloe.log(obj);                     // Should be 'Object'
    $wnd.Stripe.createToken(obj, callBack);
}-*/; 

如果您使用 chrome 调试工具,您可以检查所有这些对象。

更新 您不提供回调。那是你的问题吗?

于 2013-01-21T20:05:42.420 回答