【问题标题】:Retrieve value from javascript funcion on client click在客户端单击时从 javascript 函数中检索值
【发布时间】:2021-05-22 13:34:25
【问题描述】:

我在 JS 上有一个必须在代码隐藏之前执行的函数,但我无法检索它。 它将返回一个我应该在代码隐藏中使用的变量。我创建的函数是这个:

            <script type="text/javascript" >
                function returnHash() {
                    var checkout = new DirectCheckout('086F7D02A071267FEBF102EB759D9845B8B3333DFA65BC45B807F41A8525AD8D'); /* Em sandbox utilizar o construtor new DirectCheckout('SEU TOKEN PUBLICO', false); */
                    debugger;
                    var month = document.getElementById("txtDataVencUser").value;
                    var year = document.getElementById("txtDataVencUser").value;

                    var cardData = {
                        cardNumber: document.getElementById("txtNumeroCartaoUser").value,
                        holderName: document.getElementById("txtNomeCartaoUser").value,
                        securityCode: document.getElementById("txtCodSegurancaUser").value,
                        expirationMonth: month.substring(0, 2),
                        expirationYear: "20" + year.substring(3, 5)
                    };

                    checkout.getCardHash(cardData, function (cardHash) {
----------------------------> I NEED TO RETRIEVE "cardHash" VALUE IN CODEBEHIND
                    }, function (error) {
                        console.log(error);
                    });
                }
                </script>

我不知道这一步是否正确,但是我正在使用onClientClick尝试在代码隐藏之前执行JS:

<asp:Button ID="btnFinalizarCompraJunoUser" runat="server" Text="FINALIZAR COMPRA" OnClientClick="returnHash()" OnClick="btnFinalizarCompraJunoUser_Click" Visible="true" />

我不知道下一步该做什么,有人可以帮我吗?

【问题讨论】:

  • 一个常见的做法是设置一个隐藏的表单字段值,以便它与表单一起发布到服务器。
  • 看起来getCardHash 有一个类似承诺的签名,您可以在其中确认“成功”和“失败”回调。如果是这种情况,那么您可能会遇到此函数在等待“成功”回调之前完成的问题。我不知道OnClientClick是否支持async-functions,但如果支持,你可以尝试重写该函数以使用await
  • @Stanislas,我对 javascript 很陌生,我应该在哪里声明 await 运算符?

标签: javascript c# asp.net ajax web-site-project


【解决方案1】:

有很多方法 - 可能和冰淇淋的口味一样多。

但是,既然您要根据点击运行“代码隐藏”存根?

我会在页面上放置一个隐藏字段,然后在 js 中设置该值

所以就在您的按钮下方 - 添加一个隐藏字段,如下所示:

<form id="form1" runat="server">
        <br />

    <asp:Button ID="Button1" runat="server" Text="Button" 
        OnClientClick="myfun();return true" Width="68px"
        ClientIDMode="Static"/>

     <asp:HiddenField ID="HiddenField1" runat="server" ClientIDMode="Static" />

  </form>

<script type="text/javascript">

function myfun() {
    // do whatever - walk the dog - have fun!!!

    var f1 = document.getElementById("HiddenField1");
    f1.value = "2222";
}
</script>

所以在上面我只是将 2222 推入 hidden1 字段。

现在,在按钮存根后面的代码中,您可以这样做:

 Debug.Print("my click f1 = " & HiddenField1.Value);

所以后面的代码现在将有一个很好的旧的常规平面简控件来查看并获得有问题的值。

所以,这取决于有多少值 - 但是使用友好 (asp.net) 控件背后的代码并使用 js 客户端代码设置值可能是这里最省力的工作。

我当然也为上述使用了“staticID”。如果您出于某种原因不喜欢(或不想)在上面使用 staticID,那么 js 选择将是:

 var f1 = document.getElementById("<%=HiddenField1.Clientid%>");
 f1.value = cardHash;

【讨论】:

  • 出于某种原因,如果我在按钮中实际执行 onclickclient 之前触发您的回答,它会起作用!但是如果我在 onClientClick 中使用它,隐藏字段总是返回空,知道吗?
  • js 代码是异步的吗?在这种情况下,这将是对例程 getCardHash 的调用?如果那段代码是异步编写的,那么当您调用它时,它不会等待,因此您的按钮事件代码将触发。您可以通过在 js 代码中使用 console.log(cardhash) 来尝试/查看是否是这种情况。这就像使用 jQuery 对话框代替说 alert() 或 confirm() 一样。 alert()/confirm() 暂停 js 代码,您做出选择,代码继续运行(因此您可以使用说 alert/confirm 在 OnClientClick() 事件中返回 true 或 false。
  • 你不能使用 jQuery.UI 对话框来根据用户点击“ok”或“cancel”来返回 true 或 false,因为 jQuery(以及大多数库小部件,包括引导对话框)不会停止代码。所以你不能弹出那个对话框,等待响应然后让代码继续。您只能弹出对话框,并且基于说用户点击确定按钮或取消按钮可以运行 + 在您的代码中启动另一个小例程,当它命中时,或者另一个小 js 例程,当点击取消时 - 但代码它自己因此不等待。因此,如果调用不等待,您当然不能设置像 cardHash 这样的变量。
  • 因此,在您获取/调用 cardHash 之后立即执行 console.log 并查看浏览器在浏览器调试器 (f12) 中吐出的内容。这将在 30 秒内为您提供并告诉您这个答案。如果是(异步),那么您将摆脱 onClientClick 事件。放入新按钮并调用 getCardHas 然后将现有按钮抓取到 js var 中,然后执行 var.click() 来触发原始按钮。就像 jQuery 对话框一样,您将其拆分为两个例程,因为对对话框的调用(或在您的情况下为 getCard 例程)不会等待 - 代码可能是异步的。
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2011-10-10
相关资源
最近更新 更多