<script language=javascript>
var NewObj=window.open("");
NewObj.document.write( "<script>alert(1)<\/script>");
</script>
var NewObj=window.open("");
NewObj.document.write( "<script>alert(1)<\/script>");
</script>
解决方案 »
- 有谁知道哪里有这样一个插件?
- CheckboxSelectionModel如何加载
- 问两个函数M和L
- [100分]求同父域下相互通信的问题.data.163.com与www.163.com之间通信
- 怎样写字符间的循环语句?
- JQuery的克隆问题
- iframe中的html页面提交并插入数据库记录的问题
- net_lover(孟子E章)等高手,请问如何控制浏览器的最大化按钮?
- iframe编辑器,如果获取鼠标选择的内容,如果是图片,如果获取图片的src的值
- 求教jqPlot在360极速浏览器兼容模式下的问题
- javascript 2.0有哪个浏览器支持!!???
- 请教如何从下面这段代码中找出数据源究竟在哪里???在线等...
NewObj.document.write( "<script>alert(1)<\/script>");
这样会把原来的html中的内容清除了
var NewObj=window.open("");
var obj=document.createElement("SCRIPT");
obj.text="alert('aaaaaaaaaaa');";
NewObj.document.body.appendChild(obj);
</script>这样试试OK不OK呢?
<script>标签里面的内容在被脚本引擎解析之后再更改时更改内容无效。
引擎解析完脚本的时机大约在 onload函数执行的时候吧。
以前我也尝试过做这样的事情,是很多种方法都不行。
最后只好放弃。
如果你找到实现的方法,可以告知一下。谢谢相对于你的问题,有别的可替代的方法来完成。
找一下 eval 的用法,你可以自己封装函数来处理你需要传过去的脚本。
(包括定时触发,更改事件句柄对应的函数等等)
具体实现就是发挥你的想象力和创造了。
var NewObj=window.open("");
NewObj.document.write( "<script defer>alert(1)<\/script>");
</script>
明天再把理由贴上。下班了,
var NewObj=window.open("a1.html");
//window.setTimeout("NewObj.document.body.insertAdjacentHTML('beforeEnd',' <script language=javascript defer >alert(1000);</s"+"cript>');",1000);
//1.延时是因为要等到a1.html已经load下来才能加内容
//2.在<script之前要加个 的原因见这一贴:http://community.csdn.net/Expert/topic/4130/4130736.xml?temp=.9681818里网友mandolin(Aphelion)的回复</script>
虽然已经有了答案,我还是把自己的东西贴出来,既然已经写了就不要浪费了。
//-----------------------------------------------------------------bb.html ----- start
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY onload="alert('bb is onloaded');">
<TABLE>
<TR>
<TD>bb show</TD>
</TR>
</TABLE>
</BODY>
</HTML>
//-----------------------------------------------------------------bb.html ----- end
//----------------------------------------------------------------aa.html ----- start
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY>
<script language=javascript>
var NewObj=window.open("bb.html");
NewObj.document.write( "<script xxx>alert('inject script run')<\/script>");
NewObj.document.write( "<body onload=\"alert('inject onloaded')\"><\/body>");
//NewObj.document.close();
</script>
</BODY>
</HTML>
//----------------------------------------------------------------aa.html ----- end
第一遍 按照 例子运行
第二遍 请将注释去掉再运行
看看两者的异同共同点:每一次运行的时候 都有 "inject script run"
不同点: 第一次没有 "inject onloaded" 出现原因:(个人通过多次测试后的推断,不一定正确,也有待完善)
脚本程序采用解释方式执行。
因此可以在文件中扫描一行执行一行。
浏览器接收到http的回应报文后,结果是放到一个叫源文件的东西里.
可以假设它与document对象绑定了。
然后浏览器开启一个解析过程,调用脚本引擎逐行扫描该document遇到脚本代码变开始执行,
遇到要显示的东西就交给view对象去处理。
所以在脚本引擎解释脚本的过程中。
如果遇到变量定义就创建一个变量,如果遇到语句就执行语句。
如果遇到html标签,就交给view 来处理,比如在界面画出该标签,登记事件句柄等(只是登记并不一定建立映射关系,这和编译型的代码的严格检查有很大的差别)工作。
对于document对应的源代码中特殊的语句如document.write() 它会执行完document.write()里面的语句得到一个字符串内容并当前的位置把当作是源文件内容处理,
在某种意义上可以理解为"宏".
当源文件扫描完毕时候会隐式调用 document.close()
同时通知view 对象触发onload事件。
当document.close 后,在进行document.write就是写docment绑定的源文件了。并重新对源文件进行解析。但是不知道为什么在别的页面里面对document页面调用 xxx.document.write时候,会终止已在进行的解析过程,
直至xxx.document.close被调用为止,而且xxx.document.close必须被显示调用。
(这是很久以前研究怎么样让别人的网页执行自己的代码串( :( 没有成功 )调试时出来的现象,
其中有一点必须保证open的对象是同一个url下面的,否则对对象的访问会被拒绝,这点信息耗去了偶2天的时间)。
猜测源文件被更改时会被浏览器检测到。并开启一个新的解析过程。
看到答案真的很伤心。以前我也试过 insertAdjacentHTML,没想到 加上个 就可以运行,
更没有想到的是居然有defer这个属性存在。要知道的话我就不走那么多弯路了。
而且以前的基于现象的推测大部分都可以作废了:在 onload之后居然还可以执行代码,虽然靠defer属性指示。