我正在從事學術 php/javascript 網路專案,但遇到了一些問題。在這個專案的架構中,資料總是使用“隱藏表單”通過 POST 發送到服務器。此表單由以下函式構建:
function crearform(name, method){
var formu = document.createElement('form');
document.body.appendChild(formu);
formu.name = name;
formu.method = method;
formu.action = 'index.php';
}
function insertacampo(form ,name, value){
formulario = form;
var input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
formulario.appendChild(input);
}
function enviaform(form){
form.submit();
}
一個例子使用:
<a class="btn-get-started i18n-cancelar" id="btn-cancel" type="button" onclick="
crearform('formenviar','post');
insertacampo(document.formenviar,'document_id', '<?php echo $this->document['document_id'] ?>');
insertacampo(document.formenviar,'controller','ImpDoc');
insertacampo(document.formenviar,'action','show');
enviaform(document.formenviar);">
Return
</a>
這作業得很好!但是在下一步中,我添加了一個堆疊,以便應用程式可以存盤收到的所有 POST。通過這種方式,對于回傳操作,我只需要獲取堆疊的最后一個 POST 并且我已經有了引數 'controller'、'action' ... availables。
而且……問題來了。存盤在堆疊上的最后一個 POST 可以通過 php 變數訪問。
var_dump 輸出:上次存盤的 POST
array(2) { ["controller"]=> string(6) "Portal" ["action"]=> string(8) "_default" }
我創建了一個 javascript 函式,它接收帶有 POST 值的陣列并將它們添加到“隱藏表單”中。
function multiple_addfield(form, params) {
for(let key in params) {
let input = document.createElement('input');
input.type = 'hidden';
input.name = key;
input.value = params[key];
form.appendChild(input);
}
}
并構建了這樣的表單:
<a class="btn-get-started i18n-back" type="button" onclick="
crearform('formenviar','post');
multiple_addfield(document.formenviar, <?php echo json_encode($this->previousShow); ?>);
enviaform(document.formenviar);">
Volver
</a>
But when I click on the button it doesn′t work. In the firefox console I receive this error:
Uncaught SyntaxError: missing ) after argument list
And in the chrome console:
Uncaught SyntaxError: Unexpected end of input
Inspecting the button element in Chrome:
<a class="btn-get-started i18n-back" type="button" onclick="
crearform('formenviar','post');
multiple_addfield(document.formenviar, {" controller":"portal","action":"_default"});="" enviaform(document.formenviar);"="">Volver</a>
Someone could help me?
Thanks!!
uj5u.com熱心網友回復:
B"H
嗨,這似乎是混合 php 和 JavaScript 以及 HTML 屬性內容的問題,一般來說,在處理許多不同的因素時,最好一次測驗一件事以確定錯誤在哪里
例如,您現在正在嘗試測驗一個 JavaScript 函式,但不是僅在屬性文本中測驗它,而是從服務器生成的代碼中測驗它,也許首先使用您可以自己撰寫的基本 JavaScript 對其進行測驗以確保 Javascript 正常作業,然后如果所以,嘗試從屬性中手動呼叫相同的代碼,看看它是否有效,如果有效,然后嘗試將服務器代碼輸出到靜態文本,然后手動復制并嘗試將其輸入到函式中,然后如果所有這些個體步驟作業,如果你把它放在一起還是不行,至少你知道所有的單個部分都很好,問題只是放在一起
在這種情況下
<a class="btn-get-started i18n-back" type="button" onclick="
crearform('formenviar','post');
multiple_addfield(document.formenviar, {" controller":"portal","action":"_default"});="" enviaform(document.formenviar);"="">Volver</a>
只是無效的html,因為它在其他雙引號中包含雙引號而沒有被轉義,這很難判斷它是否都是直接從服務器生成并放置在屬性中
簡單來說,不要將 php 代碼輸出到行內 JavaScript 中,而是嘗試將 php 輸出到一個 JavaScript 變數中,該變數將在單獨的腳本標記中定義,一旦完成,您可以在行內中簡單地參考該 JavaScript 變數JavaScript,或者更好的是,只需在腳本標簽中創建一個完全自定義的函式,然后將 onclick 設定為該函式的名稱
因此,例如在服務器端,您可以在某處添加
<script>
var serverResponse = `<?php echo json_encode($this->previousShow); ?>`
//As a string to be safe, in case there was a problem encoding the JSON on the server side, then parse it manually (can do custom try catch here as well)
var parsed={}
try{parsed=JSON.parse(serverResponse)}
catch(e){}
function clickify (){
crearform('formenviar','post');
multiple_addfield(document.formenviar, parsed)
}
</Script>
<a class="btn-get-started i18n-back" type="button" onclick="clickify">Volver</a>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/354658.html
標籤:javascript php arrays json
