2013-01-03 60 views
0

在文章How to load javascript code to an html fil中有一种方法可以在运行时简单加载外部js并执行。但有两个问题:我们不知道什么时候会执行,我们无法自定义代码。在运行时使用Ajax加载JavaScript

我用这个代码:

var elemScript=document.createElement('script'); 
elemScript.setAttribute('type', 'text/javascript'); 
elemScript.setAttribute('language', 'javascript'); 
var txt = document.createTextNode(result); 
elemScript.appendChild(txt); 
document.head.appendChild(elemScript); 

的HTTP请求,其中结果是由PHP,使定制的代码对我提供的代码内。以上我可以发送一些需要代码的功能等。

但是这个美容在IE8或更旧的版本中不起作用。有没有办法让它工作,或者是时候忘掉这些老导航仪了?

有什么建议吗?

回答

1

编辑:最终解决方案:

IE8及以下不允许用户修改在所有使用的innerHTML,innerText属性,使用appendChild(txtNode),或任何其他类型的DOM操作的脚本代码。执行包含在字符串中的脚本的唯一方法是使用eval。下面的代码已经在Chrome,Firefox,safari,IE9,IE8和IE7中进行了测试。

(function (window, undefined) { 

    var loaded = false; 

    function onScriptLoaded() // executes after external script has loaded 
    { 
     if (loaded) 
      return; 

     // this flag is to prevent versions of ie that do support onload 
     // from executing this function twice 
     loaded = true; 

     // example javascript loaded from php file 
     var phpScriptText = "window.alert('This was added to external script using php');"; 

     // this is the only way for this to work accross all browsers 
     window.eval.call(window, phpScriptText); 
    } 

    window.onload = function() { // load external script and execute onScriptLoaded when it's done loading 
     var doc = window.document; 

     var script = doc.createElement("script"); 
     script.type = "text/javascript"; 
     script.src = "externalScript.js"; 
     script.async = true; 
     script.onload = onScriptLoaded; // works in most browsers 

     // for IE 
     if (script.onreadystatechange !== undefined) { 
      script.timer = setInterval(function() { 
       if (script.readyState == "loaded" || script.readyState == "complete") { 
        onScriptLoaded(); 
        clearInterval(script.timer); 
       } 
      }, 100); 
     } 

     doc.getElementsByTagName("head")[0].appendChild(script); 
    }; 

})(window); 
+0

jQuery适合懒惰的开发人员!给我一些纯粹的JavaScript代码,我们认真说话! – Gustavo

+0

我不确定你的问题......如果你只是想加载一个从PHP文件动态生成的脚本。只需像上面的代码加载一个脚本,并将src设置为php文件,然后让php文件打印出一个ContentType为“application/x-javascript”的javascript代码。 –

+0

我更新了我的答案,让我知道如果这是不是你要找的东西。 –

1

我建议require.js,它将与Vanilla JS/jQuery一起使用。 Here是在页面加载后加载脚本的示例。

此外,您可以使用require.js DomReady插件来更好地控制传统和现代浏览器。

+0

谢谢,这是一个完整的解决方案。但我试图避免一个单一任务的广泛代码,不确定是否可能。 require.js执行很多任务,包括简单的清理器,一些完成IE8 js核心的原型等等。正如他所说,它接缝IE8不会在一个简单的加载器中激发代码 - 我会试着理解这一部分来制作我自己的解决方案。谢谢。 – Gustavo