2017-08-11 116 views
1

我发送一个GET请求使用jQuery执行从jQuery的脚本GET请求

$.get("/index.html", /*Adding '?update' to the request*/ "update", 
function (data) {/* Enter code here */}, "html"); 

,其中数据是我的服务器的响应。我发回一个简单的脚本,如alert(),所以'data'变量等于<script> alert("Hello world!") </script>

我需要一种方法来自动执行脚本。我可以.append(数据)到一个元素,但我有多个附加,所以这是不实际的。

什么是执行脚本的最简单和最实用的方法?

+1

最简单的,但*不实用*在你的回应摆脱''

2

我在这种情况下做了一些疯狂的事情,但你可能认为它是极端的。在我的情况下,我不得不在localStorage中存储一些函数,并按历史状态执行它们(当用户前后移动时)。我创建了一个json对象,类似于

{obj:'myObject', fn: 'myfn', args: myArgs} 

然后存储这个数据base64编码。然后当我需要回来,我只是解码的内容和

window.[data.fn].[data.obj].apply(null,data.args)` 

的伎俩不会暴露太多的数据,而不是使用eval。 Eval来自邪恶,所以我会远离。 =)

UPDATE

所以在我的情况下,所有主要的核心职能是在窗口的命名空间类似(而不是实际的内容,但一个样品)

Member = { 
    initialize: function(){ 
      //some process 
    }, 
    render:function(memberId, selector){ 
      //Some process 
    }, 
    //...etc } 

所以,当我存储的每个项目的JSON对象它,我用类似的东西来

var data = {obj: 'Member', fn: 'render', args: [1,'#member-block']} 

然后编码版本将

localStorage.setItem('data', btoa(JSON.stringify(data))); 

dmFyIGRhdGEgPSB7b2JqOiAnTWVtYmVyJywgZm46ICdyZW5kZXInLCBhcmdzOiB7bWVtYmVySWQ6MSwgc2VsZWN0b3I6ICcjbWVtYmVyLWJsb2NrJ319

然后,当我需要再打

var data = JSON.parse(atob(localStorage.getItem('data')); 

会回到我原来的数据对象。由于我的情况下的主要功能是在窗口命名空间。

if (typeof window[data.obj]!=='undefined') { // same as window.Member 
    if (typeof window[data.obj][data.fn]!=='undefined' && typeof window[data.obj][data.fn]!=='function') { // make sure fn is defined and is a function 
      window[data.obj][data.fn].apply(null, data.args); 
      // we pass same arguments to function call with apply. 
      // `apply` will give us option to add arguments dynamically without knowing its size. 
      // it can be null any number of arguments that needed for that function. 
    } 
} 
+0

看起来像一个非常整齐的那里,我会试试看。 – jidexl21

+0

但是请记住,如果您的参数包含任何类型的函数(如回调函数和其他函数),那么它们将在JSON.stringify上消失以创建base64内容。以避免我使用'JSON.stringify(obj,function(data){})'并通过toString()方法将参数中的函数转换为字符串,并且在JSON.parse上做了同样的处理。 –

+0

基于你的解决方案的一个简单的方法是发送一个json响应和.apply来运行该函数,而且暴露点太多了。我认为这将是OP需要的完美解决方案。但是不要介意解释这个位窗口。[data.fn]。[data.obj] .apply(null,data.args) – jidexl21