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);

タイムアウトにより、フレームのコンテンツが呼び出される前にロードするのに十分な時間が与えられますが、問題が発生しているのは、「http」で始まるかどうかについて href プロパティをチェックすることです。私は最初、「foo = foo.toString();」なしでこれを試しました。行、しかし、「Uncaught TypeError: Cannot call method 'search' on null.」の行に沿ってエラーが発生していました。「ああ、紐にしよう!」と思いました。しかし運がない。toString() を呼び出すと、同様のエラーが発生します...「Uncaught TypeError: Cannot call methor 'toString' of null.」

奇妙なことに、セレクターが機能していることを確認するために「alert(foo)」を使用し、href プロパティの値を示す各アンカー タグのポップアップを取得できました。

ここでどこが間違っているのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

2

まず、ブラウザ ウィンドウで JavaScript フレームワークを使用できる場合は、jQuery の .ready http://api.jquery.com/ready/などの DOMReady 関数を使用してそれらを利用します。

また、異なる値を返す .href と .getAttribute('href') を考慮する必要があります。たとえば Chrome では、.href は、リンクをクリックした場合に移動する URL を返します。ただし、.getAttribute('href') は、アンカー タグに実際に含まれているものを返します。これは、相対 URL である可能性があります。

最後に、例外が発生する理由は、href を持たず、純粋に構造的な目的で存在するアンカーがページに存在する可能性があるためです。これらの要素については、次のように .toString() を使用する前に行を挿入できます。

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

continue ステートメントにより、for ループはそのリンクを無視し、そのリンクに href が設定されていない場合はループの次の反復に進みます。

于 2012-08-19T22:04:20.800 に答える