2016-09-16 7 views
0

年の各日のHTMLドキュメントを含む外部Webサイトがあり、現在の日付のドキュメントを自動的に読み込もうとしています。ただし、すべての文書でURLが一貫していません。それらのうちのいくつかは.htmlで終了し、その他のものは.htmで終わり、そのうちのいくつかはファイル名に1つの文字を追加することがあります。404エラーでJavascriptリダイレクト

私がしたいことは、URLを読み込もうとすることです。その結果、404エラーが発生した場合は、別のURLを読み込んでみてください。

たとえば、私はwindow.location.replace(baseurl+'.htm'); と表示され、404エラーが発生した場合はwindow.location.replace(baseurl+'.html');とし、その結果が404の場合は別の方法を試してみてください。

サーバーが404エラーを送信し、新しいURLを読み込もうとしたときをどのように判断できますか?

+1

実際にリダイレクトする前にXHRを試してみてください。リダイレクトされると、コードの実行が停止し、そのコードについて何もすることができなくなります。 – Siguza

答えて

1

@Siguzaは、非同期要求として保持し、ステータスを検証できると述べています。

AJAXを呼び出す関数を作成し、それがOKかどうかをブール値として返すことをお勧めします。何かのように:使用の

// I'm building an function to validate the URL 
function checkValidURL(url) { 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
    xmlhttp = new XMLHttpRequest(); 
    } else { 
    // code for older browsers 
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    // Callback 
    xmlhttp.onreadystatechange = function() { 
    if (this.status == 200) { 
     return true; // OK 
    } else { // or -> } else if (this.status == 404) { 
     return false; // Ops, something happen.. 
    } 
    }; 
    // AJAX configuration 
    xmlhttp.open("GET", url, false); // <- "false" for a synchronous request 
    xmlhttp.send(); 
} 

簡単な例:Is there any way to wait for AJAX response and halt execution?

+0

これは、AJAXが解決する前に関数が返るため機能しません。 – SchattenJager

+0

更新されました。私のフォルト同期が真です。 – RPichioli

+0

ありがとう、コードが良いように見えますが、Cross-Origin Request Blockedエラーが発生していますので、私のアプローチを再考する必要があります。 – Zarxrax

2

ここでは、拡張子に渡すことができます機能があります:

if (!checkValidURL("http://www.my_url")) { 
    console.log("invalid URL"); 

    // Call or check other URL 
} else { 
    // It's OK, proceed with the business rules 
} 

機能は次のように、非同期 "false" に設定することによって、AJAXリクエストを待つことができます試しに有効な最初のURLをコールバックに返します。

var request = new XMLHttpRequest(); 
var extensions = ['.html', '.htm']; 
var count = 0; 
var baseurl = 'http://blah.com/file'; 

function validUrl(baseurl, cb) { 
    request.open('GET', baseurl + extensions[count], true); 

    request.onreadystatechange = function() { 
    if (request.readyState === 4) { 
     if (request.status === 200) { 
     cb(baseurl + extensions[count]); 
     } else { 
     count++; 
     if (count === extensions.length) { 
      cb(false); 
     } else { 
      validUrl(baseurl, cb); 
     } 
     } 
    } 
    }; 

    request.send(); 
} 

// usage: 

validUrl(baseurl, function(url) { 
    if (url) { 
    // use the valid url 
    } else { 
    console.log('no valid urls'); 
    } 
}); 
+0

これは完璧に動作するように見えますが、私は読ませようとしているサーバからCross-Origin Request Blockedを取得しますそれで、私は他の何かを理解しなければならないでしょう。 – Zarxrax

+0

同じドメインにない場合は、JSONPを使用するか、サーバーにAccess-Control-Allow-Originヘッダーを設定させるか、[その他の方法]を使用する必要があります(http://stackoverflow.com/questions/ 3076414/way-to-circumvent-the-same-origin-policy)を参照してください。 – SchattenJager

関連する問題