2010-03-07 104 views
1

我用AJAX发送GET数据到另一个file.And在另一个文件我有echo "<script>alert('Something');</script>";。这是动态地使用AJAX显示,即如何使用innerHTML在AJAX中执行包含JS的页面?

var ajaxDisplay = document.getElementById('edit'); 
ajaxDisplay.innerHTML = ajaxRequest.responseText; 

<script>alert('Something');</script>DIV与名编辑。 但它没有提醒任何事情。 如何让它工作?

我混合了html/javascript。 这是代码。

function ajaxFunctions(){ 
    var ajaxRequest; // The variable that makes Ajax possible! 

    try{ 
     // Opera 8.0+, Firefox, Safari 
     ajaxRequest = new XMLHttpRequest(); 
    } catch (e){ 
     // Internet Explorer Browsers 
     try{ 
      ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch (e) { 
      try{ 
       ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch (e){ 
       // Something went wrong 
       alert("Your browser broke!"); 
       return false; 
      } 
     } 
    } 
    // Create a function that will receive data sent from the server 
    ajaxRequest.onreadystatechange = function(){ 
     if(ajaxRequest.readyState == 4){ 
      var ajaxDisplay = document.getElementById('edit'); 
      ajaxDisplay.innerHTML = ajaxRequest.responseText; 
     } 
    } 


    var namef = document.getElementById('nameed').value; 
    var queryString = "?namef=" + namef; 
    ajaxRequest.open("GET", "try.php" + queryString, true); 
    ajaxRequest.send(null); 

} 

也许找到脚本标签和EVAL呢? 但是如何找到脚本的标签?

+1

我重新发布了你的帖子。它跟jQuery没有任何关系:) – 2010-03-07 09:17:27

回答

0

它看起来像设置innerHTML的唯一目的是试图让JS执行。但是一旦页面被加载,JS就不会'知道'它需要分析和执行你改变的新文本,所以你的方法将无法工作。在这种情况下,你想要的是一个回调函数:

http://api.jquery.com/jQuery.ajax/

我没有使用jQuery的,但它看起来像你只需要添加一个“完整的”属性设置对象,你传递给.ajax()调用,如下所示:

$.ajax({ 
    // ...... 

    complete: function(){ 
    alert('Something'); 
    } 

    // ...... 
}); 

在这种情况下,一旦ajax调用完成,就会执行回调函数。如果您需要将代码附加到不同的事件中,您可以选择其他事件,例如成功,失败等等。

+0

我不想使用jQuery.I已经尝试过ii。 – 2010-03-07 09:02:20

+0

啊,我发布之前你编辑过,我假设你正在使用jQuery ajax库。无论如何,我想我误解了这个问题,问题是你不知道你需要执行什么JS代码,直到服务器为你生成它为止?如果可以从服务器接收到有限数量的响应,则可以让服务器返回一个短字符串,然后在处理程序中将其打开 - 如果您需要执行任意JS,我想您可以调用eval()它,但我会非常小心。 – 2010-03-07 09:04:18

+0

它不会是一个商业网站。但如何找到脚本标签并评估它们? – 2010-03-07 09:07:27

1

,而不是试图注入DOM中的脚本元素,只需要你的脚本返回:

alert('Something'); 

然后用eval(response);运行它。或者,您可以添加一个脚本元素,其src属性指向将您的JavaScript返回到<head>(这是首选方法)的页面。

function loadScript(url) { 
    var head = document.getElementsByTagName("head")[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    head.appendChild(script); 
} 

请记住,这不适用于跨域请求 - 脚本必须与运行代码的页面具有相同的来源。为了解决这个问题,你必须使用回调。

+0

它不仅是JS.It是混合html和js – 2010-03-07 09:09:46

+0

我想用replace,但是如何? – 2010-03-07 09:15:35

0

但是如何找到脚本标签?

那么,parent.getElementsByTagName('script')然后评估文本节点里面的data将做到这一点。

但是,插入包含脚本标记的内容是不可靠的,并且在不同浏览器中的工作方式略有不同。例如。 IE首次将脚本节点插入文档中的任何父节点时执行脚本,而Firefox将在第一次将包含脚本的子树添加到文档内的节点时执行脚本。所以如果你不是非常小心,你可以在某些浏览器上执行两次脚本,或者在错误的时间执行脚本,然后进行进一步的页面操作。

所以不要。将要单独执行的脚本返回到任何HTML内容,例如。使用同时包含HTML和JavaScript的JSON对象。

+0

\t ajaxRequest.send(null);我把 var justexit = document.getElementsByTagName('script'); eval(justexit); 但它不再工作? – 2010-03-07 09:32:04

+0

'getElementsByTagName'返回'NodeList'。你必须遍历每个'script'元素内的'Text'节点的'data'列表和'eval'。再次,不要这样做。 – bobince 2010-03-07 10:39:29

相关问题