Tell me more ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I was actually writing this little script:

$ ->
 # Alter 'input' Width
  inputResize = -> 
   $('form').each ->
    tF = $(this)
    formWidth = tF.width()
    tF.find('input').each ->
     tE = $(this)
     inputBorder = (tE.outerWidth() - tE.innerWidth())
     inputPadding = parseInt(tE.css('padding-left')) + parseInt(tE.css('padding-right'))
     tE.css 'width', ->
      (formWidth - inputBorder - inputPadding)
 # on Resize
 $(window).resize ->
  inputResize()
 # on Init
  inputResize()

What it does: Get every form-element and calculate its width, then change the input fields depending on the parent-form width.

It works as intended - but to learn a bit more I just want to know if there is a smarter way to write this little code in coffeescript. Thanks alot!

share|improve this question
1  
There is no point in optimizing coffeescript. If you want to write optimal code, write it in native javascript (and that means - no jquery). – tereško Sep 25 '12 at 0:22
What's coffee script? – Justin Sep 25 '12 at 0:36
Coffeescript is a little language that compiles to javascript: coffeescript.org – Rockbot Sep 25 '12 at 7:25

migrated from stackoverflow.com Sep 24 '12 at 22:11

2 Answers

up vote 5 down vote accepted

Here are a few tips:

1) Use standard naming convention.

tE and tF sound like booleans and not a refence to an element. Try names like el, $this or that instead.

2) Separate complex logic into smaller functions.

There's too much going on here.

 inputResize = -> 
   $('form').each ->
    tF = $(this)
    formWidth = tF.width()
    tF.find('input').each ->
     tE = $(this)
     inputBorder = (tE.outerWidth() - tE.innerWidth())
     inputPadding = parseInt(tE.css('padding-left')) + parseInt(tE.css('padding-right'))
     tE.css 'width', ->
      (formWidth - inputBorder - inputPadding)

Since tF is only used then you can get rid of it and use $(this) directly. Next, extract the input width size calculation to one function and you get something like this.

  getNewInputSize = (el, formWidth) ->
    inputBorder = el.outerWidth() - el.innerWidth()
    inputPadding = parseInt( el.css("padding-left"), 10) + parseInt(el.css("padding-right"), 10)
    formWidth - inputBorder - inputPadding

  resizeFormInputs = ->
    $("form").each ->
      formWidth = $(this).width()
      $(this).find("input").each ->
        $(this).css "width", getNewInputSize($(this), formWidth)

Final Code:

$ ->
  getNewInputSize = (el, formWidth) ->
    inputBorder = el.outerWidth() - el.innerWidth()
    inputPadding = parseInt( el.css("padding-left"), 10) + parseInt(el.css("padding-right"), 10)
    formWidth - inputBorder - inputPadding

  resizeFormInputs = ->
    $("form").each ->
      formWidth = $(this).width()
      $(this).find("input").each ->
        $(this).css "width", getNewInputSize($(this), formWidth)

  $(window).resize(resizeFormInputs).triggerHandler "resize"
share|improve this answer
Thank you! That´s what I call a detailed answer :) – Rockbot Sep 26 '12 at 9:27

This is pretty good, you could do that, don't know if you find it much more readable:

$ ->
  # Alter 'input' Width
  inputResize = -> 
    $('form').each ->
      tF = $ @
      formWidth = tF.width()
      tF.find('input').each ->
        tE = $ @
        inputBorder = (tE.outerWidth() - tE.innerWidth())
        inputPadding = parseInt(tE.css 'padding-left') + parseInt(tE.css 'padding-right')
        tE.css 'width', -> (formWidth - inputBorder - inputPadding)
  # on Resize
  $(window).resize -> inputResize()
   # on Init
  inputResize()
share|improve this answer
Thank you! I didn´t know the $ @ :) - learned something. – Rockbot Sep 25 '12 at 7:24
One last question: Would it be possible to use loops where i used each() ? – Rockbot Sep 25 '12 at 15:03
Yes, and the performance would be a little better. But I usually care more about readability. You could do: for input in tF.find('input'), then replace tE = $ @ by tE = $ input – standup75 Sep 25 '12 at 20:34

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.