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

how to get function arg from external javascript file?

以下代码在一个 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>

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

我假设您正在尝试撕裂位于 .js 文件中的 url。在您的示例中,您希望从 test.js.

中删除 url http://example.com/abc/c4adbeb687f77b48a041d70395803358

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

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

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

alert(test.toSource());

查看其内容。但是,它需要被解析。可以为它编写一个看起来很奇怪的 RegEx 表达式。但是,这里有一个解决方法:

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

这是一个粗糙的解决方法。解析在很大程度上取决于人们如何编写代码。而且,在这个例子中,如果他们使用 " 而不是 ' 那么它就不会正确显示 url。可能还有其他问题,一个好的 RegEx 可以彻底解决问题。

但是,如果您不知道函数名称。而你只想在整个 js 文件中盲目搜索 url(特定或一般),那么我建议最好用 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);

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

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

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

在那种情况下,如果 window 已经打开,您可以这样做

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 名称参数。然后,第二次调用 window.open 时,将 URL 参数留空,仅使用 window 名称参数来获取对现有开放 window... 的引用打开一个新的。

然后,如果你想无处不在地抓取所有传递给window.open的url,有一个劫持方法。这完全取决于你在这里问什么......但 Kroltan 抢在我之前!哈哈!所以检查他的答案。

PT

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