Оператор Javascript If, используемый для проверки недействительных расширений файлов

У меня есть форма, в которой люди могут вводить пути к файлам. Я хочу убедиться, что пути, которые они вводят, указывают на фотографии, поэтому вот что я думал бы работать.

function checkExt()
{
    var extension= /* I know that the code to cut the extension off of the file
                      is working correctly so for now let just go with it ok */
    if(extension!="jpg" || "gif" || "bmp" || "png" || "whatever else")
        alert("The file extension you have entered is not supported");
}

Но это не работает. Я отследил его до оператора if, потому что, если я выбираю только один вид файла для проверки, тогда он будет работать правильно. Поэтому мой вопрос к вам - это то, что, черт возьми, я должен изменить, чтобы эта вещь работала правильно. Я уже около трех часов, и это сводит меня с ума. Спасибо за всю помощь заранее.

Ответ 1

Это синтаксис и логическая ошибка. Это должно быть:

if (extension != "jpg" && 
    extension != "gif" && 
    extension != "bmp" && 
    extension != "png" && 
    extension != "whatever else") {
    // This will execute when the extension is NOT one of the expected 
    // extensions.
}

Кроме того, вы можете обработать его немного более кратко с регулярным выражением:

if (!/jpg|gif|bmp|png|whatever/.test(extension)) {
    // This will execute when the extension is NOT one of the expected 
    // extensions.
}

Добавление:

Приведенные выше примеры выполняют тело оператора if, если значение extension не является одним из поддерживаемых значений. Если вы хотите выполнить тело if-оператора, когда значение extensions является одним из поддерживаемых значений, вы должны изменить логику не равным/и равным/или следующим образом:

if (extension == "jpg" || 
    extension == "gif" || 
    extension == "bmp" || 
    extension == "png" || 
    extension == "whatever else") {
    // This will execute when the extension is one of the expected extensions.
}

И снова, это будет более кратким, используя регулярное выражение:

// I just removed the leading ! from the test case.
if (/jpg|gif|bmp|png|whatever/.test(extension)) {
    // This will execute when the extension is one of the expected extensions.
}

Ответ 2

Вы должны использовать && вместо ||, и вы должны префикс оператора != extension для каждого условия, а не только для первого:

if (extension != "jpg" &&
    extension != "gif" &&
    extension != "bmp" && 
    extension != "png" &&
    extension != "whatever else")

Ответ 3

В качестве альтернативы многословию используйте регулярное выражение:

if (extension.search(/jpg|gif|bmp|png/) === -1) {
    alert("The file extension you have entered is not supported.");
}

Ответ 4

Вам нужно указать параметры для сравнения в каждом разделе.

if( extension != "jpg" || 
    extension != "gif" || 
    extension != "bmp" || 
    extension != "png" || 
    extension != "whatever else"){
 //TODO: handle condition
}

Как отмечали другие, это логическая ошибка в том, что если "jpg" является расширением, условие все равно будет удалено, потому что "jpg" != "gif". Возможно, вы захотите использовать &&.

Ответ 5

Вам нужно сравнить переменную extension для каждого тестируемого расширения. Компактный способ сделать это:

var extension = whatever;
var supportedExtensions = ["jpg","gif","bmp","png",... whatever else];
if (supportedExtensions.indexOf(extension) < 0) alert("Unsupported extension");

Ответ 6

Другие ответы показали, что ваша логика JavaScript для множественных сравнений неверна. Но гораздо лучший способ сделать это - использовать карту javascript следующим образом:

function checkExt() {
    var allowedExtensions = {
        "jpg": true, "gif": true, "bmp": true, "png": true, "whatever else":true
    };
    var extension= /* I know that the code to cut the extension off of the file
                      is working correctly so for now let just go with it ok */
    if (allowedExtensions[extension] !== true) {
        alert("The file extension you have entered is not supported");
    }
}

Легче поддерживать, просто добавляя/удаляя элементы в/из объекта allowedExtensions.