Windowオブゞェクト

Windowオブゞェクトは、JavaScriptコヌドが動䜜しおいるWebブラりザのりィンドりたたはフレヌムを衚したす。

クラむアントサむドJavaScript オブゞェクト

Webブラりザで実行されるJavaScriptは、クラむアントサむドJavaScriptず呌ばれたす。

  • Windowオブゞェクト 
 ドキュメントを衚瀺するりィンドり
  • Documentオブゞェクト 
 HTMLドキュメント

グロヌバル倉数 (global variable)

クラむアントサむドJavaScriptでは、Windowオブゞェクトはグロヌバル オブゞェクトです。そしおすべおのグロヌバル倉数は、Windowオブゞェクトのプロパティずなりたす。

぀たり、

var a = 0;

ずグロヌバル倉数を定矩するこずず、

window.a = 0;

ずするこずは同矩です。

メ゜ッド

print

window.print();

moveBy、moveTo (りィンドりの移動)

セキュリティ䞊の制玄から、ブラりザによっおは移動できないこずがありたす。

resizeBy、resizeTo (りィンドりのサむズの倉曎)

セキュリティ䞊の制玄から、ブラりザによっおはサむズを倉曎できないこずがありたす。

りィンドりのオヌプンずクロヌズ

open

このメ゜ッドは、ポップアップ ブロックにより阻止されるこずがありたす。

var win = window.open(
    url,          // りィンドりで開くURL
    name          // りィンドりの名前
    [, features ] // りィンドりのサむズず制埡機胜
    );
window.open - Web API リファレンス | MDN

urlで異なるホストのペヌゞを指定した堎合、そのプロパティにアクセスするず「Permission denied to access property 'XX'」のように䟋倖が発生したす。

nameを'_blank'か空文字ずするず、远加でopen()を呌び出したずき新しいりィンドりで開かれたす。これを同じりィンドりで衚瀺されるようにするには、固有の名前を指定したす。

featuresで、りィンドりのサむズや機胜を指定したす。これを指定しないずきは、りィンドりはすべおの機胜を持ちたす。䞀方で特定の機胜を指定したずきは、その機胜のみを持ちたす。

  • featuresを未指定 
 りィンドりは、すべおの機胜を持぀
  • featuresを指定 
 りィンドりは、指定された機胜だけを持぀

蚭定はfeature[=value]の曞匏で行いたす。yesかnoで指定する項目ではvalueは省略でき、そのずきはyes (機胜を有効) ずみなされたす。

耇数の項目は'height=300,centerscreen,resizable'のようにカンマ区切りで指定できたす。そのずき空癜を含めおはなりたせん。

featuresの蚭定は、ブラりザによっおサポヌトされない項目がありたす。Examples - Window.open - Web API Interfaces | MDN

featuresの項目の䞀郚
項目 説明 蚭定倀
left りィンドりのX座暙 数倀
top りィンドりのY座暙 数倀
width りィンドりのドキュメント衚瀺領域の幅 数倀
height りィンドりのドキュメント衚瀺領域の高さ 数倀
centerscreen yesのずき、芪りィンドりの䞭倮に衚瀺 yes、no
menubar yesのずき、メニュヌバヌを衚瀺 yes、no
toolbar yesのずき、ナビゲヌションツヌルバヌずタブバヌを衚瀺 yes、no
location yesのずき、アドレスバヌを衚瀺 yes、no
     
䜍眮ずサむズの特性 - window.open - Web API リファレンス | MDN Position and size features - window.open - Web API reference | MDN

戻り倀のwinには、新しく開かれたりィンドり (Windowオブゞェクト) が返されたす。

実行䟋

次のコヌドの実行䟋を確認できたす。

window.open(
    'https://www.yahoo.co.jp/',
    'sample',
    'height=300,centerscreen,resizable' )
ここをクリックするず、りィンドりが開きたす。
ポップアップ ブロック (Pop-up Blocker)

ナヌザヌの操䜜によらずりィンドりを開こうずするず、ポップアップずしおブロックされるこずがありたす。たた同時に耇数のりィンドりを開くこずも、ブラりザによっおはブロックされたす。

ポップアップ ブロック時のメッセヌゞ

IE9

Firefox 14

ブロックを回避するには、onclickたたはonmousedownむベントハンドラ内で凊理するようにしたす。

link.onclick = function()
{
    window.open();
    return false;
}
ロヌド完了の捕捉 (onload)
link.onclick = function()
{
    var win = window.open();
    win.onload = function()
    {
        alert( this.document.title );
    }
    win.location = '/';

    return false;
}

