如何从外部JavaScript文件获取函数参数

how to get function arg from external javascript file?

本文关键字:获取 函数 参数 文件 JavaScript 从外部      更新时间:2023-09-26

下面的代码在一个javascript文件中==>测试.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==>测试.html:

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

如果你同时控制了 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()设置!

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

我假设您正在尝试翻录位于.js文件中的网址。在您的示例中,您希望从 test.js 中撕下 url http://example.com/abc/c4adbeb687f77b48a041d70395803358

好吧,在您的示例中,您test.js加载到脚本标记中,如下所示:

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

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

alert(test.toSource());

以查看其内容。但是,需要对其进行解析。人们可以为它写一个看起来很奇怪的正则表达式。但是,这里有一个解决方法:

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

这是一个粗略的解决方法。解析在很大程度上取决于人们如何编写代码。而且,在此示例中,如果他们使用 " 而不是 ',则它将无法正确显示 URL。可能还有其他问题,一个漂亮的正则表达式可以干净利落地将其淘汰。

但是,如果您不知道函数名称。而且您只想盲目地在整个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的任何 URL 的函数参数中出现的第一个 http url。

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

但是,一旦你从javascript

打开一个窗口,你就不能从打开的javascript中访问这个新窗口的内容。跨域违规(同源策略的某种扩展)。但是,您可以更改其指向的位置。而且,抓住它指向的位置,这也可能是你在这里问的。

在这种情况下,如果窗口已经打开,您可以执行此操作

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.open的网址,有一种劫持方法。这一切都取决于你在这里问什么...但克罗尔坦打败了我!哈哈!所以检查他的答案。