Braintree 托管字段未在 Polymer 上呈现
Braintree Hosted Fields not rendering on Polymer
我正在尝试在 Polymer 应用程序上使用 braintree 的托管字段,但 运行 遇到了代表托管字段的输入框未呈现的问题。没有出现错误,通常包含输入框的 iFrame 可以正确呈现。
这是我的部分代码,与 braintree 在其网站 here 上提供的基本示例代码非常相似,只是进行了修改,以便它在自定义聚合物元素中正常运行。
<script src="https://js.braintreegateway.com/web/3.5.0/js/client.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.5.0/js/hosted-fields.min.js"></script>
<dom-module id="my-view1">
<template>
<style include="shared-styles">
</style>
<form action="/" method="post" id="cardForm" >
<div class="horizontal layout center-justified card-container">
<div class="vertical layout center-justified">
<paper-card id="creditCardDetails" heading="Credit Card Information" class="card-content" elevation="2" style="">
<div class="field-label">
<label class="hosted-field-braintree--label" for="card-number">Card Number</label>
<div id="card-number" class="hosted-field-braintree"></div>
</div>
<div class="field-label">
<label class="hosted-field-braintree--label" for="expiration-date">Expiration Date</label>
<div id="expiration-date" class="hosted-field-braintree"></div>
</div>
<div class="field-label">
<label class="hosted-field-braintree--label" for="cvv">CVV</label>
<div id="cvv" class="hosted-field-braintree"></div>
</div>
<div>
<paper-button id="creditButton" raised class="custom-color" on-click="_onCreditButtonClick">Submit</paper-button>
</div>
</paper-card>
</div>
</div>
</form>
</template>
<script>
Polymer({
is: 'payment'
...
});
var form = document.querySelector("*/deep/#cardForm");
braintree.client.create({
authorization: 'sandbox_g42y39zw_348pk9cgf3bgyw2b'
}, function (clientErr, clientInstance) {
if (clientErr) {
console.error(clientErr);
return;
}
braintree.hostedFields.create({
client: clientInstance,
styles: {
'input': {
'font-size': '14px'
},
'input.invalid': {
'color': 'red'
},
'input.valid': {
'color': 'green'
}
},
fields: {
number: {
selector: '*/deep/#card-number',
placeholder: '4111 1111 1111 1111'
},
cvv: {
selector: '*/deep/#cvv',
placeholder: '123'
},
expirationDate: {
selector: '*/deep/#expiration-date',
placeholder: '10/2019'
}
}
}, function (hostedFieldsErr, hostedFieldsInstance) {
if (hostedFieldsErr) {
console.error(hostedFieldsErr);
return;
}
console.log(hostedFieldsInstance)
});
});
});
});
</script>
感谢任何正确方向的帮助。
完全披露:我在 Braintree 工作。如果您有任何其他问题,请随时联系 support。
目前,Polymer 库和 Braintree Javascript 库不兼容。我们正在与 Polymer 团队开始对话,希望找到一种他们可以一起工作的方式。
Braintree 的托管字段在您在设置中指定的每个选择器中插入 iFrame。要初始化这些框架并与它们通信,它依赖于在商家页面上的 window.frames
属性 中引用创建的 iframe。
Polymer 的 Shadow DOM 抽象并隐藏了 DOM 中的许多内容,并且部分工作阻止 Shadow DOM 中的 iframe 包含在 window.frames
中。这意味着当 运行 与 Polymer 一起使用时,Braintree Javascript SDK 无法访问它创建的 iframe,使它们呈现,但未初始化且无用。
我正在尝试在 Polymer 应用程序上使用 braintree 的托管字段,但 运行 遇到了代表托管字段的输入框未呈现的问题。没有出现错误,通常包含输入框的 iFrame 可以正确呈现。
这是我的部分代码,与 braintree 在其网站 here 上提供的基本示例代码非常相似,只是进行了修改,以便它在自定义聚合物元素中正常运行。
<script src="https://js.braintreegateway.com/web/3.5.0/js/client.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.5.0/js/hosted-fields.min.js"></script>
<dom-module id="my-view1">
<template>
<style include="shared-styles">
</style>
<form action="/" method="post" id="cardForm" >
<div class="horizontal layout center-justified card-container">
<div class="vertical layout center-justified">
<paper-card id="creditCardDetails" heading="Credit Card Information" class="card-content" elevation="2" style="">
<div class="field-label">
<label class="hosted-field-braintree--label" for="card-number">Card Number</label>
<div id="card-number" class="hosted-field-braintree"></div>
</div>
<div class="field-label">
<label class="hosted-field-braintree--label" for="expiration-date">Expiration Date</label>
<div id="expiration-date" class="hosted-field-braintree"></div>
</div>
<div class="field-label">
<label class="hosted-field-braintree--label" for="cvv">CVV</label>
<div id="cvv" class="hosted-field-braintree"></div>
</div>
<div>
<paper-button id="creditButton" raised class="custom-color" on-click="_onCreditButtonClick">Submit</paper-button>
</div>
</paper-card>
</div>
</div>
</form>
</template>
<script>
Polymer({
is: 'payment'
...
});
var form = document.querySelector("*/deep/#cardForm");
braintree.client.create({
authorization: 'sandbox_g42y39zw_348pk9cgf3bgyw2b'
}, function (clientErr, clientInstance) {
if (clientErr) {
console.error(clientErr);
return;
}
braintree.hostedFields.create({
client: clientInstance,
styles: {
'input': {
'font-size': '14px'
},
'input.invalid': {
'color': 'red'
},
'input.valid': {
'color': 'green'
}
},
fields: {
number: {
selector: '*/deep/#card-number',
placeholder: '4111 1111 1111 1111'
},
cvv: {
selector: '*/deep/#cvv',
placeholder: '123'
},
expirationDate: {
selector: '*/deep/#expiration-date',
placeholder: '10/2019'
}
}
}, function (hostedFieldsErr, hostedFieldsInstance) {
if (hostedFieldsErr) {
console.error(hostedFieldsErr);
return;
}
console.log(hostedFieldsInstance)
});
});
});
});
</script>
感谢任何正确方向的帮助。
完全披露:我在 Braintree 工作。如果您有任何其他问题,请随时联系 support。
目前,Polymer 库和 Braintree Javascript 库不兼容。我们正在与 Polymer 团队开始对话,希望找到一种他们可以一起工作的方式。
Braintree 的托管字段在您在设置中指定的每个选择器中插入 iFrame。要初始化这些框架并与它们通信,它依赖于在商家页面上的 window.frames
属性 中引用创建的 iframe。
Polymer 的 Shadow DOM 抽象并隐藏了 DOM 中的许多内容,并且部分工作阻止 Shadow DOM 中的 iframe 包含在 window.frames
中。这意味着当 运行 与 Polymer 一起使用时,Braintree Javascript SDK 无法访问它创建的 iframe,使它们呈现,但未初始化且无用。