Как обнаружить onchange в цикле с помощью jquery

#javascript #jquery #onchange

#javascript #jquery #onchange

Вопрос:

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

После того, как это будет сделано, я хочу разделить каждую группу координат на основе entrance. Я сохраняю 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);
});
  

Комментарии:

1. Если вы решили свою проблему, вы можете опубликовать ответ на свой собственный вопрос, а затем принять ответ. Это официально «закроет» вопрос и поможет другим в будущем, чтобы они знали, что есть решение этой проблемы.

Ответ №1:

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

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

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

Комментарии:

1. Ну, у меня есть это, но в этом проблема. Что я пытаюсь сделать, так это это. Я беру имя входа из входных данных в клонированной форме и сохраняю массив координат в этом имени свойства. Проблема в том, что он сохраняет все значения из массива в свойство entrance.

2. Итак, моей первой мыслью было сравнить ent_name с предыдущим именем, чтобы увидеть, отличаются ли они, но значение меняется каждый раз в цикле, поэтому это было невозможно. Я полагаю, что мне просто не хватает какой-то простой логики здесь.

3. Я заметил одну простую вещь… вероятно, вам следует добавлять свой клонированный div к #entrances , а не #ent

4. Кроме того, поскольку вы создаете уникальный идентификатор для содержащего div, я бы рекомендовал использовать его в качестве ключа для вашего хранилища данных, а не имя, которое кто-то вводит для входа в поле ввода. Это гарантированно уникально, в то время как человеческие данные — нет.

5. Я не могу добавить их к #entrances, потому что каждый раз, когда я делаю клонирование, это удваивает количество блоков, поскольку клонируется #ent. Я решил свою проблему через слишком много часов. Я опубликую это выше. Спасибо вам за помощь, я действительно ценю это.

Ответ №2:

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

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

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

    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;
                    }
  

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

Приветствия! Крысиный