Mattias Buelens が説明したように、ロード後にメソッドが自動的に呼び出されるため、DOM をクリアするメソッドをdocument.write
呼び出します。もちろん、使用できる代替手段はいくつかあります。たとえば、要素の属性を
使用します。andの
使用もオプションですopen
document.close
innerHTML
body
document.createElement
document.body.appendChild
しかし、どちらの方法にも欠点があることを考慮する価値があるでしょう。使用innerHTML
すると、不適切な形式のマークアップを DOM に挿入でき、XSS 攻撃に対して脆弱になる可能性があります。
を使用するdocument.createElement
と (一般的に) 遅くなり、多くの場合、より多くのコードが必要になるため、スクリプトの保守性が低下します。
次のようなものを使用できます。
var flip = (function(tempDiv)
{//create a div once
var page = 0,
targetDiv = document.getElementById('contentgoeshere');//closure variables
//page is now no longer an evil global, and the target element into which
//we will inject new data is referenced, so we don't have to scan the DOM
//on each function call
return function(overridePage)//optional argument, just in case
{//actual flip function is returned here
overridePage = overridePage || page++;//new content
tempDiv.innerHTML = overridePage;//render in div that isn't part of the DOM
//any number of checks can go here, like:
if (tempDiv.getElementsByTagName('script').length > 0)
{
alert('Naughty client, trying to inject your own scripts to my site');
return;
}
targetDiv.innerHTML = tempDiv.innerHTML;
//or, depending on your needs:
targetDiv.innerHTML = tempDiv.innerText;//or the other way 'round
};
}(document.createElement('div')));
いくつかの補足事項: 現状では、クロージャーが機能するには DOM を完全にロードする必要があるため、この関数は機能しません。簡単な修正は次のとおりです。
var flip;//undefined
window.onload = function()
{
flip = (function(tempDiv)
{
var page = 0,
targetDiv = document.getElementById('contentgoeshere');
return function(e)
{
tempDiv.innerHTML = e instanceof Event ? page++ : (e || page++);//ternary + logical or
//your [optional] checks here
targetDiv.innerHTML = tempDiv.innerHTML;
if (e instanceof Event)
{//this part is optional, but look it up if you want to: it's good stuff
e.returnValue = false;
e.cancelBubble = true;
if (e.preventDefault)
{
e.preventDefault();
e.stopPropagation();
}
}
return e;
};
}(document.createElement('div')));
//instead of using the HTML onclick attribute:
document.getElementById('buttonID').onclick = flip;//use as event handler
};
window.onload
IE<9 でメモリ リークが発生することに注意してください。この問題の解決策については、このリンクを確認してください。