Как обнаружить onchange в цикле с помощью jquery - PullRequest
1 голос
/ 04 мая 2011

Возможно, это уже задавалось ранее, или, может быть, есть простой ответ на это решение, но я застрял в настоящее время У меня есть эта форма, которую можно увидеть на http://jsfiddle.net/DS73u/,, где пользователь может ввести координаты 3 различными способами с уникальным именем. Также может быть несколько входов, чтобы пользователь мог добавить больше входов в форму. Я перебираю все входные данные, отмеченные флажками, и сохраняю значения в массиве 2D. Где он хранит, что это за схема и значения координат. Таким образом, пользователь вводит 55.67484 и -86.7685, они сохраняются в массив и могут быть доступны с помощью temp [0] [0] = 55.67484 AND temp [0] [1] = -86.7685.

После этого я хочу разделить каждую группу координат на основе входа. Я сохраняю 2D-массив в свойстве объекта, где ent_name - это имя свойства. Хотя у меня проблема с разделением значений на основе имени входа, я не знаю, как его сравнить, поскольку все значения содержатся в цикле. Может быть, onchange () или change () будут работать в jquery? Значения текстовых полей никогда не меняются за слово ...

$(function() {

    /*
        This is where the magic happens when you click
        the "Preview Map" button
        It does several things...

        1.Loops through every checkbox in the #entrances
        2.Check to see if Entrance name has changed and store it into object with  array of coordinates
        2.Checks to see if the checkbox is checked
            a.Yes
                1.We see what checkbox is being checked
                to determine how we want to output the data
                inputted(Hence the switch)
                2.We grab the data from the form and store it
                into an array called coordinates
            b.No
                1.Do nothing
    */

    $('#prev_map').click(function() {

        //Make sure coordinates is empty before proceeding
        coordinates = {};
        temp = [];
        var ent_name;

        //console.log($('#entrances input:checkbox'));
        $('#entrances input:checkbox').each(function(){

            if (this.checked) {
                    //console.log($(this).parent('#coords').prevAll('input').val());
                    //coordinates.push($(this).parent('#coords').prevAll('input').val());
                    ent_name = $(this).parent('#coords').prevAll('input').map(function() {
                        console.log(ent_name);
                    }).get().change(function() {
                        console.log("We changed");
                    });
                    /*
                    ent_name = $(this).parent('#coords').prevAll('input').map(function() {
                        return $(this).val();
                    }).get();


                    console.log("Entrance Name: " + ent_name);
                    if (temp_name != ent_name) {
                        coordinates[temp_name] = temp;
                    } else {
                        temp = [];
                    };
                    var temp_name = ent_name;
                    console.log("Temporary Name: " + temp_name);*/

                switch(this.name) {

                    case "dec_coord":
                        temp.push($(this,'input').next().children('input').map(function() {
                            return $(this).val();
                        }).get());
                        break;
                    case "deg_coord":
                        var temp2 = $(this,'input').next().children("input,select").map(function() {
                            return $(this).val();
                        }).get().join(";");
                        //console.log(temp);
                        temp2 = temp2.toString();
                        temp2 = temp2.replace(";","°");
                        temp2 = temp2.replace(";","'");
                        temp2 = temp2.replace(";","\"");
                        temp2 = temp2.replace(";",",");
                        temp2 = temp2.replace(";","°");
                        temp2 = temp2.replace(";","'");
                        temp2 = temp2.replace(";","\"");
                        temp.push(temp2.split(","));
                        break;
                    case "utm_coord":
                        temp.push($(this,'input').next().children('input,select').map(function() {
                            return $(this).val();
                        }).get().join(","));
                        break;
                }

            } else {
                //console.log("wrong");
            };



        });

        $('#dialog').dialog({
            width: 500,
            height: 400,
            open: function() {
                //loadMap();
            }
        });
    });
    /*
            This is the replication of the Entrance Fields
            We will limit the number of entrances to 5
        */

        var template = $('#entrances .ent_clone:first').clone();
            var cloneCount = 0;

            var addEntrance = function(){
                cloneCount++;
                var entrance = template.clone().find(':input').each(function() {
                    var newID = this.id+cloneCount;
                    //$(this).prev().attr('for', newID);
                    this.id = newID;
                }).end()
                .attr('id', 'ent' + cloneCount)
                .appendTo("#ent");
            };
            $('#addEnt').click(addEntrance);
});

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

Что мне нужно было сделать, это добавить каждое ent_name в массив и значение зацикливания, чтобы сравнить их. , Итак, я сделал это:

   ent_name.push($(this).parent('#coords').prevAll('input').val());
   var testent = $(this).parent('#coords').prevAll('input').val();

После этого я создал оператор if, сравнивая 1-е значение массива с самым последним значением в цикле.

   if (ent_name[i].toString() != testent) 

После этого я сделал ent_name свойством объекта и добавил массив к этому определенному свойству со значениями.

   coordinates[ent_name[i]] = temp;

Затем я очистил временный массив, в котором хранились последние координаты.

   temp = [];

Наконец, я увеличил свою переменную сравнения до последнего значения ent_name, выполнив это:

   i = ent_name.length;

Вам нужно будет добавить координаты [ent_name [i]] = temp; после последнего цикла, чтобы вы могли сохранить последние элементы в объекте.

Таким образом, конечный код был таким:

        ent_name.push($(this).parent('#coords').prevAll('input').val());
    var testent = $(this).parent('#coords').prevAll('input').val();
                    //console.log(ent_name[i++]);
                    //console.log(ent_name);

                    //console.log(temp);
                    if (ent_name[i].toString() != testent) {
                        //console.log(temp);
                        console.log(ent_name);
                        coordinates[ent_name[i]] = temp;
                        temp = [];
                        i = ent_name.length;
                    }

Просто и глупо с моей стороны тратить столько времени, но я многому научился.

Ура! Ratty

0 голосов
/ 04 мая 2011

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

Если ent_name действительно является уникальным ключом, который вы не ожидаете изменить, возможно, это объект javascript:

var myEntrances = {};
...
myEntrances[ent_name] = temp;
...