Я хотел бы добавить одну вещь к отличному ответу chazomaticus :
Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):
Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.
Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.
It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.
Правка:
У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:
Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).
У вас есть как минимум четыре варианта:
case
Как , показанный LightStyle , вы можете явно указать каждый случай:
switch(myInterval){
case 0:
case 1:
case 2:
doStuffWithFirstRange();
break;
case 3:
case 4:
case 5:
doStuffWithSecondRange();
break;
case 6:
case 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
if
/ else if
/ else
Если диапазоны большие, это становится громоздким, поэтому вы хотите делать диапазоны. Обратите внимание, что с if...else if...else if
вы не дойдете до более поздних, если предыдущий будет соответствовать, поэтому вам нужно только каждый раз указывать верхнюю границу. Я буду включать нижнюю границу в /*...*/
для ясности, но обычно вы можете оставить ее, чтобы избежать введения проблемы обслуживания (если вы включаете обе границы, легко изменить ее и забыть изменить другую):
if (myInterval < 0) {
// I'm guessing this is an error
}
else if (/* myInterval >= 0 && */ myInterval <= 2){
doStuffWithFirstRange();
}
else if (/* myInterval >= 3 && */ myInterval <= 5) {
doStuffWithSecondRange();
}
else if (/* myInterval >= 6 && */ myInterval <= 7) {
doStuffWithThirdRange();
}
else {
doStuffWithAllOthers();
}
case
с выражениями: JavaScript необычен тем, что вы можете использовать выражения в выражении case
, поэтому мы можем записать последовательность if...else if...else if
выше как выражение switch
:
switch (true){
case myInterval < 0:
// I'm guessing this is an error
break;
case /* myInterval >= 0 && */ myInterval <= 2:
doStuffWithFirstRange();
break;
case /* myInterval >= 3 && */ myInterval <= 5:
doStuffWithSecondRange();
break;
case /* myInterval >= 6 && */ myInterval <= 7:
doStuffWithThirdRange();
break;
default:
doStuffWithAllOthers();
}
Я не сторонник этого, но он является вариантом в JavaScript, и иногда это полезно. Операторы case
проверяются в порядке от значения, которое вы даете в switch
. (И снова нижние границы могут быть опущены во многих случаях, потому что они бы соответствовали ранее.) Несмотря на то, что case
s обрабатываются в порядке исходного кода, default
может отображаться в любом месте ( а не только в конце) и обрабатывается только в том случае, если либо нет case
s, либо case
соответствует и проваливается до значения по умолчанию (не было break
; редко вы хотите это сделать, но это происходит).
Если ваши функции все принимают одни и те же аргументы (и это может быть не аргумент или только те же), другой подход - это карта отправки:
В некоторых
var dispatcher = {
0: doStuffWithFirstRange,
1: doStuffWithFirstRange,
2: doStuffWithFirstRange,
3: doStuffWithSecondRange,
4: doStuffWithSecondRange,
5: doStuffWithSecondRange,
6: doStuffWithThirdRange,
7: doStuffWithThirdRange
};
Затем вместо переключателя:
(dispatcher[myInterval] || doStuffWithAllOthers)();
Это работает, просматривая функцию для вызова карты dispatcher
, по умолчанию doStuffWithAllOthers
если для этого конкретного значения myInterval
нет записи с использованием любопытно-мощного ||
оператора , а затем его вызова.
Вы можете разбить это на две строки, чтобы сделать это немного яснее:
var f = dispatcher[myInterval] || doStuffWithAllOthers;
f();
Я использовал объект для максимальной гибкости. Вы могли бы определить dispatcher
, как это, в вашем конкретном примере:
var dispatcher = [
/* 0-2 */
doStuffWithFirstRange,
doStuffWithFirstRange,
doStuffWithFirstRange,
/* 3-5 */
doStuffWithSecondRange,
doStuffWithSecondRange,
doStuffWithSecondRange,
/* 6-7 */
doStuffWithThirdRange,
doStuffWithThirdRange
];
... но если значения не являются смежными числами, гораздо яснее использовать объект вместо этого.
Использовать аргумент case с определенной строкой или значением или использовать «if else if», если диапазон выше
Если ваши диапазоны совпадают и начинаются с 0, вы можете выполнить некоторую математику.
doStuffWithRange(Math.floor(myInterval/range));
Например, если вы хотите использовать RED, GREEN и BLUE на карте, например, ваш пример:
Вы можете написать:
function colorInterval(n, max) {
var colors = ["RED", "GREEN", "BLUE"];
var range = max/colors.length
return colors[Math.floor(n/range)];
}
//You get 3 of RED, 3 of GREEN, 2 of BLUE
for (var i=0; i<8; i++) {
console.log(colorInterval(i, 8));
}
Примечание что последний диапазон в примере равен 2, а не 3, и это все еще работает до тех пор, пока предыдущие диапазоны совпадают.
Возможно, это вам нужно?
switch(myInterval){
case 0:
case 1:
case 2:
//doStuff();
break;
case 3:
case 4:
case 5:
case 6:
//doStuff();
break;
case 6:
case 7:
//doStuff();
break;
default:
//doStuff();
}
Если вы знаете, что диапазон будет очень высоким (например, 0-100
), вы также можете это сделать, что, безусловно, проще, чище и проще:
if (myInterval >= 0 && myInterval <= 20) {
//doStuff();
} else if (myInterval > 20 && myInterval <= 60) {
//doStuff();
} else if (myInterval > 60 && myInterval <= 70) {
//doStuff();
} else /* it is greater than 70 */ {
//doStuff();
}
int levelNumber = YOUR_VALUE FROM
NSString* strMessage;
switch (levelNumber) {
case 1 ... 10:
{
// Do something...
break;
}
case 11 ... 20:
{
// Do something...
break;
}
case 21 ... 30:
{
// Do something...
break;
}
case 31 ... 40:
{
// Do something...
break;
}
default:
break;
}
Диапазоны в этом примере довольно малы, но вот как можно обрабатывать большие диапазоны, на JavaScript MDN Docs :
// The value we'll be evaluating:
let code = 100;
// Matches for any case where the expression === `true`:
switch (true) {
case code <= 64:
return "Your number is 64 or less!";
break;
case code >= 65 && code <= 90:
return "Your number is in the range of 65-90!";
break;
case code >= 97 && code <= 122:
return "Your number is in the range of 97-122!";
break;
case code >= 123:
return "Your number is 123 or greater!";
break;
default:
break;
}
Я знаю, что этот стиль был уже показанный TJ Crowder через Используйте case
с выражениями , но я просто хотел показать другой пример того, как использовать этот же метод. Я просто сделал это и подумал, что другой пример может помочь кому-то, так как я все еще немного смутился после прочтения других ответов.