我无法执行动态加载并插入页面的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提前。
答案 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');