动态添加的JavaScript未在Safari& IE

时间:2011-01-15 19:10:53

标签: javascript ajax safari

我无法执行动态加载并插入页面的javascript块。这是加载(简化)的代码:

<p>i am html-code</p>

<script type="text/javascript">
 alert("i'm here");
</script>

这段代码注入了这个Mootools命令:

new Element('div', {
  'class': 'foo'+item_data[id].contenttype,
  'id': '123',
  'html': code
}).inject($('presentation'));

(变量代码包含第一个代码片段。)

在Firefox中,这有效。调用inject命令时,将显示段落并执行javascript。在IE和Safari中,只显示段落。

任何暗示如何在没有'eval'的情况下解决这个问题? Thx提前。

2 个答案:

答案 0 :(得分:1)

这是处理它的一种方式的短article

潜在的问题是IE&amp; Safari不评估&lt; SCRIPT&gt;默认加载后的DOM节点;这可以说是一种安全功能。

修复它的基本技巧是你必须把它写成一个函数,并设置要在onload事件上评估的函数;这可以保证代码得到评估。

窃取在文章的例子之后,代码看起来像

var script = document.createElement('script');
script.setAttribute('src','myjavascriptfile.js');
script.setAttribute('type','text/javascript');
var loaded = false;
var loadFunction = function()
{
  if (loaded) return;
  loaded=true;
  // your code goes here
  alert("I'm here!");
};
script.onload = loadFunction;
script.onreadystatechange = loadFunction;

<强>更新

听起来你在这里有几个变量。尝试简化一点 - 而不是依赖于MooTools,制作一个简单的基本HTML页面,然后将代码放入其中。

以下是一个例子:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
  <meta http-equiv='content-type' content='text/html; charset=utf-8' />

  <title>Trial</title>
  <meta name='generator' content='BBEdit 9.6' />
  <script type="text/javascript">
  //<![CDATA[
  var script = document.createElement('script');
  script.setAttribute('src','myjavascriptfile.js');
  script.setAttribute('type','text/javascript');
  var loaded = false;
  var loadFunction = function(){
    if (loaded) return;
    loaded=true;
    // your code goes here
    alert("I'm here!");
  };
  script.onload = loadFunction;
  script.onreadystatechange = loadFunction;
  //]]>
  </script>
</head>

<body>
</body>
</html>

这是干净整洁的代码,应该适用于最神经质的可接受的浏览器,以及IE。假设你有一个javascript源文件加载为myjavascriptfile.js,它应该可以工作。

然后我建议将其用作myjavascriptfile.js开头:

// myjavascriptfile.jx
alert("My java script has loaded YAY!!");

答案 1 :(得分:0)

我意识到这是4年之后,但最近我遇到了同样的问题。

回到几个Mootools版本(3.x,4.x和5.x),addEvent为我工作:

new Element('script', {
    src: 'myscript.js',
    async: true
}).addEvent('load', myFunc).inject(document.getElement('body'), 'top');

我发现的一件事是脚本加载和内容执行之间的延迟。

你可以在onLoad方法中添加一个延迟,或者在加载的JS中触发一个偶数并听取它:

window.addEvent('myscripEvent', myFunc);

new Element('script', {
    src: 'myscript.js',
    async: true
}).inject(document.getElement('body'), 'top');

然后在myscript.js:

/* my code here */

window.fireEvent('myscripEvent');