18

質問:

IE と Firefox / Safari では、BASE HREF と Javascript の window.location タイプのリクエストの処理が異なるようです。まず、これは問題の正確な説明ですか? どうしたの?そして、この状況に対処するための最適なクロスブラウザ ソリューションは何ですか?

環境:

私は小さな PHP フラット ファイル サイトレットを持っています (これは実際にはユーザビリティ テストのプロトタイプです)。

PHP で BASE タグの HREF 値を動的に生成します。つまり、当社のサーバーで実行している場合は次のようになります。

$basehref = 'http://www.example.com/alpha/bravo/UsabilityTest/';

私のローカル開発マシンでは、次のとおりです。

$basehref = 'http://ellen.local/delta/echo/foxtrot/UsabilityTest/';    

タスクの 1 つとして、ユーザー入力を収集し、Javascript で変換を行い、次のようなコードを使用してサーバーに送信します。

function allDone() {
    // elided code for simplicity of stackoverflow question
    var URI = "ProcessUserInput.php?";
    URI = URI + "alphakeys=" + encodeURI( keys.join(",") );
    URI = URI + "&sortedvalues=" + encodeURI( values.join(",") );
    window.location = URI;
}

JavaScript ファイル (関数allDone()を含む) と処理用の PHP スクリプト ( ProcessUserInput.php ) の両方が UsabilityTest のサブディレクトリにあります。つまり、実際の URL は

http://www.example.com/alpha/bravo/UsabilityTest/foxtrot/ProcessUserInput.php 別名_

$basehref . '/foxtrot/ProcessUserInput.php'

問題

IE の JavaScript は基本的に BASE HREF を無視しているようです。JavaScript と PHP プロセッサは同じディレクトリに存在するため、ProcessUserInput.phpの呼び出しは正常に機能します。入力が処理され、すべてが正常に機能します。

しかし、Firefox でテストすると、スクリプトの出力が に送信されるため、JavaScriptBASE HREF を使用しているように見えます

$basehref . '/ProcessUserInput.php'

ProcessUserInput.phpが basehref のサブディレクトリにあるため、これは壊れます。ただし、サブディレクトリ名を JavaScript に追加すると、IE で機能しなくなります。

ソリューション?

これを解決するには、いくつかの方法を考えることができます。

  • Javascript では、BASE タグの HREF プロパティを読み取り、手動でvar URIJavaScript の先頭に追加して、完全に解決された絶対 URL を呼び出します。
  • .jsファイルを PHP で処理し、$basehref変数をスクリプトに挿入する
  • ファイルを移動する
  • 他の何か?

これを解決する他の方法もあるに違いないと確信しています。IE と Firefox が JavaScript で異なる方法で適用する場合、JavaScript で BASE HREF を処理する最良の方法は何ですか?

4

6 に答える 6

7

window.locationの方法を使用するassignのが最も簡単な答えのようです。

それ以外の

window.location = URI;

私はこれを使用しています:

window.location.assign( URI ); 

これは IE と Firefox の両方で正しいことをしています。

于 2009-03-11T21:48:32.263 に答える
6

IE と Firefox / Safari では、BASE HREF と Javascript の window.location タイプのリクエストの処理が異なるようです。

はい、これは Netscape-vs-IE の初期にさかのぼる長年の違いです。

IE は、文書要素が相互作用する時点でのみ base-href を強制します。したがって、createElement('a')relativehrefclick()it* を設定できますが、base-href は無視されます。base-href を含むドキュメントに appendChild すると、機能します。

他のブラウザーでは、base-href はウィンドウごとのグローバルとして取得され、常に適用されます。どちらが正しいですか?未特定のようです。元の JavaScript ドキュメントには、次のようにしか書かれていませんlocation.hash(したがって、location文字列として適用されます)。

完全な URL を表します

したがって、相対 URL に設定すると、未定義の操作のように見えます。

(*: link.click() は IE および Opera でサポートされている非標準のメソッドです)

BASE タグの HREF プロパティを読み取り、手動で前に追加する

もしあなたが <base> を使いたがっているなら、おそらく私はそうするでしょう。

于 2009-03-10T23:11:49.763 に答える
3

window.location ではなく、window.location.pathname を変更したいと思います。window.location は、複数の変数を持つ Location オブジェクトです。その結果、それを変更した場合の影響は明確に定義されていません。ただし、 window.location.pathname は、必要なホストに対する相対パスとして定義されています。

window.location で変更できる多くの変数について詳しく知りたい場合は、こちらを確認してください。Mozilla のドキュメントによると、window.location の変数を変更すると、それらの変更に対応する新しい URL でページがリロードされるはずです。

于 2009-03-10T22:14:39.247 に答える
3

私は今日同じ問題を抱えていました.いくつかの調査の後、私のプロジェクトの要件であるIE9でこの問題をオーバーライドする方法を見つけることができませんでした.簡単なjavascriptで作成してください)。

href = function(url){
    if ($("base").length > 0 ){
        location.href= $("base").attr("href")+url;
    }else{
        location.href = url;
    }
}

そして、変更

location.href= 'emp/start' 

href('emp/start');
于 2014-09-05T09:17:57.067 に答える
2

$('base').attr('href')リンクの前に追加するだけです。(jquery を使用) または

document.getElementBytagname('base').href
于 2012-04-29T22:36:45.063 に答える