1

I'm trying to turn a script into a function, because it's very tiresome repeating the same code over and over again.

The script selects a container which will be holding a new accordion soon. Every accordion inside the container has a unique data-sort id. (It needs to sort from 1 to 10) It then detects if there are any accordions with an id smaller or bigger than it and adds itself between them.

The script works correctly without it being inside a function.

This script without a function works correctly

var $container = $('.panel-group[data-group-holder="' + dataPlace + '"]'),
    $d = $container.find('div.panel-default'),
    $n = $('<div class="panel panel-default dragged-true" data-sort="' + dataSort + '"><div class="panel-heading"><h4 class="panel-title"><a class="accordion-toggle sub" data-sort="' + dataSort + '" data-toggle="collapse" href="#main-' + dataSort + '"><div class="remove set"><i class="icon-remove"></i></div>' + dataHtml + ' <b>(<span class="sub-count">0</span>)</b><i class="icon-angle-down"></i></a></h4></div><div id="main-' + dataSort + '" class="panel-collapse in"><div class="panel-body" data-accept="' + dataSort + '"></div></div></div>');
var $a = $d.filter(function () {
    return $(this).data('sort') < dataSort;
}).last();

$(that).parents('div:eq(0)').remove();
/*alert($('.draggable-groups .main-groups[data-sort="' + dataSort + '"]').parents().html());*/

if ($a.length) $a.after($n);
else $container.prepend($n);

This function does not work correctly (it doesn't sort)

    function placeSort(thisContainer, containerFind, placeHtml, returnCompareOneFind, returnCompareOne, returnCompareTwo, removeClone) {
        var $container = $(thisContainer),
            $d = $container.find(containerFind),
            $n = $(placeHtml);

        if(returnCompareOneFind == "false") {
            var $a = $d.filter(function () {
                return $(this).data(returnCompareOne) < returnCompareTwo;
            }).last();
        } else {
            var $a = $d.filter(function () {
                return $(this).find(returnCompareOneFind).data(returnCompareOne) < returnCompareTwo;
            }).last();
        }

        removeClone;

        if ($a.length) $a.after($n);
        else $container.prepend($n);
    }

function addGroupAccordion(that, dataSort, dataPlace, dataHtml) {
    var thisContainer = '.panel-group[data-group-holder="' + dataPlace + '"]';
    var containerFind = 'div.panel-default';
    var placeHtml = '<div class="panel panel-default dragged-true" data-sort="' + dataSort + '"><div class="panel-heading"><h4 class="panel-title"><a class="accordion-toggle sub" data-sort="' + dataSort + '" data-toggle="collapse" href="#main-' + dataSort + '"><div class="remove set"><i class="icon-remove"></i></div>' + dataHtml + ' <b>(<span class="sub-count">0</span>)</b><i class="icon-angle-down"></i></a></h4></div><div id="main-' + dataSort + '" class="panel-collapse in"><div class="panel-body" data-accept="' + dataSort + '"></div></div></div>';
    var returnCompareOneFind = "false";
    var returnCompareOne = 'sort';
    var returnCompareTwo = dataSort;
    var removeClone = $(that).parents('div:eq(0)').remove();

    placeSort(thisContainer, containerFind, placeHtml, returnCompareOne, returnCompareTwo, removeClone);
}

$(document).on('click','.draggable-groups .main-groups',function(){
        var dataSort = $(this).attr("data-sort");
        var dataPlace = $(this).parents('div:eq(1)').attr("data-group");
        var dataHtml = $(this).html();
        var that = $(this);
        addGroupAccordion(that, dataSort, dataPlace, dataHtml);
        var groupHolder = dataPlace;
        countChildren(groupHolder);
    });

HTML

<div class="panel panel-default">
  <div class="panel-heading main">
    <h4 class="panel-title">
      <a class="accordion-toggle collapsed main side-js" data-parent="#main-panel" data-panel="00" data-toggle="collapse" href="#panel-00">
        <span>0</span>Tellija kulud 
        <b>(<span class="cat-count">0</span>)</b>
        <i class="icon-angle-down"></i>
      </a>
    </h4>
  </div>
  <div id="panel-00" class="panel-collapse collapse">
    <div class="panel-body">

      <div class="panel-group" data-group-holder="00">

      </div>

    </div>
  </div>
</div>

<h3>Main groups</h3>
  <div class="row draggable-groups" data-group="00">
    <div class="col-md-6">
      <div class="main-groups" data-sort="01">01</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="02">02</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="03">03</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="04">04</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="05">05</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="06">06</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="07">07</div>
    </div>
    <div class="col-md-6">
      <div class="main-groups" data-sort="08">08</div>
    </div>
  </div>

Creating a jsFiddle would take too much time recreating this. I'm sorry for lacking it.

7
  • 1
    Were do you define $(that) ? In var removeClone = $(that).parents('div:eq(0)').remove(); Commented Oct 9, 2013 at 19:14
  • copy it to jsfiddler man. you don't need to write it. any way there is a big change at the code out the function and the code in the function. it's not the same. Commented Oct 9, 2013 at 19:17
  • @Sergio I fixed my first post. Thanks for noticing. Commented Oct 9, 2013 at 19:18
  • Can you post the html this code works on? Commented Oct 9, 2013 at 19:19
  • And were do you call addGroupAccordion() ? Commented Oct 9, 2013 at 19:20

1 Answer 1

2

Your issue likely comes down to an issue with trying to pass this

Give this a try:

function addGroupAccordion(self, dataSort, dataPlace, dataHtml) {
    ...
    var removeClone = $(self).parents('div:eq(0)').remove();
    ...
}

$(document).on('click','.draggable-groups .main-groups',function(){
    ...
    var self = this; // 'self' is more standardized
    addGroupAccordion(self, dataSort, dataPlace, dataHtml);
    ...
});

What is going on here is that when you were setting var that = $(this); in the $().on function, you were storing the jQuery object containing this, then when you were trying to use it in the addGroupAccordion function by using $(that), you were asking jQuery to do: $($(this)).

Sign up to request clarification or add additional context in comments.

1 Comment

I do believe this is true. I wasn't aware of "self", I'll try using this method. Until then I'll accept this answer, Thanks!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.