前段时间因为有需要,要在div中加载一个页面。但是以前没做过,不懂。于是到网上查了很多资料都没有相关的东西。后来在前辈的指点下明白了一些,现分亨给大家。
首先一个页面:
sub.html 这个页面我布曙在iis上。路径为http://192.168.1.100:81/sub.html,这个页面里边引用了一个外部js文件。还有两个页面内函数。
<html>
<head>
<mce:script type="text/javascript" src="sub.js" mce_src="sub.js"></mce:script>
<mce:style type="text/css"><!--
.class1{
color:red;
}
--></mce:style><style type="text/css" mce_bogus="1"> .class1{
color:red;
}</style>
</head>
<body>
<div style="border:1px solid black" mce_style="border:1px solid black">
sub.html页面。
<input type="button" value="sub.js里边的sub_js方法。" onclick="sub_js();"/><br/>
<mce:script type="text/javascript"><!--
function page1()
{
alert("page1");
}
function page2()
{
alert("page2");
}
// --></mce:script>
<input type="button" value="page1" class="class1" onclick="page1();"/><br/>
<input type="button" value="page2" style="color:red" mce_style="color:red" onclick="page2();"/>
</div>
</body>
</html>
sub.js文件里边有一个函数:sub_js(){alert("sub_js()");}
然后要加载该页面的div的页面。下边在获取字符串中的js或css文件时,有可能有其它的不符合规定的出现,因此这里可能解析代码不正确,如果你有好的解析方法,就给我指点指点吧。。。
<html>
<head>
<title>parent.html</title>
<mce:script type='text/javascript'
src='/dwr2/dwr/interface/httpContentRead.js'><!--
// --></mce:script>
<mce:script type='text/javascript' src="/dwr2/dwr/engine.js" mce_src="dwr2/dwr/engine.js"><!--
// --></mce:script>
<mce:script type='text/javascript' src="/dwr2/dwr/util.js" mce_src="dwr2/dwr/util.js"><!--
// --></mce:script>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="otherPage">
</div>
<mce:script type="text/javascript"><!--
var page1;//因为要嵌入的页面定义了这两个函数变量,因此这里定义。然后在解析出来的页面中直接赋值给他
var page2;
var url = "http://192.168.1.100:81/sub.html";
var url_parent = "http://192.168.1.100:81/";//url的父路径
function abc(){
//下边使用dwr框架(ajax对java的一个高级框架)进行获取目标页面中的内容。
//当然也可以使用其它框架或纯的ajax,这里只是得到了一个目标页面的内容。
httpContentRead.getContextEncoding(url, "gbk", function(date){
_b(date);
});
}
function _b(d)//处理。
{
getJsUrls(d);//获取页面中的所有js文件及js代码。当然如果有css样式文件的话,也一样要按照获取js文件的方式来获取。
var head = document.getElementsByTagName("head")[0];//获取到的heads对象不管你怎么写都有且仅有一个
for (var i = 0; i < jsUrls.length; i++) {
//创建一个script对象,如果你的目标页面有css引用的话,也要这样来加载
var scriptObj = document.createElement("script");
scriptObj.src = disposeUrl(jsUrls[i]);
scriptObj.type = "text/javascript";
head.appendChild(scriptObj);
}
//对非js文件中的js脚本有点麻烦。
//另外如果目录页面有写在style标记中间的样式,是不能加这样加载的,
var str="";
for(var i=0;i<jsFuns.length;i++)
{
str+=jsFuns[i];
}
eval(str);//先把这些零散的脚本执行。
this.page1=page1;//然后再把这些脚本变量(局部变量)赋值给外边的全局变量
this.page2=page2;
$("otherPage").innerHTML = d;//把得到的页面放到otherPage这个div中。$()这个是dwr框架中定义的一个函数。是查找页面中的控件并返回
}
var jsUrls = new Array();//页面引入的js文件
var jsFuns = new Array();//页面写的独立的js
function getJsUrls(str){//获取指定字符串中的js文件和js函数
str = str.toLowerCase();
var begin = -1;
var end = -1;
var temp = "";
while ((begin = str.indexOf("<script")) >= 0) {
end = str.indexOf("<//script", begin + 7);
temp = str.substring(begin, end);
if (temp.indexOf("src=") >= 0) {//如果有src=的话,则是引入了js文件
jsUrl = temp.substring(temp.indexOf("src=") + 4, temp.indexOf(".js") + 3);//把script
if (jsUrl.indexOf("/"") == 0)//如果获取到的js文件是以引号开头,则去掉它
jsUrl = jsUrl.substring(1);
jsUrls[jsUrls.length] = jsUrl;
}
else {//处理单独写在页面中的js代码
jsFun = temp.substring(temp.indexOf(">") + 1);
jsFuns[jsFuns.length] = jsFun;
}
str = str.substring(end + 9);
}
}
/**
* 处理url。
* 主要是页面中js或css的引用目录可能以以下的方法来书写
* src="http://XXX";src="../XXX";src="./XXX";src="XXX";
* @param {Object} url
*/
function disposeUrl(url){
if ((/^http:////.*$/i).test(url) == false) {
if (url.indexOf("/") == 0) {
urls = url.split("/");//如果url是以应用服务器的应用程序开始这样处理
url = urls[0] + "/" + urls[1] + "/" + urls[2] + url;
}
else //如果是以./或../或直接与页面在同一父目录中,直接接上父路径
url = url_parent + url;
}
return url;//把处理后的url返回
}
abc();
// --></mce:script>
</body>
</html>
这个页面里边使用了dwr来读取目标页面的全部内容(以字符串形势返回,如果不懂dwr的话,可以使用其它ajax技术来得到),下边使用的是dwr框架来读取目标页面内容的java代码。
package sky.dwr;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import org.directwebremoting.annotations.ScriptScope;
import org.directwebremoting.create.NewCreator;
/**
* 得到指定url的页面内容
*
* @author sky
*
*/
// dwr元注释配置
@RemoteProxy(name = "httpContentRead", creator = NewCreator.class, scope = ScriptScope.PAGE)
public class HttpContentRead {
/**
* 根据指定的解码方式得到目标页面的内容。
*
* @param urlStr
* 目标页面的url
* @param encoding
* 指定的解码方式
* @return 返回得到的内容
*/
@RemoteMethod
public String getContextEncoding(String urlStr, String encoding) {
URL url = null;
BufferedReader br = null;
try {
url = new URL(urlStr);// 建立url对象
InputStream is = url.openStream();// 得到一个字节输入流
br = new BufferedReader(new InputStreamReader(is, encoding));// 创建一个BufferedReader对象
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("error");
}
// 读取页面中的内容
String str = null;
StringBuilder sb = new StringBuilder();
try {
while ((str = br.readLine()) != null) {
sb.append(str + "/n");
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("error2");
}
return sb.toString();// 返回得到的内容
}
/**
* 得到页面的内容(默认使用utf-8编码)
*
* @param url
* 要得到内容的页面的url
* @return 返回得到的内容
*/
@RemoteMethod
public String getContext(String url) {
return getContextEncoding(url, "utf-8");
}
}