在一些IT博客或者论坛都有在新窗口或标签页直接运行当前页面内代码的功能,但却不是像一些资源网站里的直接预览资源页面。这样动态的运行代码,无疑是节省了很大服务器空间。

前端网(W3Cfuns)就有这样的功能,用户可以直接运行博主笔记内的代码,问答论坛也一样。

查看了一下代码实现,原来是window.open()方法。

语法重温

window.open(URL,name,features,replace)

  • URL 一个可选的字符串,声明了要在新窗口中显示的文档的 URL。如果省略了这个参数,或者它的值是空字符串,那么新窗口就不会显示任何文档。
  • name 一个可选的字符串,该字符串是一个由逗号分隔的特征列表,其中包括数字、字母和下划线,该字符声明了新窗口的名称。这个名称可以用作标记 <a><form> 的属性 target 的值。如果该参数指定了一个已经存在的窗口,那么 open() 方法就不再创建一个新窗口,而只是返回对指定窗口的引用。在这种情况下,features 将被忽略。
  • features 一个可选的字符串,声明了新窗口要显示的标准浏览器的特征。如果省略该参数,新窗口将具有所有标准特征。在窗口特征这个表格中,我们对该字符串的格式进行了详细的说明。
  • replace 一个可选的布尔值。规定了装载到窗口的 URL 是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。支持下面的值:true - URL 替换浏览历史中的当前条目。false - URL 在浏览历史中创建新的条目。

参数1URL省略会打开一个空白页,也就是about:blank页。不过window.open()方法居然是有返回值的,可以返回新页面的window对象。

如此的话,我们就能访问新页面的DOM,自然就可以写入代码了。

实例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>新窗口或标签页运行代码</title>
</head>
<body>
<textarea style="width:600px;height:150px;" id="code">
<script type="text/javascript">
document.write("<h1>我是运行在新窗口或标签页的代码。</h1>");
</script>
</textarea><br>
<button onclick="runCode()">运行代码</button>
<script type="text/javascript">
function runCode() {
var example = window.open('','','');
var code = document.getElementById('code').value;
example.document.write(code)
example.focus();
}
</script>
</body>
</html>