アップデート:
私の回答にはわずかな構文エラーがありました (IIFE の閉じ括弧を忘れていました)。とにかく、これは更新された fiddleであり、(完全を期すために) コードは次のとおりです。もう少し最適化しましたが、基本的には同じです:
$(function()
{
(function(sbut1)
{
(function(log1, cont1)
{
sbut1.on('click',function()
{
cont1.show();
log1.hide();
$.cookie('shown', true);
$(this).off('click');
});
}($('#log1'), $('.cont1')));
if ($.cookie('shown'))
{
sbut1.trigger('click');
}
}($('#sbut1')));
});
無関係に見えることがいくつかあります (イベント リスナーのバインドとバインド解除など) が、フィドルのコメントは、なぜ私がこれを行っているかを説明しています。主な理由は、ガベージ コレクションのフラグを立てるために、DOM への参照をクリーンアップすることです。
繰り返しますが、このコードはFFとクロムの両方でうまく機能します
私の最後のコメントに応えて、同じこと、vanillaJSのみ:
window.addEventListener('load', function l()
{
var cookie = (function(trueUndef)
{
var clean = (localStorage || document.cookie);
return function(name, val)
{
if (val === trueUndef)
{
if (clean === localStorage)
{
return clean.getItem(name);
}
val = clean.split(name + '=')[1];
return val ? val.match(/^[^;]+/)[0] : trueUndef;
}
if (clean === localStorage)
{
return clean.setItem(name, val);
}
return !!(clean = name + '=' + val);
};
}()),
sbut1 = document.getElementById('sbut1');
sbut1.addEventListener('click', (function clickHandler(log1, cont1)
{
return function(i)
{
log1.style.display = 'none';
for(i=0;i<cont1.length;i++)
{
cont1[i].style.display = 'block';
}
cookie('foo', true);
sbut1.removeEventListener('click', clickHandler, false);
};
}(document.getElementById('log1'), document.getElementsByClassName('cont1'))), false);
if (cookie('foo') === 'true')
{
sbut1.dispatchEvent(new Event('click'));
}
window.removeEventListener('load',l, false);
}, false);
私はあなたのフィドルを見て、コードを次のように変更しました:
$(function()
{
$('#sbut1').click(function()
{
$('.cont1').show();
$('#log1').hide();
$.cookie('shown', true);
});
if ($.cookie('shown'))
{
$('#sbut1').click()
}
});
ここでわかるように、これは私にとって魅力のように機能します(オプションno wrap - in headを使用)
余談ですが、あなたは多くの DOM セレクターを使用しており、あちこちで関数を呼び出しており、DOM へのクエリが多すぎます。これらの DOM ノードへの参照をどこかに割り当てた場合、コードはより効率的になります。
$(function()
{
(function(sbut1, log1, cont1)
{
sbut1 = sbut1 || $('#sbut1');//safety-net
log1 = log1 || $('#log1');
cont1 = cont1 || $('.cont1');
sbut1.click(function()
{
cont1.show();
log1.hide();
$.cookie('shown', true);
});
if ($.cookie('shown'))
{
sbut1.click();
}
}($('#sbut1'), $('#log1'), $('.cont1')));
});
もちろん、IIFE はオプションですが、DOM 参照をスコープにラップするため、実際にそれらを必要とするスクリプトの部分でのみ使用できます。
このコードを改善する方法はたくさんありますが、過剰な DOM クエリは簡単に回避できるので、それらを処理することをお勧めします。