私はこの質問に対する答えを書きました:URLによる新しい背景、私の答えに投稿したコードは、特定の文字列の存在についてURLをチェックし、存在する場合は、特定の要素の背景画像を変更することでした。
それで!私は私なので、jQueryを避けて、次のような従来のバニラJavaScriptアプローチを採用すると思いました。
var images = {
'halloween' : '/images/newbackground.jpg',
'christmas' : '/images/xmasbackground.jpg'
};
var url = document.location.href,
elem = document.getElementById('elementThatYouWantToStyle');
for (var keyword in images){
if (images.hasOwnProperty(keyword) && url.indexOf(keyword) !== -1) {
elem.style.backgroundImage = images[keyword];
}
}
ソース。
その後、機能的なアプローチに変換すると思ったので、次のようになりました。
var images = {
'halloween': 'http://davidrhysthomas.co.uk/img/dexter.png',
'christmas': 'http://davidrhysthomas.co.uk/img/mandark.png'
};
function setBG(el, map, url) {
if (!el || !map) {
return false;
}
else {
var url = url || document.location.href,
el = el.nodeType == 1 ? el : document.getElementById(el);
for (var keyword in map) {
if (map.hasOwnProperty(keyword) && url.indexOf(keyword) !== -1) {
el.style.backgroundImage = encodeURIComponent(map[keyword]);
}
}
}
}
setBG('one', images, 'http://some.domain.com/with/halloween.jpg');
setBG(document.getElementById('two'), images, 'http://some.domain.com/with/christmas.jpg');
ここで、ループ内の評価にを追加するconsole.log()
と、ループに入っていることが示され、コンソールは、DOMノード、画像オブジェクト、URL(関数に渡されたもの)への正確な参照があることを示します)そしてオブジェクトから正しい値を取得しています。if
for...in
ただし、el.style.backgroundImage
プロパティを設定しようとする次の行は機能しません(これは、私が行った試みにのみリンクしているにもかかわらずmap[keyword]
、をラップするかどうかに関係なく当てはまります。つまり、私の論理に明らかな欠陥がありますか?なぜ設定されていないのですか?encodeURIComponent()
el.style.backgroundImage
(ちなみに、JSFiddleのJSLintは、それに満足しているようです(フォールバック/デフォルトを設定するために行われる既存の変数(url
および)の再定義を除く)。el