1

Web ページで奇妙な問題が発生しています。href に添付された JavaScript は問題なく呼び出され、呼び出された JavaScript 関数がコールバック関数を含むステートメントを追加すると動作を停止します。その場合、href から呼び出された JS func の最初のステートメントとして配置されたアラートでさえ発生しません。

以下に例を示します。以下は問題なく機能します。

このリンクをクリックすると

<a href = "#" onclick="getMyPosition(); return false;">refresh</a>,

次の js func は正常に呼び出され、getMyPosition() が実行されたことを示す両方のアラート メッセージが表示されます。注: 現時点では (つまり、js が機能しているように見える場合)、コールバック関数 (「handleposition」) は定義されていませんが、エラーは発生しませんそれ自体が奇妙です:)

function getMyPosition() { 
  alert("it worked 1.");
  if ( navigator.geolocation )
  {
    alert("it worked 2.");
    navigator.geolocation.getCurrentPosition(handlePosition, handleError, {
    enabledHighAccuracy: true,
    maximumAge: 60000,
    timeout:    30000
    });
  }
}

ここで、スクリプト ブロックに次の関数を追加すると、すべてが機能しなくなり、更新リンクがクリックされたように見えます。Web ページの他のすべて (他のアイテムに関連付けられた JavaScript イベントなどを含む) は正常に動作し続けるため、ページの JavaSctipt は正常に動作していると思います。このリンクだけで、onClick イベントで定義された func の呼び出しが停止します。

次のコールバック関数を追加すると、「更新」リンクがクリックされていないかのように動作します。

function handlePosition(pos)
{
  alert(pos.coords.latitude);
  alert(pos.coords.longitude);
  window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";
}

この関数を削除すると、上記の href リンクが再び機能し始め、getMyPosition が呼び出され、アラート メッセージが再び表示されます。ページにスクリプト エラーは表示されません。IE 11 と Chrome の両方でこの動作が見られます。私はWindows 7 32ビットマシンを使用しています。

4

3 に答える 3

1
window.location.href = "/map?js=y&amp;lat=pos.coords.latitude&amp;lon=pos.coords.longitude";

おそらく次のようになります。

window.location.href = "/map?js=y&lat=" + pos.coords.latitude + "&lon=" + pos.coords.longitude;
于 2014-01-02T20:26:57.153 に答える
1

おそらく最大の問題は、ジオロケーション コールバックのエラー ハンドラが欠落していたことです。F12 経由で Chrome のデバッガーを起動すると、すぐに問題が明らかになりました。

エラー ハンドラを追加すると問題が解決したように見えましたが、途中で他のいくつかのことを整理しました。これが機能していることを示すフィドルです

すべてのブラウザで機能するようにリンクをコーディングする方法は次のとおりです。

<a href="#" onclick="return(getMyPosition())">refresh</a>

そして、これはハンドル位置と新しい handleError ルーチンの修正された JS コードです。

メイン関数に「return false」が追加されていることに注意してください。

function getMyPosition() {
    alert("it worked 1.");
    if (navigator.geolocation) {
        alert("it worked 2.");
        navigator.geolocation.getCurrentPosition(handlePosition, handleError, {
            enabledHighAccuracy: true,
            maximumAge: 60000,
            timeout: 30000
        });
    }
    return false;
}

function handlePosition(pos) {
    alert(pos.coords.latitude);
    alert(pos.coords.longitude);
    window.location.href = "/map?js=y&amp;lat=" + pos.coords.latitude + "&amp;lon=" + pos.coords.longitude;
}

function handleError(error) {
    alert(error);
}
于 2014-01-02T21:01:32.497 に答える