1

我一直在尝试为 Google Chrome 编写我的第一个用户脚本。它检查路由器页面并重新连接,直到获得有效的 IP 地址。

我将脚本保存为 IPchecker.user.js 并通过扩展页面将其安装在 google chrome 中。但是当我刷新页面时,javascript 控制台会抛出一个错误:

Uncaught ReferenceError: wan_connect is not defined 

在这种情况下, wan_connect 是在原始页面上定义的函数:

<html>
<head>
<script type="text/javascript">
    function serv(service, sleep)
    {
     form.submitHidden('service.cgi', { _service: service, _redirect: 'status-overview.asp', _sleep: sleep });
    }
    function wan_connect(wanid)
    {
     if (wanid == "1") {
     serv('wan1link-restart', 5);
     }
     if (wanid == "2") {
     serv('wan2link-restart', 5);
     }
    }

    //All other stuff deleted...

</script>
</head>
<body> Also deleted...</body>
</html>

这是我的脚本。看起来它无法识别原始页面中的功能。有没有办法调用它?

// ==UserScript==  
// @name         WAN checker
// @version      0.0.1
// @description  Check tomato IP addresses and reconnect as needed
// @match        *://192.168.1.1/status-overview.asp
// ==/UserScript== 

(function reconnect() {
    wan1ip = document.getElementById('wanip').getElementsByClassName('content')[0].innerText.split('.').slice(0,2).join('.');

    if (wan1ip != "333.3333") {
    wan_connect("1");
    setTimeout("reconnect()",2000);
    }
    wan2ip = document.getElementById('wan2ip').getElementsByClassName('content')[0].innerText.split('.').slice(0,2).join('.');
if (wan2ip != "333.333") {
    wan_connect("2");
    setTimeout("reconnect()",2000);
    }
})();
4

2 回答 2

2

是的,您可以通过以下几种方式调用该代码:

  1. 将适当的源代码粘贴到您的脚本中。

    或者

  2. 在 iframe 中调用原始页面并从那里调用函数。同域 iframe 更容易,但这也可以跨域完成。

    或者

  3. 用于GM_xmlhttpRequest()抓取原始页面的源代码。从源中提取适当的脚本节点并将该代码注入当前目标页面。

在以前的用户脚本和已经涵盖了所有这些方法。

于 2012-10-12T22:01:57.557 回答
1

不,您不能从另一页调用一个页面上的脚本。您必须在需要使用它的每个页面中包含代码。

有一些用于脚本加载的库(例如 RequireJS)可用于将 JavaScript 中的脚本加载到页面中,但您仍然必须有可用的脚本才能像这样加载。

于 2012-10-12T21:25:40.927 回答