繁体   English   中英

动态添加的javascript无法在Safari和IE中执行

[英]Dynamically added javascript not executed in Safari & IE

我在执行动态加载并插入页面的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中,仅显示该段落。

有什么提示可以在没有“评估”的情况下如何解决这个问题? 提前谢谢。

这是一篇很好的简短文章,介绍了一种处理方法。

潜在的问题是,默认情况下,IE和Safari在加载<SCRIPT> 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>

那是干净的Tidy版本代码,应该可以在大多数神经质的可接受浏览器以及IE上运行。 假设您有一个javascript源文件要作为myjavascriptfile.js加载,它应该可以工作。

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

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

我知道这是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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM