执行从jQuery的脚本GET请求
我发送一个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(数据)到一个元素,但我有多个附加,所以这是不实际的。
什么是执行脚本的最简单和最实用的方法?
或者.append
它就像你说的那样,或者使用eval(data)
,但是你不得不摆脱<script></script>
。您可以提供eval()
一段Javascript代码,它将执行该代码。
请注意,使用eval
should be avoided at all costs。
我在这种情况下做了一些疯狂的事情,但你可能认为它是极端的。在我的情况下,我不得不在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.
}
}
看起来像一个非常整齐的那里,我会试试看。 – jidexl21
但是请记住,如果您的参数包含任何类型的函数(如回调函数和其他函数),那么它们将在JSON.stringify上消失以创建base64内容。以避免我使用'JSON.stringify(obj,function(data){})'并通过toString()方法将参数中的函数转换为字符串,并且在JSON.parse上做了同样的处理。 –
基于你的解决方案的一个简单的方法是发送一个json响应和.apply来运行该函数,而且暴露点太多了。我认为这将是OP需要的完美解决方案。但是不要介意解释这个位窗口。[data.fn]。[data.obj] .apply(null,data.args) – jidexl21
最简单的,但*不实用*在你的回应摆脱''