2013-11-08 2 views
1

Я строю индикатор состояния, как это:

G = { status : function(type, msg) { 
    var opts = { 
     'plain': ['#ccc', '#000'], 
      'alert': ['#900', '#fff'] 
    } 
    var $el = $('<div id="status"></div>') 
     .css({ 
     'background': opts[type][0], 
      'color': opts[type][1] 
    }) 
     .html(msg) 
     .appendTo('body'); 
    return $el; 
}} 

Я называю это так:

G.status('plain','hello'); //makes a black text on grey background message 
G.status('alert','ouch'); //makes a white text on red background message 

Вопрос: Вместо CSS я мог бы иметь более сложные параметры, как объект различных вариантов, некоторые из которых могут быть необязательными. есть ли более элегантный способ сделать это? У меня такое ощущение, что я действительно не использую javascript и jquery, чтобы это было наилучшим потенциалом и делало код слишком сложным.

Подумайте об этом, я думаю, это, возможно, было задано в другом месте, но я еще не нашел его.

+1

Этот вопрос, как представляется, не по теме, потому что она принадлежит на [codereview.se]. – Doorknob

+0

Я не пытаюсь проверить этот фрагмент. Я пытаюсь понять, как лучше структурировать функции с дополнительными параметрами. – tim

+1

Я думаю, что $ .extend идеально подходит для ситуации, которую вы описываете, где у вас есть несколько необязательных параметров, которые вы хотите передать в конструктор. Возможно, стоит обновить ваш пример, чтобы он был ближе к описанию. –

ответ

2

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

// type corresponds to a class in my CSS 
function status(type, msg) { 
    var $el = $('<div id="status"></div>') 
     .addClass(type) 
     .html(msg) 
     .appendTo('body'); 
    return $el; 
} 

status('plain', 'hello'); 

CSS:

.plain { 
    background: #ccc; 
    color: #000; 
} 
+0

'... без необходимости редактировать ваш JavaScript'. Вызов должен быть изменен, а также CSS. Но идея хорошая. – RobG

+0

Справедливая точка. Я обновил ответ. –

+0

Спасибо за идею. Я предполагаю, что это происходит, когда я пытаюсь упростить мой пример кода для ясности. Я на самом деле создаю нечто гораздо более сложное и традиционно делаю это как расширение jquery, но я узнал, что это ужасно с сборкой мусора в браузере, поэтому я пытаюсь просто создать класс объекта (?, Я не уверен, что использую правильная номенклатура), чтобы я мог лучше ее уничтожить. Во всяком случае, мне действительно просто интересно, какой лучший способ выполнять необязательные параметры функции. Забудьте, что это CSS, это просто для иллюстрации. Спасибо. – tim

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