2013-05-20 2 views
0

Я выполняю json-вызовы на основе определенного класса в классе body. Чтобы уменьшить количество ненужных вызовов на разных страницах.Проверка выполнения определенного оператора switch switch

например:

$(function() { 
    if ($('body.CLASSNAME1').length == 1) { 
     //JSON call 
    }); 
}); 

$(function() { 
    if ($('body.CLASSNAME2').length == 1) { 
     //A Different JSON call 
    }); 
}); 

Чтобы очистить это, я хотел бы одну функцию и выполнять внутренние функции на основе заданного имени класса. Я думаю, что оператор switch, но не могу обернуть мозг вокруг логики, я начал с $.hasClass(''), но не могу понять какой-либо другой способ читать и выполнять на основе уникального имени класса.

+2

переключатель заявление, вероятно, не будет делать то, что вы необходимость. Обратите внимание, что ваши операторы if имеют дополнительные ')' после них. –

+0

Сколько различных вариантов есть? Только эти два, десятки, сотни? – tymeJV

+0

как насчет старомодного 'else if' – dakait

ответ

2

Просто создать отображение имен объектов класса для функций, которые вызывают различные вызовы XHR, и перечислить объект, тестирование каждого имени класса и вызова функции, если body имеет этот класс.

$(function(){ 
    // Map your keys (class names) to your JSON calls 
    var classes = { 
     CLASSNAME1: function() { 
         // JSON call 
        } 
     CLASSNAME2: function() { 
         // A Different JSON call 
        } 
    }; 

    // enumerate the object, calling the related function for each found class 
    $.each(classes, function(key, func) { 
     if ($("body").hasClass(key)) 
      func(); 
    }) 
}); 

Или вы можете использовать $.proxy просто связать параметры XHR, если нет дополнительной логики необходимо:

var classes = { 
     CLASSNAME1: $.proxy($, "ajax", {...parameters...}) 
     CLASSNAME2: $.proxy($, "ajax", {...parameters...}) 
    }; 
0

Как насчет:

$(function(){ 
    var $body = $('body'); 
    if($body.hasClass('CLASSNAME1')) 
    { ... } 
    else if($body.hasClass('CLASSNAME2')) 
    { ... } 
}); 
+1

Объясните нижний план. – Gabe

+0

Если вы не можете объяснить нисходящее движение, то это бесполезно. – Gabe

0

Оператор коммутатор не имеет большого смысла в этом случае, так как элемент может иметь несколько классов, поэтому он может соответствовать несколько случаев. Тем не менее, вы можете избавиться от, если заявление с помощью .each():

$(function(){ 

    $('body.CLASSNAME1').each(function(){ 
     $.getJSON(args); 
    }); 
    $('body.CLASSNAME2').each(function(){ 
     $.getJSON(args); 
    }); 
    $('body.CLASSNAME3').each(function(){ 
     $.getJSON(args); 
    }); 

}); 

, хотя, это не более эффективно, чем то, что ранее не было.

Вы также можете упростить его, используя объект, содержащий карту параметров ajax для каждого имени класса.

var ajaxOptions = { 
    "CLASSNAME1": { 
     url: "...", 
     ... 
    }, 
    "CLASSNAME2": { 
     url: "...", 
     ... 
    }, 
    "CLASSNAME3": { 
     url: "...", 
     ... 
    } 
}; 
$.each(ajaxOptions,function (classname,options) { 
    $("body." + classname).each(function(){ 
     $.ajax(options); 
    }); 
}); 
0

Может быть, это то, что вы хотите?

$(function() { 
    var classes = $('body').attr('class').split(' '); 
    $.each(classes, function(i){ 
     var class = classes[i]; 
     switch class{ 
      //switch logic to execute function 
     } 
    }); 
    }); 
0

Ну, это немного декларативной, но вот мой выстрел на него: пример

var callbacks = { 
    classone: function() { 
     //TODO 
    }, 
    classtwo: function() { 
    } 
} 
var bod = ${'body'); 
for (var cls in callbacks) { 
    // 'hasOwnProperty' is just a safety check for object iteration 
    if (callbacks.hasOwnProperty(cls) && bod.hasClass(cls) { 
     callbacks[cls](); 
    } 
} 

косоглазия является очень похожи.

0

Если вы ищете для точного использования переключателя/сазе это можно сделать так:

$.each($('body').attr('class').split(' '), function(i, cls) { 
    switch (cls) { 
     case 'CLASSNAME1': { 
      alert('JSON call'); 
      break; 
     } 
     case 'CLASSNAME2': { 
      alert('A Different JSON call'); 
      break; 
     } 
    } 
}); 

Этот пример в jsfiddle: http://jsfiddle.net/b36F8/

Смежные вопросы