`

解决innerHTML包含的js代码不能被执行的问题

阅读更多
   今天我写了个js弹出模态对话框,这个模态对话框能直接显示一个html或者是url的文本内容,因为加入我需要在对话框里面显示比较复杂的布局的话直接用字符串来做是很麻烦且很难修改的。各方面都比较完善了,但是今天,在我想用这个对话框加载一个页面的时候发现了新问题。

在我的要加载的页面里面有和用户的交互过程,这是用js实现的,我把这个页面加载到我的模态对话框里面,页面显示完全正确,可是在测试交互功能的时候发现js没有响应。我用firebug插件查看,发现里面是有这段js代码的,但怎么执行不了呢。

于是我将这段js代码写在了调用模态对话框的页面,这样交互功能恢复正常了。原来使用innerHTML获得的js代码是不能被执行的,js只有在页面初次加载的时候才有效。

网上有很多种解决的方法,有用iframe实现的,有通过浏览器的特性实现的,但这些都通通不是我喜爱的方法,要我使用iframe,那还不如我把这个问题放着,每次都把被加载页面的js拷贝到调用页面算了。

不过还是找到了一个比较完美的方法,这个方法不仅没有使用限制,而且还是跨浏览器的。我需要的就是这样的代码。有时候发现要在网上找到好的代码简直比登天还难,因为大部分都是copy的,你可以看到一篇不知所云的垃圾文章被copy了好多份。同样你也可以看到好多精品文章被copy了好多份而找不到出处。不过话说回来,自己写文章确实需要很大的耐心,要写一篇别人都能看懂的文章起码需要40分钟,不然你就是在制造垃圾。所以看到好的文章注明出处是一种美德。这篇文章的出处是 http://jcodecraeer.com/a/jquery_js_ajaxjishu/2012/0625/278.html 谢谢转载,可以不带链接但别破坏了我的代码格式,不然别人没法看啊。

说正题。这个方法只需调用一个函数set_innerHTML(obj_id, html, time);

set_innerHTML('要插入innerhtml的ID名称', '要插入的代码');time参数可以忽略,我急于实现功能就没去看实现的细节了。

以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* innerhtml.js
* Version: 1.9
* LastModified: 2006-06-04
* This library is free. You can redistribute it and/or modify it.
*
*/
var global_html_pool = [];
var global_script_pool = [];
var global_script_src_pool = [];
var global_lock_pool = [];
var innerhtml_lock = null;
var document_buffer = "";
function set_innerHTML(obj_id, html, time) {
if (innerhtml_lock == null) {
innerhtml_lock = obj_id;
}
else if (typeof(time) == "undefined") {
global_lock_pool[obj_id + "_html"] = html;
window.setTimeout("set_innerHTML('" + obj_id + "', global_lock_pool['" + obj_id + "_html']);", 10);
return;
}
else if (innerhtml_lock != obj_id) {
global_lock_pool[obj_id + "_html"] = html;
window.setTimeout("set_innerHTML('" + obj_id + "', global_lock_pool['" + obj_id + "_html'], " + time + ");", 10);
return;
}
function get_script_id() {
return "script_" + (new Date()).getTime().toString(36)
+ Math.floor(Math.random() * 100000000).toString(36);
}
document_buffer = "";
document.write = function (str) {
document_buffer += str;
}
document.writeln = function (str) {
document_buffer += str + "\n";
}
global_html_pool = [];
var scripts = [];
html = html.split(/<\/script>/i);
for (var i = 0; i < html.length; i++) {
global_html_pool[i] = html[i].replace(/<script[\s\S]*$/ig, "");
scripts[i] = {text: '', src: '' };
scripts[i].text = html[i].substr(global_html_pool[i].length);
scripts[i].src = scripts[i].text.substr(0, scripts[i].text.indexOf('>') + 1);
scripts[i].src = scripts[i].src.match(/src\s*=\s*(\"([^\"]*)\"|\'([^\']*)\'|([^\s]*)[\s>])/i);
if (scripts[i].src) {
if (scripts[i].src[2]) {
scripts[i].src = scripts[i].src[2];
}
else if (scripts[i].src[3]) {
scripts[i].src = scripts[i].src[3];
}
else if (scripts[i].src[4]) {
scripts[i].src = scripts[i].src[4];
}
else {
scripts[i].src = "";
}
scripts[i].text = "";
}
else {
scripts[i].src = "";
scripts[i].text = scripts[i].text.substr(scripts[i].text.indexOf('>') + 1);
scripts[i].text = scripts[i].text.replace(/^\s*<\!--\s*/g, "");
}
}
var s;
if (typeof(time) == "undefined") {
s = 0;
}
else {
s = time;
}
var script, add_script, remove_script;
for (var i = 0; i < scripts.length; i++) {
var add_html = "document_buffer += global_html_pool[" + i + "];\n";
add_html += "document.getElementById('" + obj_id + "').innerHTML = document_buffer;\n";
script = document.createElement("script");
if (scripts[i].src) {
script.src = scripts[i].src;
if (typeof(global_script_src_pool[script.src]) == "undefined") {
global_script_src_pool[script.src] = true;
s += 2000;
}
else {
s += 10;
}
}
else {
script.text = scripts[i].text;
s += 10;
}
script.defer = true;
script.type = "text/javascript";
script.id = get_script_id();
global_script_pool[script.id] = script;
add_script = add_html;
add_script += "document.getElementsByTagName('head').item(0)";
add_script += ".appendChild(global_script_pool['" + script.id + "']);\n";
window.setTimeout(add_script, s);
remove_script = "document.getElementsByTagName('head').item(0)";
remove_script += ".removeChild(document.getElementById('" + script.id + "'));\n";
remove_script += "delete global_script_pool['" + script.id + "'];\n";
window.setTimeout(remove_script, s + 10000);
}
var end_script = "if (document_buffer.match(/<\\/script>/i)) {\n";
end_script += "set_innerHTML('" + obj_id + "', document_buffer, " + s + ");\n";
end_script += "}\n";
end_script += "else {\n";
end_script += "document.getElementById('" + obj_id + "').innerHTML = document_buffer;\n";
end_script += "innerhtml_lock = null;\n";
end_script += "}";
window.setTimeout(end_script, s);
}

有了这个方法,原来这样写

1
document.getElementById("sch_nameArea").innerHTML= text;

的地方就可以写成这样

1
set_innerHTML('sch_nameArea',text);

值得注意的是,这个代码用到了一些全局变量,

1
2
3
4
5
6
var global_html_pool = [];
var global_script_pool = [];
var global_script_src_pool = [];
var global_lock_pool = [];
var innerhtml_lock = null;
var document_buffer = "";

至少你应该尽可能的避免和这些全局变量冲突。决绝全局变量冲突的良策貌似是使用闭包,最近正在学习这些概念,如果你是一个严谨的人,我觉得有必要重写这段代码,让它更灵活和稳定。

最后向写这段代码的济南大学马秉尧老师致敬!

分享到:
评论

相关推荐

    关于在innerHTML中JS不执行的问题

    然而,有时候我们在使用`innerHTML`插入包含JavaScript代码的HTML时,会发现这些脚本并没有像预期那样执行。这个问题主要涉及到浏览器的安全机制和DOM解析过程。 首先,我们需要理解`innerHTML`的工作原理。当设置...

    解决ajax返回innerHTML中javascript不能运行问题

    解决 Ajax 返回 innerHTML 中 ...解决 Ajax 返回 innerHTML 中 JavaScript 不能运行问题的关键是将 JavaScript 代码从 Ajax 返回的数据中提取出来,并将其添加到 `&lt;head&gt;` 中,让浏览器能够正确地解析和执行。

    关于JS和html代码的执行先后问题

    在给定的文件`temp.js`中,我们可以预想它可能包含了用于操作HTML元素的JavaScript代码。为了确保这些代码能够正确执行,我们需要考虑脚本是否正确地插入到HTML中,以及是否使用了`async`或`defer`属性。 另一方面...

    innerHtml(转)

    尽管不能直接访问提供的博客链接,上述内容是基于对`innerHTML`常见讨论的推测。在实际编程中,理解并有效使用`innerHTML`对于构建交互式和动态的Web应用至关重要。通过学习如何适当地操作DOM,可以提升网页的用户...

    让插入到 innerHTML 中的 script 跑起来的代码第1/2页

    这种方式需要处理脚本的文本内容,确保它们作为JavaScript代码执行。 通过以上步骤,我们可以确保无论是在IE还是其他浏览器中,`innerHTML`插入的`&lt;script&gt;`脚本都能被正确执行。这种方法虽然需要更多的代码和处理...

    摘取不能复制代码.txt

    2. **在地址栏中执行代码**:将给定的 JavaScript 代码 `javascript:document.writeln(document.body.innerHTML)` 复制并粘贴到浏览器的地址栏中,然后按 Enter 键执行。 3. **查看结果**:执行后,当前页面会被覆盖...

    输入数量和价格自动计算输出金额的js代码

    如果需要测试外部引入的JavaScript代码,往往需要刷新页面或者直接在控制台中输入代码执行。 6. 知识点整合:将上述知识点结合起来,我们可以构思一个简单的网页表单,其中包含两个输入字段供用户分别输入"数量"和...

    绝对漂亮的JS代码js源码

    JavaScript,简称JS,是一种轻量级的解释型编程语言,广泛应用于网页和网络应用开发,特别是在前端开发领域中,JS代码被用来实现交互性、动态效果以及数据处理。本压缩包“超强js代码”中包含的JS源码,无疑是为了...

    100个常用js代码

    "100个常用js代码"这个主题涵盖了一系列实用的JavaScript代码片段,旨在帮助开发者提升工作效率,解决日常编程中遇到的问题。下面将详细解析这些知识点: 1. **DOM操作**:JavaScript可以操作文档对象模型(DOM),...

    100个可以直接拿来用的javaScript代码

    本文将围绕“100个可以直接拿来用的JavaScript代码”这一主题,详细阐述其中可能涵盖的常见JavaScript知识点,以及它们在实际开发中的应用。 1. **变量与数据类型**:JavaScript支持var、let和const声明变量,以及...

    超实用Javascript代码

    本压缩包“超实用的JavaScript代码”旨在为初学者提供一系列实用的代码示例,帮助他们快速理解和掌握JavaScript的基础及进阶技巧。 1. **基础语法** JavaScript的基础包括变量声明(`var`, `let`, `const`),数据...

    HTML,JAVASCRIPT代码编辑器

    开发者可以在编辑器中编写代码,编辑器会立即解析并执行这些代码,展示在浏览器窗口中,这样可以快速检查语法错误或设计问题。例如,你可以输入HTML结构,然后添加JavaScript代码来改变某个元素的颜色或者动态加载...

    站长常用200个js代码

    "站长常用200个js代码"集合了诸多实用的JavaScript代码片段,这些代码对于网站管理员(站长)来说尤其有用,能够帮助他们更高效地构建和维护网站。 1. **页面交互**:JS可以实现丰富的页面交互效果,如按钮点击响应...

    JavaScript源代码的简单实时代码编辑器.zip

    这个压缩包包含了一个基于JavaScript实现的轻量级代码编辑器项目,其核心特点在于实时反馈,使得学习者能够迅速看到代码更改后的影响,从而加深对编程概念的理解。 1. **实时编辑器的工作原理**: 实时代码编辑器的...

    javascript特效代码(最新)

    本文将详细解析"javascript特效代码(最新)"中的关键知识点,包括但不限于特效实现、代码规范和最佳实践。 首先,JavaScript特效代码是网页设计中提升用户体验的关键。这些特效可能涵盖滑动面板、滚动动画、图像...

    js代码示例.rar

    JavaScript,简称JS,是一种广泛应用于Web开发的轻量级编程语言。它主要负责网页的动态交互,赋予静态HTML页面活力。本压缩包“js代码示例.rar”包含了一系列基础到进阶的JS应用实例,共计九十多个,涵盖了下拉列表...

    jQueryPost页面不能刷新

    然而,当遇到"jQueryPost页面不能刷新"的问题时,这通常意味着在使用`$.post`函数时存在错误,导致页面无法正常刷新或数据更新不成功。根据提供的描述和部分代码,我们可以分析并解决这个问题。 首先,让我们看看...

    城市选择js代码

    这些元素可以通过ID或者类名被JavaScript代码选中并操作。 ```html &lt;select id="province"&gt;&lt;/select&gt; &lt;select id="city"&gt;&lt;/select&gt; ``` 3. **初始化**:利用JavaScript将数据填充到HTML元素中,当页面加载完成后...

    IE中关于使用innerHTML加入HTML代码的问题

    当你尝试在IE中执行上述代码时,浏览器会报错,但错误信息可能不会明确指出问题出在innerHTML。为了解决这个问题,IE提供了innerText属性作为替代。innerText允许设置或获取元素的纯文本内容,而不是HTML。因此,...

    经典漂浮广告JS 代码 经过测试直接可用~~~

    在网页设计和开发中,漂浮广告是一种常见的广告展示方式,它通过JavaScript(JS)实现,可以在用户浏览页面时保持在屏幕的特定位置持续显示。本文将深入探讨漂浮广告JS的相关知识点,以及如何创建和应用这样的代码。...

Global site tag (gtag.js) - Google Analytics