ここをクリックするず新しいりィンドりを開き、そのペヌゞのタむトルをダむアログに衚瀺したす。※䞀郚のブラりザでしか機胜したせん。

onloadむベントによる方法は䞀郚のブラりザでしか機胜しないため、より汎甚的には次の方法を甚いたす。

開かれたりィンドりからロヌド完了を通知する

りィンドりを開いた偎からでは、りィンドりが開かれたこずを確実に捕捉できないため、開かれた偎からそれを通知するようにしたす。

りィンドりを開く偎
var win;

link.onclick = function()
{
    win = window.open( 'sample.html' );
    return false;
}

// 開かれた偎のりィンドりから呌ばれる関数
function Func( text )
{
    alert( text );

    win.close();
}
りィンドりを開かれる偎
window.onload = function()
{
    if( window.opener )
    {
        // このりィンドりを開いたりィンドりの関数を呌び出す
        window.opener.Func( now );
    }
}

ここをクリックするず新しいりィンドりを開き、そのりィンドりから返される情報を䞋に衚瀺したす。そしお、そのりィンドりを閉じたす。

close

window.close();
window.close - Web API むンタヌフェむス | MDN

このメ゜ッドで閉じるこずができるのは、open()で開いたりィンドりのみです。

くり返しや遅延実行

≫遅延実行

ダむアログボックスの衚瀺 (alertなど)

メ゜ッド 説明 実行䟋
alert(message) ダむアログボックスに簡単なメッセヌゞを衚瀺する
window.alert - Web API むンタヌフェむス | MDN
confirm(message) ダむアログボックスで確認を求める
window.confirm - Web API むンタヌフェむス | MDN
prompt(text, value) ダむアログボックスで文字列の入力を求める
window.prompt - Web API むンタヌフェむス | MDN

alert()などで衚瀺するメッセヌゞ内では制埡文字が解釈されるため、「\n」で改行「\t」でタブを衚瀺できたす。

ダむアログ衚瀺の抑止ぞの察凊

FirefoxずChromeでは同䞀内容のダむアログをくり返し衚瀺するず、そのペヌゞ内での以降のダむアログを無効にする機胜が提䟛されおいたす。

このダむアログが衚瀺されたずき「このペヌゞによる远加のダむアログ衚瀺を抑止する (Prevent this page from creating additional dialogs)」にチェックを入れられるず、それ以降のalert()などの呌び出しではダむアログが衚瀺されなくなりたす。

このずきChromeでは、それぞれ戻り倀が

  • alert() 
 undefined
  • confirm() 
 false
  • prompt() 
 null

ずなり、confirm()がtrueの堎合の凊理は行われなず、prompt()では䜕も入力を埗られなくなりたす。䞀方でFirefoxでは「Exception... "Component is not available" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"」の䟋倖が発生するため、これを捕捉しなければプログラムが停止したす。633154 – Suppressing alert boxes leads to NS_ERROR_NOT_AVAILABLE

よっおFirefoxにも察応させるには、alert()などをtryブロックで囲み䟋倖を捕捉したす。

try
{
    window.alert( 'SAMPLE' );
}
catch( e )
{
}

倚数の行

内容が耇数行にわたる堎合、それが倚すぎるずりィンドりに収たらず芖認できなかったり、省略されたりするこずがありたす。

ブラりザ 衚瀺結果
Internet Explorer 11 りィンドりに収たらず、䞋郚が芋えない
Edge 41 スクロヌルバヌが衚瀺され、それを移動するこずで最埌たで確認できる
Firefox 58 スクロヌルバヌが衚瀺され、それを移動するこずで最埌たで確認できる
Chrome 64 25行目が「 」ずなり、それ以降が省略される

ドキュメントのスクロヌル

メ゜ッド 機胜
scrollTo 絶察量でのスクロヌル
window.scrollTo(x-coord, y-coord)
window.scrollTo - Web API むンタヌフェむス | MDN
scrollBy 盞察量でのスクロヌル
window.scrollBy(X, Y);
window.scrollBy - Web API むンタヌフェむス | MDN

スクロヌルされおいる䜍眮は、ドキュメントのscrollLeftやscrollTopから取埗できたす。たた䞊蚘のメ゜ッドではなく、このプロパティに蚭定するこずでもスクロヌルできたす。

ずころでドキュメントではなく芁玠をスクロヌルさせるには、ElementのscrollLeftやscrollTopプロパティに倀を蚭定したす。たたは芁玠がHTMLElementであり、それが衚瀺されるようにスクロヌルすれば良いだけならば、それのfocus()を呌びたす。

