Safari form.submit()不做用?


#1

各位先進,有個問題請教。
因爲我想串接綠界金流,因此需要Post 一些值到綠界提供的php api並執行該程序。但Angular 是異步post請求。因此網上查了一個方法就是用Typescript動態建一個表單target=‘_blank’ 開一個tab新視窗並Form.submit()出去即可。 但我在做這件事前會先異步到服務器取得訂單編號,在Next =》裡取得訂單編號後接著調用上述的function(創建表單並送出的動作)。
問題是:我在chome裡沒問題、但在safari 裡submit()始終無法執行送出表單?十分苦腦。需要各位先進的指導非常謝謝🙏。

Ex:
this.api.getorderno().subscribe(
data => {
/這裡執行submit()在safria下不工做/
const myform = document.createElement(‘form’);
Myform.target =‘_blank’;
Myform.method=‘post’;
Myform.action = ‘http://localhost/xxx.php;
const myinput = document.createElement(‘input’);
myinput.type = ‘hidden’;
myinput.name = ‘orderno’;

document.body.appendChild(Myform);
Myform.submit()
/* 就這一行不會被執行。chome裡正常safari就沒反應了,php部份也確定沒有接受到值?*/
}
);

[註]:
如果不寫在subscribe裡就沒問題!


#2

提供另外一種方式打 php 的 api
PHP的 API 好像只吃 x-www-form-urlencoded 這種格式的請求,那下面的 gist 可以參考一下。
不需要動態建立一個 form 做 submit 的行為


#3

謝謝你的回覆、我異步像php取得訂單編號就是這樣的方式。但是綠界的phpapi要在瀏覽器上被執行因爲該php會在跳轉到綠界的付款頁面。
如果用異步的方式就無法跳轉到綠界的付款頁面。

另外:我有增加myform.enctype=‘application/x-www-form-urlEncode’ 還是沒反應😅


#4

你要不要試試看直接放一個隱藏的 form 在畫面上

因為你建立動態的 form 的主要目的應該是為了要準備那些要送回去綠界的欄位

所以一開始就放一個隱藏所有 input 的表單在畫面上,我想這樣做跟你想達成的目的應該是一樣的

<form action="http://paymenturl.a.b.c/" method="post">
  <!-- obj.foo, obj.bar 這些可能是訂單號、或是一些需要計算 Hash 讓綠界驗證的欄位 -->
  <input type="text" [(ngModel)]="obj.foo" />
  <input type="text" [(ngModel)]="obj.bar" />
  <button (click)="submit()">Submit</button>
</form>
export class FooComponent {
   submit() {
     document.forms[0].submit();
   }
}

以你的例子是要拿到訂單號之後再送出

那你就可以把 document.forms[0].submit 搬到你確認拿到訂單號碼之後的語法


不過我之前接的不是綠界,但我想金流界接的方式可能都差不多,你可以再試試看


#5

謝謝你的回覆!但狀況還是一樣。
就是 如果我把document.form[0].sumbit()放在subscribe 裡就會在safari下不執行
ps: Chome瀏覽器是沒問題的
放在其他第方是ok的。

ex:

[註]this.api是異步post到服務器取得訂單編號

this.api.getorderNo().subscribe(
   data => {
       document.form[0].submit();
        /***放在這就會在safari下不工作***/
    }
);

但如果 不是在subscribe()下面就沒問題?
Ex:
Public onSubmit() {
Document.form[0].submit();
/放在這裡或ngOint 或其他第方都可以/