众说周知 A页面使用AJAX的xmlHttp 异步调用另外一个页面B,
是把B页的前端代码(包括HTML,CSS,JS等)是以字符串的形式存储在data里
所以在A页面中显示的结果是HTML 但是JS等不体现也不执行
请问 怎么样才能使 A页面调用B页面的似乎 也执行其中的JS代码呢?
依照ext的做法,先提取返回值中的js代码(包括和<script>2种),针对的情况,用
[code="java"]
var s = document.createElement('');<br> s.setAttribute('type',"text/script");<br> s.setAttribute('src',"***");<br> var hd = document.getElementsByTagName('head')[0];<br> hd.appendChild(s);<br> [/code]<br> 来执行.<br> 针对<script>script的情况,用
[code="java"]
window.execScript(script);//script为中包含的js代码.
或者用eval(script);来执行
[/code]
来执行.
另附Ext源码:
[code="java"]
update : function(html, loadScripts, callback){
if(typeof html == "undefined"){
html = "";
}
if(loadScripts !== true){
this.dom.innerHTML = html;
if(typeof callback == "function"){
callback();
}
return this;
}
var id = Ext.id();
var dom = this.dom;
html += '<span id="' + id + '"></span>';
E.onAvailable(id, function(){
var hd = document.getElementsByTagName("head")[0];
var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
var typeRe = /\stype=([\'\"])(.*?)\1/i;
var match;
while(match = re.exec(html)){
var attrs = match[1];
var srcMatch = attrs ? attrs.match(srcRe) : false;
if(srcMatch && srcMatch[2]){
var s = document.createElement("script");
s.src = srcMatch[2];
var typeMatch = attrs.match(typeRe);
if(typeMatch && typeMatch[2]){
s.type = typeMatch[2];
}
hd.appendChild(s);
}else if(match[2] && match[2].length > 0){
if(window.execScript) {
window.execScript(match[2]);
} else {
window.eval(match[2]);
}
}
}
var el = document.getElementById(id);
if(el){Ext.removeNode(el);}
if(typeof callback == "function"){
callback();
}
});
dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");
return this;
},
[/code]
A调用B的时候,是无法调用到B中的方法的,这点是不用怀疑的.
只能让B页面自动执行一些需要在调用的时候执行的函数,并且用一个标识判断该不该执行这些方法:
[b]B.htm[/b][code="js"]
window.onload=function(){
var strParam=location.search.substring(1);//获取传递过来的url参数.即?后面的字符串.
if(strParam=="true"){
//执行需要其它页面进行调用执行的JS代码.
...
...
}
}[/code]
在A.htm中发送数据的时候,以这种形式:[code="js"]xmlHttp.open("POST","B.htm?true",false);//传一个true到B.htm页面,告诉B页面执行部分代码.
xmlHttp.send();[/code]