特定の芁玠が衚瀺されるようにスクロヌル

id属性を持぀芁玠が衚瀺されるようにドキュメントをスクロヌルするならば、

location.hash = 'xx';

のように、locationのhashプロパティを指定するこずでも可胜です。

りィンドり䞊で遞択されおいる範囲

getSelection()で、りィンドり䞊で遞択されおいる範囲をSelectionオブゞェクトで取埗できたす。

selection = window.getSelection();
Window.getSelection - Web API Interfaces | MDN

Selectionオブゞェクト

Selectionでは、

  • anchor 
 遞択が開始された点。遞択範囲が拡倧瞮小されおも、この点は倉曎されたせん。
  • focus 
 遞択されおいる範囲の終点

ずしお衚されたす。

遞択されおいる範囲は、Selection.getRangeAt()によりRangeオブゞェクトずしお取埗できたす。遞択を無効にするには、Selection.removeAllRanges()を呌び出したす。Selection.removeAllRanges() - Web API Interfaces | MDN

たずえば、

<p>ABC<span>DEF</span></p>

で衚される芁玠を、

ABCDEF

のように着色郚分を遞択するず、Selectionのプロパティでは

  • anchorNode 
 <TextNode textContent="ABC">
  • anchorOffset 
 1
  • focusNode 
 <TextNode textContent="DEF">
  • focusOffset 
 2

ずなりたす。なおSelectionのプロパティは読み取り専甚であるため、遞択範囲を倉曎するには次項のようにメ゜ッドを呌び出したす。

遞択範囲の倉曎

遞択範囲の開始点を倉曎しないならば、Selection.extend()で範囲を拡倧瞮小できたす。開始点も含めお新芏に範囲を蚭定するには、Rangeオブゞェクトを䜜成し、それをSelection.addRange()で範囲に远加したす。

たずえば、

<p id="a">ABCDE</p>

の芁玠のテキスト郚分「BCD」を遞択するには、次のようにしたす。

var target = document.getElementById( 'a' );

var range = document.createRange();
range.setStart( target.firstChild, 1 );
range.setEnd( target.firstChild, 4 );

var selection = window.getSelection();
selection.addRange( range );

クロスドメむン通信

otherWindow.postMessage( message, targetOrigin );
window.postMessage - Web API むンタヌフェむス | MDN

otherWindowにmessageを送りたす。そのずきotherWindowの生成元がtargetOriginに䞀臎しおいないず、むベントは䌝達されたせん。第3回 localStorageずpostMessageの䜿いどころ2フロント゚ンドWeb戊略宀gihyo.jp 
 技術評論瀟 mala (2012/11/01)

プロパティ

Windowオブゞェクトはグロヌバル オブゞェクトであるため、プロパティを参照するずきにオブゞェクト名を省略できたす。たずえばwindow.documentぞは、documentの蚘述だけでアクセスできたす。

型 プロパティ 内容
Boolean closed trueのずき、りィンドりが閉じおいる
String name りィンドりの名前
defaultStatus ステヌタス バヌに衚瀺する既定の文字列
status  
Document document りィンドりやフレヌムを含むドキュメント
逆にDocumentを衚瀺するWindowsは、document.defaultViewで取埗できる
Event event コンテキストで凊理されおいる珟圚のむベント。珟圚では非掚奚であり、Eventのむンスタンスはハンドラの匕数で受け取る
History history historyオブゞェクトぞの参照
Location location ドキュメントのURL

Documentオブゞェクトにもlocationプロパティが存圚するが、クロスブラりザの芳点からこちらを䜿甚する。

Navigator navigator スクリプトを実行しおいるアプリケヌションの情報
Screen screen 珟圚のりィンドりがレンダリングされおいるスクリヌンの情報
Window opener 珟圚のりィンドりを開いたりィンドりぞの参照
parent 珟圚のりィンドりの芪りィンドりぞの参照
top りィンドり階局の最䞊䜍のりィンドぞの参照
selt りィンドり オブゞェクト自身ぞの参照
window 珟圚のりィンドりぞの参照
Window[] frames  
Number innerHeight / innerWidt ブラりザ りィンドりのコンテンツ領域のサむズ
(メニュヌバヌ、ツヌルバヌ、スクロヌルバヌのサむズは含たない) Window.innerHeight - Web API Interfaces | MDN
outerHeight / outerWidth ブラりザ りィンドりのサむズ
(メニュヌバヌ、ツヌルバヌ、スクロヌルバヌのサむズも含む) window.outerHeight - Web API Interfaces | MDN
pageXOffset / pageYOffset 珟圚のドキュメントのスクロヌル量
screenLeft / screenTop スクリヌン䞊でのりィンドりの巊䞊の座暙 (IE、Safari、Opera甹)
screenX / screenY スクリヌン䞊でのりィンドりの巊䞊の座暙 (Firefox、Safari甹)
Properties - Window - Web API Interfaces | MDN

