JavaScript奇技淫巧:操控URL
本文展示两种不常见的JS编程技巧:实现操控浏览器窗口,更改父窗口和子窗口的URL地址。
修改父窗口URL
当使用window.open()打开一个窗口,可以用window.opener属性获得父窗口并可修改URL!
比如A页面有以下html代码:
<html>
<button target="_blank" onclick="window.open('b.html')">打开B页面</button>
<html>
代码功能是点击链接时打开B.html页面
在B.html中又有如下代码:
<html>
<script>
setTimeout(function(){
window.opener.location.replace('https://www.jshaman.com');
},2000);
</script>
</html>
如此,当从A页面点击链接打开B页面后,A是B的父页面、B是A的子页面。当B页面打开时,其中的js代码,会修改A页面的URL,使A页面跳转到其它网址。实现了:从子页面修改父窗口的URL地址!
如果不希望被人查看JS源码从而得知实现原理,可对关键的JS代码进行加密。
比如:
window.opener.location.replace('https://www.jshaman.com')
这句JS代码,用JShaman混淆加密,可成为:
window['\x6f\x70\x65\x6e\x65\x72']['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x72\x65\x70\x6c\x61\x63\x65']("\u0068\u0074\u0074\u0070\u0073\u003a\u002f\u002f\u0061\u0062\u0063\u002e\u0063\u006f\u006d");
或成为:
var _0x51ad=["97.125.125.121.122.51.38.38.104.107.106.39.106.102.100."];function _0x164d(str,dy_key){dy_key=9;var i,k,str2="";k=str.split(".");for(i=0;i<k.length-1;i++){str2+=String.fromCharCode(k[i]^dy_key);}return str2;}window['\x6f\x70\x65\x6e\x65\x72']['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x72\x65\x70\x6c\x61\x63\x65'](_0x164d(_0x51ad[0]));
甚至成为:
这样,他人则无法从JS源码中理解代码的功能原理。
修改子页面URL
代码如下:
<html>
<a href="https://www.baidu.com" target="jshaman.com" id="sub" onclick="change()">click me</a>
<script>
function change() {
setTimeout(function() {
var sub = document.getElementById("sub");
if(sub){
sub.href="http://www.jshaman.com/";
sub.click();
sub.id = "";
}
}, 2000);
}
</script>
</html>
技术原理
点击打开链接后,新的页面即是此页面的子页面。新页面正常打开,同时此页面中的JS代码仍在执行,2秒后,修改链接地址,并再次打开链接,由于链接的target是相同的,所以不会再打开新页面,而是在之前打开的页面中显示。如此,实现了在父窗口中修改子页面URL,与之前的在子窗口中修改父页面URL正好相反。