<?php
if($_POST['phone'] != $_POST['orig_phone']){
$phone = "$('input[name='phone']').val('')";
echo $phone;
}
?>
回傳 $phone
$(document).ready(function(){
$('input').on('click',function(){
/*var a = $("input[name='phone']").attr('data-orig-value');
alert(a);*/
$.ajax({
type:"post",
url:"check_list.php",
data:{
phone : $("input[name='phone']").val(),
email : $("input[name='email']").val(),
address : $("input[name='address']").val(),
orig_phone : $("input[name='phone']").attr('data-orig-value'),
orig_email : $("input[name='email']").attr('data-orig-value'),
orig_address : $("input[name='address']").attr('data-orig-value')
},
datatype:'html'
}).done(function(data){
//執行回傳的data
})
});
});
我想要執行這段程式碼,$('input[name='phone']').val(''),利用回傳的data
麻煩各位高手,有甚麼方法可以用 謝謝
直接切入你的問題
frontend.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src = "https://code.jquery.com/jquery-3.4.1.min.js"></script>
<title>Document</title>
</head>
<body>
<input type = "text" name = "phone" data-orig-value = "3345678">
<button type = "button" id = "myBtn">click</button>
</body>
<script>
$('#myBtn').click((e) => {
/*
const phone = $("input[name='phone']").val();
const originalPhone = $("input[name='phone']").attr('data-orig-value');
if (phone !== originalPhone) {
alert('error');
return false;
}
*/
$.ajax({
url: 'backend.php',
type: 'post',
success(res) {
eval(res);
},
error() {
console.log('error');
}
});
});
</script>
</html>
backend.php
<?php
echo "$(\"input[name='phone']\").val('')";
?>
但是 eval() 是個很危險的函數
安全性需要自己注意
如果你只是要檢查兩個數值不同
其實可以直接在前端做
php端在驗證後直接回傳文字即可,如果回應只是簡單的號碼而已
datatype:'text'
}).done(function(data){
alert(data);//看不出來你有沒有撇分號的習慣...雞婆加的
//或
$('input[name='phone']').val(data)
});
//執行回傳的data
認真來說,ajax能回傳的東西就只有json格式跟字串式的格式。
如要能跑字串內的文字當程式運行。只能使用eval。
不過其實不建議用eval的。其原因如下:
安全性問題??不不不,其實javascript本來就是一個開放式的程式碼。光用debug模式就可以跑自已寫的程式來運行,所以使用eval會不安全?其實就算不用本身就不是很安全了。所以用與不用倒也沒差。
主要是效能的問題跟除錯性的問題。大多數來說,非得使用eval的情況下,通常最好再搭配try處理。
但這只是解決除錯的對應問題。
效能問題認真來說。javascript會依情況做加速編輯。可惜eval是不可預期的。所以它不能加速編輯。依網路上查到有關效能的問題來看。同一段字串程式碼。用eval跑跟直接跑。其效能至少快了10倍以上。
回來正題:
其實一般如果不是很特殊不同的做法來說。很少會跟後端請求js的程式碼運行的。
且其實jquery的ajax本身有dataType: "script"的用法。
這樣可以捨去使用eval。
也可用 jquery 的 getScript 來做直接載入js的動作。
如這是我目前的做法
var js_files = "/AjaxJs/"+setjs+"/"+v;
$.getScript(js_files, function() {
console.log('Load Js='+js_files)
});
浩瀚星空大
好奇想問一下
$.getScript() 載入的 js
除了 eval()
還有什麼方式能夠直接執行嗎
在他這個範例的話
我目前只有想到 用 eval() 的方法
$.getScript('backend.php', function(res) {
eval(res);
});
後面的callback是不需要的啦,呼叫$.getScript(url)
就會載入Javascript了。類似功能自己寫也很簡單:
function loadscript(url, cb) {
var ele = document.createElement('script');
ele.src = url;
if(!!cb && 'function' === typeof cb) {
ele.onload = cb;
}
document.body.appendChild(ele);
document.body.removeChild(ele);
}
呵呵!! fillano 已經說明我就不詳說了
抱歉,寫這樣讓你誤會了。
其實後面的backcall,就是在運行完之後可以回傳的東西。
基本跟用ajax一樣。只是這有本身的try處理。
就如fillano大說的。其實 $.getScript(url) 就可以了,跟ajax用法一樣。
fillano
你po的這一段有一段我想跟你確定一下。也就是後續的 removeChild
function loadscript(url, cb) {
var ele = document.createElement('script');
ele.src = url;
if(!!cb && 'function' === typeof cb) {
ele.onload = cb;
}
document.body.appendChild(ele);
document.body.removeChild(ele);
}
其實看到你寫這一段程式突然想起我以前的做法。這是當時還不懂何謂ajax時自已處理的一段程式,但一直面臨一個問題。
就是記憶體不釋放。
當然,我早期的做法就是直接運行輸出php產生的js程式。跟你這一段呼叫script是類同的做法。只缺了最後removeChild處理。
所以會造成網頁放置過久後,就會佔用很大的記憶容量。
時間久了就會網頁崩潰。
所以如果用了removeChild,是否可以解決記憶體不釋放的問題呢?
能否幫我解惑一下。謝謝!
可以釋放的記憶體應該只是DOM的部份,因為像這樣把Javascript載入後,Javascript就在他的執行環境跑,之後跟DOM就沒關聯了。單單只是留在DOM裡面其實沒作用,所以就移掉。
至於Javascript執行佔用的記憶體,用這個方式是無法釋放的。
這樣我就大致上知道了。原本打算簡單處理就好。
看樣子我的想法還是沒辦法簡單實現。
謝啦 fillano大