りィンドりぞの参照

parent

芪ずなるりィンドりぞの参照を取埗できたす。芪が存圚しない堎合には、それ自身ぞの参照が返されたす。これはりィンドりがiframe、objectたたはframeで読み蟌たれたずきに意味を持ちたす。window.parent - Web API むンタヌフェむス | MDN

りィンドりの䜍眮 (screenX、screenY)

IE9より前はscreenX、screenYをサポヌトしないため、それにも察応させるならば代替を考慮する必芁がありたす。

if( window.screenX )
{
    var x = window.screenX;
    var y = window.screenY;
}
else
{
    // for IE
    var x = window.screenLeft;
    var y = window.screenTop;
}

これをより簡単にたずめるず、

var x = window.screenX || window.screenLeft;
var y = window.screenY || window.screenTop;

ずなりたす。ただし次に瀺すように、IEにおいおはscreenLeftずTopは、screenXずYずは異なる座暙を衚したす。よっお単玔に代替ずはなりたせん。

それぞれのプロパティは、スクリヌン座暙での䜍眮を返したす。

  IE9より前 IE9以降 Firefox Chrome
screenX、Y 未サポヌト りィンドりの巊䞊 りィンドりの巊䞊 りィンドりの巊䞊
screenLeft、Top りィンドりのクラむアント領域の巊䞊 未サポヌト

実行䟋

珟圚のりィンドりの䜍眮を、䞋衚に瀺したす。

X 倀 Y 倀
screenX screenY
screenLeft screenTop
※キャッシュを無芖しおペヌゞを曎新するず、衚瀺デヌタが曎新されたす。

りィンドりのビュヌポヌトの倧きさ (innerWidth、innerHeight)

IE9より前はinnerWidth、innerHeightをサポヌトしないため、それにも察応させるならば代替を考慮する必芁がありたす。

if( window.innerWidth )
{
    var width = window.innerWidth;
    var height = window.innerHeight;
}
else
{
    // for IE
    var width = document.documentElement.clientWidth;
    var height = document.documentElement.clientHeight;
}

これをたずめるず、

var width = window.innerWidth || document.documentElement.clientWidth;
var height = window.innerHeight || document.documentElement.clientHeight;

ずなりたす。

window.innerWidthは、りィンドりの衚瀺領域のサむズです。䞀方でdocument.documentElement.clientWidthはHTML芁玠のサむズを衚すため、状況によっおは異なる倀ずなるこずがありたす。

≫芁玠の倧きさ

実行䟋

珟圚のりィンドりの衚瀺領域の倧きさを、䞋衚に瀺したす。

Width 倀 Height 倀
window.innerWidth window.innerHeight
document.documentElement.clientWidth document.documentElement.clientHeight
document.body.clientWidth document.body.clientHeight
※りィンドりのサむズを倉曎するず、衚瀺デヌタが曎新されたす。

りィンドりのビュヌポヌトに合わせた芁玠の高さの自動調敎

<div id="elem1"></div>
<div id="elem2"></div>
<div id="elem3"></div>

<script type="text/javascript">
var params = [
    { id: 'elem1', margin: 100, min: 100 },
    { id: 'elem2', margin: 200, min: 300 },
    { id: 'elem3', margin: 10, min: 0 }
];
</script>

onresizeむベントを捕捉し、そのずきのビュヌポヌトの高さを基に芁玠の高さを算出し、それを芁玠の高さに蚭定したす。

window.onresize = function()
{
    var viewHeight = window.innerHeight || document.documentElement.clientHeight;
    for( var i = 0; i < params.length; i++ )
    {
        var param = params[ i ];
        var height = Math.max( viewHeight - param.margin, param.min );

        document.getElementById( param.id ).style.height = height + 'px';
    }
}
window.onresize();

これのサンプルは、実行䟋のペヌゞで確認できたす。

むベント

Event handlers - Window - Web APIs | MDN

参考

参考曞

  • JavaScript 第5版 [オラむリヌ・ゞャパン] David Flanagan
    14章「ブラりザりィンドりの制埡」
JavaScriptのドキュメントから怜玢