如何从外部javascript文件获取函数arg?

时间:2015-01-29 18:03:36

标签: javascript html dom

下面的代码在一个javascript文件中 ==> test.js:

function test(){    window.open('http://example.com/abc/c4adbeb687f77b48a041d70395803358','','toolbar=yes,statusbar=yes,location=yes,menubar=yes,scrollbars=yes,resizable=no,fullscreen=yes');}

如何从具有以下结构的html文件中获取http://example.com/abc/c4adbeb687f77b48a041d70395803358 ==>的test.html:

    <script type="text/javascript" src="test.js"></script>
<script>
alert(window.open.value);
</script>

2 个答案:

答案 0 :(得分:1)

如果您可以控制HTML和JS,则可以截取window.open函数:

<script>
var oldWindowOpen = window.open;
var windowOpenArgs = [];
window.open = function() {
    windowOpenArgs = arguments;
    oldWindowOpen.call(window, arguments);
};
</script>
<script type="text/javascript" src="test.js"></script>
<script>
window.open = oldWindowOpen;
// do stuf with variable windowOpenArgs
console.log(windowOpenArgs[0]); //the url
</script>

你可以通过抛出和捕获错误来找到堆栈跟踪并仅在调用来自特定函数时记录参数,从而获得更高级,但这一切都取决于脚本的性质:

window.open = function() {
    try { throw new Error(); } except(e) {
        var stack = e.stack;
        if (/test@.*?test.js:/.test(stack)) {
            windowOpenArgs = arguments;
        }
    }
}

但请注意,只有在执行 test()后才能设置变量!

答案 1 :(得分:0)

你的问题对我来说似乎有点不清楚。

我认为你试图翻录位于.js文件中的网址。在您的示例中,您希望将网址http://example.com/abc/c4adbeb687f77b48a041d70395803358test.js中删除。

嗯,在您的示例中,您在脚本标记中加载了test.js,如此处所示:

<script type="text/javascript" src="test.js"></script>

因此,如果您知道具有url数据的函数的名称。你可以简单地说:

alert(test.toSource());

查看其内容。但是,它需要进行解析。人们可以为它编写一个奇怪的RegEx表达式。但是,这是一个解决方法:

alert("http"+test.toSource().split("http")[1].split("',")[0]);

这是一个粗略的解决方法。解析很大程度上取决于人们如何编写代码。而且,在此示例中,如果他们使用"而不是',那么它将无法正确显示网址。可能还有其他问题,一个不错的RegEx可能会彻底击败它。

但是,如果您不知道函数名称。而你只是想盲目地在整个js文件中搜索网址(具体或一般),然后我建议最好用XMLHttpRequest加载它。我猜你也可以使用HttpRequest,从不调查它。

var sUrl = "test.js";
var httpRequest = new XMLHttpRequest();
httpRequest.open("GET",sUrl, true);
httpRequest.onreadystatechange = function() {
            if (httpRequest.readyState == 4 && httpRequest.status == 200) { // ok
                alert ( "http"+httpRequest.responseText.split("http")[1].split("',")[0] );
            } else if ( httpRequest.readyState == 4 && httpRequest.status != 200  ) {
                // failed
            }   
        };
httpRequest.send(null);

该混乱应显示一个警告框,其中包含放入sUrl的任何网址的函数参数中的第一个显示的http网址。

如果你想要更多...那么这意味着更多的解析。但你可以从这里存储它来做任何事情。

但是,一旦你从javascript打开一个窗口,你就无法从开放的javascript中访问这个新窗口的内容。跨域违规 (Same Origin Policy的某种扩展)。但是,您可以改变其指向的位置。并且,抓住它指向的位置,这也可能是你在这里要求的。

在这种情况下,如果窗口已经打开,你可以这样做

var w = window.open("http:\\example.com"); // some time before
alert(w.location);

但是,如果你刚打开它。像上面一样。它可能是about:blank,因为它还没有加载。在这种情况下,您将不得不在以后查找..例如:

window.open("http:\\example.com", "MyName");
setTimeout('var w = window.open(,"MyName"); alert(w.location);', 1000);

在这里,您必须使用window.open的窗口名称参数。然后,第二次调用window.open时,将URL参数留空,仅使用window name参数获取对现有打开窗口的引用...而不是打开一个新窗口。

然后,如果你想无处不在地抓住所有传递给window.open的网址,就会有一种劫持方法。这一切都取决于你在这里的要求......但是Kroltan打败了我!大声笑!所以检查一下他的答案。

PT