JS 代码在我将其粘贴到控制台时有效,但在我的 React 应用程序中不起作用
Posted
技术标签:
【中文标题】JS 代码在我将其粘贴到控制台时有效,但在我的 React 应用程序中不起作用【英文标题】:JS code works when i paste it on console, but does not work inside my React App 【发布时间】:2021-12-07 08:34:42 【问题描述】:好的,代码如下:
var iyziInit =
currency: "TRY",
token: "23bfa27a-172a-493d-b42f-8b091589eaa0",
price: 2.4,
locale: "tr",
baseUrl: "https://sandbox-api.iyzipay.com",
merchantGatewayBaseUrl: "https://sandbox-merchantgw.iyzipay.com",
registerCardEnabled: true,
bkmEnabled: true,
bankTransferEnabled: false,
bankTransferRedirectUrl: "https://localhost:3000/callback",
bankTransferCustomUIProps: ,
campaignEnabled: false,
creditCardEnabled: true,
bankTransferAccounts: [],
userCards: [],
fundEnabled: true,
memberCheckoutOtpData: ,
force3Ds: false,
isSandbox: true,
storeNewCardEnabled: true,
paymentWithNewCardEnabled: true,
enabledApmTypes: ["SOFORT", "IDEAL", "QIWI", "GIROPAY"],
payWithIyzicoUsed: false,
payWithIyzicoEnabled: true,
payWithIyzicoCustomUI: ,
buyerName: "John",
buyerSurname: "Doe",
merchantInfo: "",
cancelUrl: "",
buyerProtectionEnabled: false,
hide3DS: false,
gsmNumber: "",
email: "email@email.com",
checkConsumerDetail: ,
subscriptionPaymentEnabled: false,
ucsEnabled: false,
fingerprintEnabled: false,
payWithIyzicoFirstTab: false,
metadata: ,
createTag: function()
var iyziJSTag = document.createElement("script");
iyziJSTag.setAttribute(
"src",
"https://sandbox-static.iyzipay.com/checkoutform/v2/bundle.js?v=1634688058781"
);
document.head.appendChild(iyziJSTag);
,
;
iyziInit.createTag();
此代码在<div id="iyzipay-checkout-form"></div>
内创建一个完整的付款表单。
我不能把它当作普通的反应代码,因为它来自支付网关提供商的 api。该脚本需要运行并将这些元素直接添加到 dom。
问题出在这里:
如果我将此代码粘贴到浏览器的控制台中,它会运行,将脚本标签添加到文档头部,然后在 div 中创建我的表单。我可以看到表格。
但是,如果我将此代码放在我的 react 应用程序中,它会运行,将脚本标签添加到文档的头部,然后什么也不会发生。表单未创建,我的 id 为“iyzipay-checkout-form”的 div 为空。
为什么?我疯了,两天都想不通。
也应该提到这一点:如果我创建一个独立的 index.html,将此代码放在文档头部的脚本标记中,然后只需添加一个 id 为“iyzipay-checkout-form”的 div,这确实会创建该html页面上的表单。因此,该代码仅在 react 内部不起作用。
你可以在 React Playground 上测试这个:https://codesandbox.io/s/react-playground-forked-4ht85
在您看到的页面上,即使有创建它的代码,您也不会看到该表单,但是如果您打开操场的控制台,并粘贴我在顶部给出的相同“代码”这个问题,表格就会出现。您也可以右键单击检查,以查看 head 标签和其中创建的内容。
【问题讨论】:
请直接在您的问题中添加您的代码。为什么要粘贴到外部网站,并添加链接? 觉得太长了,好吧我现在编辑直接发帖。 没关系,我冒昧地用它制作了一个可运行的sn-p :) 现在问题(可以这么说)是,您提供的代码有效。我知道当您将此代码放入您的 React 应用程序时,它什么也不做,但我没有 React 应用程序来测试它(我什至不是 React 开发人员)所以我不确定如何重现您的问题.控制台有错误吗? 大概<div id="iyzipay-checkout-form"></div>
是 React 正在重新渲染的组件的一部分。我在这里没有看到那个元素,也没有看到它的id
,所以听起来这个第 3 方工具正在处理这个问题。如果是这种情况,并且如果该第 3 方没有 React 支持(也没有任何其他第 3 方添加了您可以找到的此类支持),那么您可能需要创建自己的 React 包装器组件来重新初始化此功能它呈现,这可能涉及对这个第 3 方功能的一些挖掘。
【参考方案1】:
所以问题是iyziInit.createTag();
注入的脚本需要在全局范围内定义iyziInit
变量(附加到窗口)。
下面是一个可以工作并显示表单的示例。
import logo from "./logo.svg";
import "./App.css";
import useEffect, useState from "react";
function MyComp()
const [, setCalled] = useState(false);
useEffect(() =>
setCalled(called =>
if (!called)
window.iyziInit =
currency: "TRY",
token: "23bfa27a-172a-493d-b42f-8b091589eaa0",
price: 2.4,
locale: "tr",
baseUrl: "https://sandbox-api.iyzipay.com",
merchantGatewayBaseUrl: "https://sandbox-merchantgw.iyzipay.com",
registerCardEnabled: true,
bkmEnabled: true,
bankTransferEnabled: false,
bankTransferRedirectUrl: "https://localhost:3000/callback",
bankTransferCustomUIProps: ,
campaignEnabled: false,
creditCardEnabled: true,
bankTransferAccounts: [],
userCards: [],
fundEnabled: true,
memberCheckoutOtpData: ,
force3Ds: false,
isSandbox: true,
storeNewCardEnabled: true,
paymentWithNewCardEnabled: true,
enabledApmTypes: ["SOFORT", "IDEAL", "QIWI", "GIROPAY"],
payWithIyzicoUsed: false,
payWithIyzicoEnabled: true,
payWithIyzicoCustomUI: ,
buyerName: "John",
buyerSurname: "Doe",
merchantInfo: "",
cancelUrl: "",
buyerProtectionEnabled: false,
hide3DS: false,
gsmNumber: "",
email: "email@email.com",
checkConsumerDetail: ,
subscriptionPaymentEnabled: false,
ucsEnabled: false,
fingerprintEnabled: false,
payWithIyzicoFirstTab: false,
metadata: ,
createTag: function()
var iyziJSTag = document.createElement("script");
iyziJSTag.setAttribute(
"src",
"https://sandbox-static.iyzipay.com/checkoutform/v2/bundle.js?v=1634688058781"
);
document.head.appendChild(iyziJSTag);
;
window.iyziInit.createTag();
return true;
);
return () => delete window.iyziInit;
, []);
return <></>;
function App()
return (
<div className="App">
<header className="App-header">
<img src=logo className="App-logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
<MyComp />
</div>
);
export default App;
【讨论】:
你可能想清理一下,这是来自一个干净的 react-app 项目。您还应该将 MyComp 组件重写为钩子,但这应该会给您一个很好的起点。以上是关于JS 代码在我将其粘贴到控制台时有效,但在我的 React 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
R autoplot 在逐行运行时有效,但在 source-ing R 脚本时无效
PHP 需要“guzzle.phar”会引发致命错误,但在页面刷新时有效
创建CCtexture时找不到Spritebuilder文件,但在创建CCsprite时有效?
我在 index.html 中指向 manifest.json 的链接在我运行反应脚本“yarn start”时有效,但在我运行“python3 manage.py runserver”时无效
错误 - ORA-00979: 不是 GROUP BY 表达式,但在我删除 f.film_no AS "Film Number" 时有效