iT邦幫忙

0

AJAX回傳值 執行回傳的值

<?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
麻煩各位高手,有甚麼方法可以用 謝謝

柯柯 iT邦新手 5 級 ‧ 2019-07-10 11:33:51 檢舉
如果是要檢查文字是不是相同的話
```
function(){
phone = $("input[name='phone']").val();
orig_phone = $("input[name='phone']").data('data-orig-value');
if(phone != orig_phone ){
$('input[name='phone']').val('');
}
}
```
這樣就可以了
除非是要去跟資料庫的資料作動態事件
不然單純的檢查input框內容 再JS比對就可以了
2
dragonH
iT邦大師 1 級 ‧ 2019-07-09 20:51:22

直接切入你的問題

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() 是個很危險的函數

安全性需要自己注意

如果你只是要檢查兩個數值不同

其實可以直接在前端做

豬豬人 iT邦新手 5 級 ‧ 2019-07-09 21:00:02 檢舉

因為我是要做非同步的驗證,click當初是設想使用者點及其他位置(不是按鈕),所以才會用ajax。

想請問\這個是什麼意思。
新手學習中
謝謝

dragonH iT邦大師 1 級 ‧ 2019-07-09 21:01:30 檢舉

你前面那段我看不懂 /images/emoticon/emoticon13.gif

你可以把 \ 拿掉看發生什麼事就知道了

參考

小魚 iT邦大師 1 級 ‧ 2019-07-10 08:21:02 檢舉

你在input做這件事有點怪,
這範圍太大了吧...

0
japhenchen
iT邦新手 1 級 ‧ 2019-07-10 08:15:34

php端在驗證後直接回傳文字即可,如果回應只是簡單的號碼而已

                    datatype:'text'
                }).done(function(data){
                        alert(data);//看不出來你有沒有撇分號的習慣...雞婆加的
                        //或
                        $('input[name='phone']').val(data)
                    }); 
                    //執行回傳的data
1
浩瀚星空
iT邦大師 1 級 ‧ 2019-07-10 10:33:48

認真來說,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)
});
看更多先前的回應...收起先前的回應...
dragonH iT邦大師 1 級 ‧ 2019-07-10 10:57:17 檢舉

浩瀚星空

好奇想問一下

$.getScript() 載入的 js

除了 eval()

還有什麼方式能夠直接執行嗎

在他這個範例的話

我目前只有想到 用 eval() 的方法

$.getScript('backend.php', function(res) {
  eval(res);
});

/images/emoticon/emoticon41.gif

fillano iT邦超人 1 級 ‧ 2019-07-10 11:17:28 檢舉

後面的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);
}
dragonH iT邦大師 1 級 ‧ 2019-07-10 11:32:42 檢舉

喔喔

原來如此

我還以為 $.getScript() 只是去 fetch js 而已

感謝 fillano大 開示

/images/emoticon/emoticon41.gif

呵呵!! 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,是否可以解決記憶體不釋放的問題呢?
能否幫我解惑一下。謝謝!

fillano iT邦超人 1 級 ‧ 2019-07-10 14:18:23 檢舉

可以釋放的記憶體應該只是DOM的部份,因為像這樣把Javascript載入後,Javascript就在他的執行環境跑,之後跟DOM就沒關聯了。單單只是留在DOM裡面其實沒作用,所以就移掉。

至於Javascript執行佔用的記憶體,用這個方式是無法釋放的。

這樣我就大致上知道了。原本打算簡單處理就好。
看樣子我的想法還是沒辦法簡單實現。

謝啦 fillano大

我要發表回答

立即登入回答