我正在尝试将一个Marketo表单添加到Gatsby站点中,但在脚本注入页面的顺序上遇到了问题。
当我尝试呈现下面的组件时,我得到了错误消息"ReferenceError: MktoForms2 is not defined“。
我尝试注释掉整个useEffect代码块,组件在没有表单的情况下可以很好地呈现在页面上。然后,当我将"MktoForms2.loadForm("//app-sj11.marketo.com","XXX-XXX-XXX",1608)“粘贴到控制台中时,表单就会按预期出现。
import React, { useEffect } from "react";
import Helmet from "react-helmet";
import "./form.scss";
const FormContactMkto = () => {
useEffect(() => {
MktoForms2.loadForm("//app-sj11.marketo.com", "XXX-XXX-XXX", 1608);
}, []);
return (
<div>
<Helmet>
<script
src="//app-sj11.marketo.com/js/forms2/js/forms2.min.js"
type="text/javascript"
/>
</Helmet>
<form id="mktoForm_1608"></form>
</div>
);
};
export default FormContactMkto;如何将此Marketo表单加载到Gatsby页面?任何帮助或建议,我们都非常感谢!
发布于 2020-05-12 14:30:43
我已经为我的项目创建了一个简单的组件。也许这对你的情况会有用。
import React, { useState, useEffect } from 'react';
const marketoScriptId = 'mktoForms';
export default function MarketoForm({ formId }) {
const [isLoaded, setIsLoaded] = useState(false);
useEffect(() => {
if (!document.getElementById(marketoScriptId)) {
loadScript();
} else {
setIsLoaded(true);
}
}, []);
useEffect(() => {
isLoaded &&
window.MktoForms2.loadForm(
'//app-XX.marketo.com',
'XXX-XXX-XXX',
formId
);
}, [isLoaded, formId]);
const loadScript = () => {
var s = document.createElement('script');
s.id = marketoScriptId;
s.type = 'text/javascript';
s.async = true;
s.src = '//app-XX.marketo.com/js/forms2/js/forms2.min.js';
s.onreadystatechange = function() {
if (this.readyState === 'complete' || this.readyState === 'loaded') {
setIsLoaded(true);
}
};
s.onload = () => setIsLoaded(true);
document.getElementsByTagName('head')[0].appendChild(s);
};
return (
<div>
<form id={`mktoForm_${formId}`}></form>
</div>
);
}https://stackoverflow.com/questions/56943000
复制相似问题