Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to fix table header, getting css issue

Initially I asked this Question and written my own plugin to achieve the same,But i am facing very strange issue regarding to css of table.
After applying the plugin table cells borders are getting dis-sorted.

jsFiddle of the problem: Problem demo

In fiddle you can see that after first cell of the first tr, the header border line and table border line don't line up. I want the border line of thead cells and td cells to line up. Can anyone tell me how to achieve that?

like image 633
Vivek Avatar asked Nov 30 '22 04:11

Vivek


1 Answers

Lets start by doing a bit of a clean up of the code you posted so I can actually read your code and maintain a firm grasp on reality while we go down this rabbit hole.

If you write clean code, your problems will be exceptionally easier to see.

So lets clean it up and watch as all the problems here reveal themselves.

Step one: Your jsFiddle sets it to run "onDomReady," which basically means you've got $(document).ready(...) calling all the code in the box, which is fine, except you're got another got $(document).ready(...) inside there. Lets change that.

Step two: Lets add some white space and proper indentation in there, and stop using these one letter variable names.

{} are scope brackets, they should indent, not cover everything, they let us know what part of scope something is in.

Don't write .each() loops on one line, this adds no value and makes your code confusing to read.

$t should be called something meaningful, lets try element, because it holds the $(this) element, which is the active element you're working with.

w should be called something meaningful, but since you only use it twice I'm just going with element.width().

o needs to be less ambiguious, lets go with obj.

Step three: Selection structures

if(typeof(i)=='number')o.height=i;
else if(typeof(i)=='object')o=i;
else if(typeof(i)=='undefined')o={height:300}

Break that up, make it readable. Saving lines doesn't make you a better program, writing clean and easily understandable code will.

Why not use the switch-case statement?

    switch (typeof(i)){
        case "number":
            o.height=i;
            break;
        case "object":
            o=i;
            break;
        case "undefined":
            o={height:300};
            break;
    }

Step four: Don't in-line styles. Just don't. There's no reason to do it, and it makes everyone's life harder.

Instead, lets just place the styles gently into the style sheet where it belongs, and make the parent=$('...') line look like parent=$('<div><div></div></div>').appendTo('body');.

Step five: Closure doesn't pass any value to arguments

After a bit of clean up, we see this block of code:

self.width(self.width() - 
    function(width){
        var parent,child;
        if(width===undefined){
            parent=$('<div><div></div></div>').appendTo('body');
            child=parent.children();
            width= (child.innerWidth()) - (child.height(99).innerWidth());
            parent.remove();
        }
        return width;
    }()
);

Okay, that's a problem. Lets cut out a few lines to point out the problem here:

self.width(
   self.width() - 
    function(width){
        /*...*/
        if(width===undefined){
            /*...*/
        }
        return width;
    }()
);

So, a quick refresher on this pattern you have here:

(function(arg1){
    /*code*/
})(data);

Data gets passed to arg1. Arg1 declaires a variable in the scope local to that function, it doesn't get anything from outside. Outside data is passed in through the set of () that call the function, which your code had left abandoned. Think of it this way:

var msg = function(text) {
    alert(text);
};

Then you call it as...

msg("hello world");

What your closure is doing is almost the same thing, except where you define your function, you also call it. Thus...

(function(text) {
    alert(text);
})("hello world");

So, you need to pass a value of some sort into there, other wise this whole thing is always undefined. Lets do that. What are we passing? I have no way to be sure. This is why programmers need to add comments to their code.

Step six: Comment your code so people other than yourself will look at this code and have not a damn clue what you truthfuly wanted to do, and can only guess. It's like you posted a 200 point bounty and didn't bother helping people who want to help you. Why are you doing this to yourself, dude? Why couldn't you just go //This is what this does to give me a hint? What did I ever do to you?

Step Seven: Lets see if we can make the JS changes work with the JS Fiddle

Great odin... that HTML's 2000 lines long?

Okay, I'm working with pastebin here for the sake of saving space in the post here.

Alright, you started off with this: http://pastebin.com/xjmm4cev

You're using a lot of no-wrap, and putting classes onto individual elements. You shouldn't have to do this on each HTML element, CSS takes care of that very effectively, so lets go ahead and just rip out all the nowrap=nowrap and class="header" stuff (we'll put it back in a moment, but only ONE per group, not each element).

Then lets get rid of the useless blank lines.

Lets run this through HTML tidy and get it nice and indented correctly.

http://pastebin.com/uHtSZ4h5

Much easier to read over. Okay, so what do we see here? Well, it looks like you keep going in circles, cutting and pasting the same thing again and again. You also in-line javascript such as using onchange and onclick attributes. This is generally an awful thing to do to your code, and makes it hard to maintain (as I'm sure you've seen with this 2000+ line beast of cut+paste 27 times in a row).

So, lets take a look here:

  1. elements, not inside a form
  2. Elements in a table that are outside of rows, but not head/body/footer sections of a table
  3. Code that's a huge pain to maintain because it keep going in circles, if you need to change this, you're basically screwed.

Lets fix all that.

  1. We're going to use events in the tags, rather than in-line things. So, all of those in-line onchange and click attributes get the boot.
  2. All of these inputs that are just floating around need to get put into a form, and taken out of this place in tables that only rows or table sections belong in.
  3. Figure out how we can not have excessive input elements, if we can help it.
  4. What the heck is the )="" that you have on every input button? Deleted.

So, here's all of your hidden boxes: http://pastebin.com/LXZSkvyf which I've removed, because we don't have a anywhere.

And here's what the code looks like without all of these weird things in it: http://pastebin.com/MiaJTGpb

Much more readable, but still not quite there.

Step 8: What can you do to make the HTML of the table work better?

  1. You're using Thead and Tbody, and that's good.
  2. You're using attributes for things like cellpadding, that's bad.
  3. You've given each body row an ID. I don't feel you needed to do this, but it's not always bad. However, I'll show you how you could work without it.
  4. You give some selects a select-box class, but it's nowhere in the css. I've removed it.
  5. You give a title attribute to the selects that says "option_value". The title attribute is generally used to make a tool-tip popup when you leave the mouse over something. I'm not sure what you're going to do here, but that's bound to confuse your user. I'd highly suggest giving something better than option_value in that place.
  6. You keep using the ID Submit_FMS_AddDelivery. HTML ID tags are meant to be unique, and used only once on one element. You've got it 27 times, that's bad. I don't think you need an ID on it, so I've removed it.
  7. You've also got input-btn going on, I'm removing it, because you haven't shown it's used anywhere.
  8. You probably don't need any of these ID tags on select and TR to be honest, so I'm pulling them.

What's that look like? Basically, you've got what's almost just the data, in it's nice pure form. That's good. http://pastebin.com/UNS6CAtb

Step 9: What were you trying to do?

Lets step back and take a look here.

All you really wanted to do was keep a fixed header, but you've ended up doing a lot of JavaScript hacks and manipulating the DOM in a lot of places. We need to stop doing this. Is there a simpler way to do what you want?


I'll have to expand on how to make this function with the rest of your stuff, but I get up for work in a few hours. I'll update again with more... But we'll get there.

Right now, because I haven't fixed what I took out, it doesn't look right. But I'm tired.

So, here's where we are so far: http://jsfiddle.net/5C6z7/ Plus those inputs we took out (and will be going back in later, in a different way)

like image 122
Incognito Avatar answered Dec 09 '22 17:12

Incognito