31009


window.openした画面が閉じた場合に画面を遷移させようとしています。  
JSファイルの中で以下のように実装するとFireFoxでは画面遷移可能だったのですが、Chromeで試すと画面遷移できませんでした。  
ステップ実行でおってみると、下記の部分は実行されるのですが「location.href」の値が変わっていませんでした。

[code]

    location.href = "遷移画面";
    
[/code]

よくわからないまま下記のような処理に代わると画面が遷移できることを確認できました。

[code]

    setTimeout(function(){
        location.href = "遷移画面";
    }, 3000);
    
[/code]

location.hrefは非同期処理なのでしょうか？  
通常location.href = "遷移画面";このような形で画面遷移させるのは問題なのでしょうか？


CC BY-SA 3.0
2016-12-06T03:10:42.147
30941
2017-01-30T15:23:47.437
2016-12-08T04:09:30.250
3054
12842
question
javascript google-chrome
unload などのイベントハンドラ内で location.href による画面遷移が出来ない


下記の Chrome
のバグは現在修正されています（<https://bugs.chromium.org/p/chromium/issues/detail?id=660496#c29>）。  
問題が再現されなくなったのを確認しました（Google Chrome 56.0.2924.76）。  
2017/01/30

* * *

### 本題

Chrome のバグだと思います。  
それらしきバグ報告がありました（<https://bugs.chromium.org/p/chromium/issues/detail?id=660496>）。  
下記のようなコードで確認しましたが、`unload` や `beforeunload` のイベントハンドラ内では、確かに `window.location`
による移動が出来ませんでした。

[code]

    function open_win(){
        let win = window.open(window.location.href);
        win.addEventListener("unload", (ev)=>{
            window.location.assign("http://ja.stackoverflow.com/");
        });
    }
    
[/code]

### `location.href` への代入による移動

> 通常 `location.href = "遷移画面";`このような形で画面遷移させるのは問題なのでしょうか？

動くはずですが、[仕様](https://www.w3.org/TR/html5/browsers.html#the-location-
interface)には見当たらないので、

[code]

    location.assign("http://example.com/");
    // あるいは
    location = "http://example.com/";
    
[/code]

の方がよいかも知れません。

### 非同期か

> `location.href`は非同期処理なのでしょうか？

仕様は理解していませんが、非同期です。  
ブラウザが移動の準備を終えた後、JavaScript の実行中でない（イベントを受けつける）タイミングで実際にページを移動します。

[code]

    function assign_test(){
     window.location.assign("http://ja.stackoverflow.com/");
     window.msg.textContent = "Moving...";
     setInterval(()=>window.msg.textContent+=".", 10);
    }
[/code]

[code]

    <button onClick="assign_test();">Assign</button>
    <p id="msg"></p>
[/code]


CC BY-SA 3.0
2016-12-08T04:05:33.437
31009
2017-01-30T15:23:47.437
2017-01-30T15:23:47.437
3054
3054
30941
answer


Firefox のバグです。  
仕様上、unload ハンドラ内でページ遷移を起こすことはできません。

<https://html.spec.whatwg.org/multipage/browsers.html#navigate>  
`location.href` への代入でナビゲーション処理が始まりますが、既にアンロードアルゴリズム実行中なのでステップ3で中止となります。


CC BY-SA 3.0
2016-12-08T05:32:53.410
31012
2016-12-08T08:22:48.853
2016-12-08T08:22:48.853
3475
3475
30941
answer