簡體   English   中英

從AJAX Success解析字符串以作為JQuery運行

[英]Parse string from AJAX Success to run as JQuery

在我的HTML頁面上,我有一個AJAX帖子來獲取一些數據。 返回的數據包含一個字符串,該字符串的內容為原始javascript。

$.ajax({
    url: '@Url.Action("GetPropertyDataForInstance", "Local_Data")',
    type: 'POST',
    dataType: 'json',
    data: instancePropertyRequest,
    contentType: 'application/json; charset=utf-8',
    success: function (response) {

        var javscriptRawString = response.javascriptToExecute;   
        var alertString = response.data;
    }
})

javscriptRawString的內容:

alert(alertString);

得到此javascriptRawString之后,該怎么做才能直接在其中執行javascript?

這比eval稍好一點,因為eval是邪惡的;)

(new Function(response.data))()

使用eval是邪惡的,因為可能有很多安全漏洞。 您正在全局范圍內執行代碼。 Function通過在其自己的范圍內執行來采取不同的處理方式。

new Function也更快

在你的情況下

$.ajax({
    url: '@Url.Action("GetPropertyDataForInstance", "Local_Data")',
    type: 'POST',
    dataType: 'json',
    data: instancePropertyRequest,
    contentType: 'application/json; charset=utf-8',
    success: function (response) {

        (new Function(response.data))()   

    }
})

new Function從原始文本創建一個新函數。

()()立即執行功能

如果您使用ajax獲得功能,我還將添加一些額外的檢查和標頭。 檢查一下。

https://stackoverflow.com/a/17468822/2450730

編輯

如果你想通過ajax傳遞參數

//raw ajax response
var x='param';
alert(x)

如果您想從ajax內部傳遞參數(不好)。

success: function (response) {
 var x='param';
 (new Function(response.data))(x)   
}

生的

alert(x);

編輯2

如果您使用1.腳本2.參數

那么您需要定義一個參數名稱。在本例中為“ x”。

js

 (new Function('x',response.script))(response.param)

RAW response.script

 alert(x)

更多參數:

(new Function('a','b','c','alert(a+b+c)'))(1,2,3) // 123

測試它 ... http://jsfiddle.net/pLQzd/ 閱讀它 ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function滾動到底部。

但是當您從同一ajax調用中獲得包含函數和vars的對象時

我只會創建已經描述過的東西。

生的

var param='hello';
alert(param);

甚至更簡單

alert('hello');

您可以通過eval運行任何字符串:

eval('alert("hello world")');

確保您確實知道自己在逃避什么。

為什么不使用整數格式化ajax響應?

例如

$.ajax({
    //Your AJAX
}).done(function(response) {
    //Let's say response from the script is 1.

    switch(response) {
        case 1:
            alert('Hello world');
            break;

        //case ... etc.
    }

});

永遠不要使用eval(); 除非您別無選擇。

評估===邪惡!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM