0

我正在处理一个通过 CGI 系统动态生成的页面,该网站的真正开发人员没有时间为我更改 python 代码。也就是说,我被迫构建页面(相同域)并使用一些 JavaScript 来修改其内容......现在,我正在尝试找到包含 URL 的锚标记并将目标属性设置为“_top” . 这样,打开菜单等的页面上的锚点被加载到框架中,并且指向场外的任何内容都被加载到整个窗口中。这是我尝试过的:

function pointOutside(){
    var anchorS = window.frames[0].document.getElementsByTagName("a");
    for(i=0;i<anchorS.length;i++){
        var foo = anchorS[i].getAttribute('href');
        foo = foo.toString();
        if(foo.search(/http/i) != -1){
            anchorS[i].setAttribute('target','_top');
        };
    };
};
setTimeout("pointOutside()",2000);

超时使框架的内容在被调用之前有足够的时间加载,但我遇到麻烦的地方是检查 href 属性是否以“http”开头。我最初在没有“foo = foo.toString();”的情况下尝试了这个 行,但出现“未捕获的类型错误:无法在 null 上调用方法‘搜索’”的错误。我心想,“啊哈,我会确保它是一个字符串!” 但没有运气。现在,当我调用 toString() 时,我遇到了类似的错误...“未捕获的 TypeError:无法调用方法‘toString’ of null。”

奇怪的是,为了确保我的选择器正常工作,我使用了“alert(foo)”,并且能够为每个锚标记获取一个弹出窗口,显示 href 属性的值。

不知道我要去哪里错了。任何帮助将非常感激。

4

1 回答 1

2

首先,如果您在该浏览器窗口中有任何可用的 javascript 框架,请通过使用 DOMReady 函数(如 jQuery 的 .ready http://api.jquery.com/ready/)来利用它们

此外,您需要考虑 .href 和 .getAttribute('href') 返回不同的值。例如,在 Chrome 中,.href 会返回您单击链接时将导航到的 url。.getAttribute('href') 但是返回锚标签中的实际内容,这可能是一个相对 url。

最后,您得到异常的原因是页面上可能有一些锚点没有 href 并且纯粹出于结构目的。对于这些元素,您可以在尝试使用 .toString() 之前插入一行,如下所示:

if (typeof foo !== "string") { continue; }

如果未在该链接上设置 href,则 continue 语句会导致 for 循环忽略该链接并继续循环的下一次迭代。

于 2012-08-19T22:04:20.800 回答