只运行您需要的代码肯定会更好。这并不难;唯一的次要复杂性是处理您的/animals/all
案件。如果您想将所有代码保存在一个文件中,您可以这样做:
var animals = {
giraffe: function() {
console.log( "I'm a giraffe" );
},
elephant: function() {
console.log( "I'm an elephant" );
},
zebra: function() {
console.log( "I'm a zebra" );
}
};
$(function() {
var animal = location.pathname.split('/').pop();
if( animal == 'all' ) {
for( var animal in animals ) {
animals[animal]();
}
}
else if( animal in animals ) {
animals[animal]();
}
else {
console.log( "I'm a mystery animal" );
}
});
实际上,您可以通过在 Stack Overflow 上访问这样的 URL 来测试此代码,然后将该代码粘贴到 JavaScript 控制台中:
https://stackoverflow.com/animal/giraffe
https://stackoverflow.com/animal/elephant
https://stackoverflow.com/animal/zebra
https://stackoverflow.com/animal/ocelot
https://stackoverflow。 com/动物/所有
更新:好的,所以你在评论中解释说实际情况有点复杂。我将把这段代码留在这里,以防它对任何人都有用,但对于你的情况,你可能更接近你已经拥有的代码所需要的东西。
WRT 的问题是,当您在与它无关的页面上时,您的动物功能会做什么,当然这取决于它的编码方式。它可能什么都不做,或者它可能有错误,对吧?
由于我们正在讨论 jQuery 代码,因此这里有几个示例。假设您有代码通过 ID 查找元素,然后假设该元素存在:
var zebraElement = $('#zebra')[0];
console.log( zebraElement.value );
在#zebra
元素存在的页面上,此代码将记录其value
属性。(我假设它是一个具有值的元素,例如输入元素。)
但如果#zebra
is 不存在,则zebraElement
is undefined
,并且尝试访问它的操作value
将失败并进入调试器。
OTOH,如果你这样编码:
var $zebra = $('#zebra');
console.log( $zebra.val() );
#zebra
如果丢失它不会失败,它会成功打印undefined
而不会导致错误。
同样,如果您有使用 的代码$().each()
,它通常会在缺少元素时运行而不会失败,因为它根本不会执行回调函数:
$('.animal').each( function( i, e ) {
console.log( $(e).val() );
});
如果没有带有 的元素class="animal"
,console.log()
则将永远无法到达调用。所以没有错误,它什么也没做。
根据您正在做的事情,这可能是一种仅触发您需要的行为的完全合理的方法——只需确保您的代码完全不做任何事情来处理丢失的 DOM 元素。
还请务必阅读尼克的答案以获得更多见解。
还有一个更新......在评论中你提到在body
元素上键入类名。一个很好的方法是类似于上面的代码示例。您不需要每个动物的条件,只需要一个循环和一个条件:
var animals = {
giraffe: function() {
console.log( "I'm a giraffe" );
},
elephant: function() {
console.log( "I'm an elephant" );
},
zebra: function() {
console.log( "I'm a zebra" );
}
};
$(function() {
var $body = $('body');
for( var animal in animals ) {
if( $body.hasClass(animal) ) {
animals[animal]();
}
}
});
因此,例如,如果您拥有<body class="giraffe zebra">
它,它将调用animals.giraffe()
andanimals.zebra()
函数。