Грешка: „този“ обект е неправилен; В събитие за щракване в JQuery - Неочаквано поведение при щракване

Опитвам се да добавя бутон „Отказ“ към някакъв съществуващ HTML и jQuery код, който има някои ajax извиквания. Имам работещ бутон „Отказ“, но той спря част от поведението на моя бутон „Редактиране“. Изглежда не мога да разбера защо събитието за кликване на jQuery не работи. Във Firefox получавам:

Игнориране на get или набор от свойства, които имат [LenientThis], тъй като обектът „this“ е неправилен.

РЕДАКТИРАНЕ: Наясно съм, че горната грешка е специфична за Firefox Dev, която вероятно не е свързана с моя код.

Въпреки това не виждам проблем с използването на this или функцията, която трябва да бъде извикана, когато се щракне върху бутона „Редактиране“. Всъщност имам същата функция за щракване „Редактиране“, работеща върху друг модул на същата страница.

Ето моя jQuery:

$('#edit_stuff').click(function(){
        if($(this).html() == 'Edit') {
            $('#stuff .data').each(function () {
                var contents = $(this).html();
                var input = document.createElement('input');
                $(input).addClass('form-control');
                input.value = contents;
                // $(input).val(contents);
                $(this).html('');
                $(this).append(input);
                flag = true;
            });

            // Show Cancel button and 'Save' button when 'Edit' is clicked
            $('#cancel_stuff').show();
            $(this).html('Save');
        }
        else{
            var list = [];
            $('.info_display div.stuff_holder div.data_container').each(function(){
                flag = true;
                console.log(this);
                var inputs = $(this).children('div').children('input');
                console.log(inputs);
                var history = {
                    'title': inputs[0].value,
                    'description': inputs[1].value
                };
                list.push(history);
            });

            $.ajax({
                url: '../save_data',
                data: {honors: JSON.stringify(list)},
                success: function(data){
                    $('#stuff div.data').each(function () {
                        var contents = $(this).children('input')[0];
                        var val = contents.value;
                        $(this).html(val);
                    });

                    // Fill the DIV with ID stuff_holder with the new data and save in stuffData
                    $('#stuff_holder').data('stuffData', $('#stuff_holder').html());
                    // Hide the Cancel button and show 'Edit' when form has been saved
                    $('#cancel_stuff').hide();
                    $('#edit_stuff').html('Edit');
                    // Do not display X after 'Save' has been clicked
                    flag = false;
                },
                error: function(){
                    alert("Failed to save your stuff.  Please contact the system administrator.");
                }
            });
        }
    });

Сега имам много повече персонализирани jQuery функции, но това е тази, с която имам проблем. Мога да публикувам още, ако това не помогне. Моята функция за бутона „Отказ“ е отделна, която основно клонира HTML, преди да щракнете върху „Редактиране“, и след това замества HTML, ако потребителят натисне „Отказ“. Ако смятате, че трябва да публикувам и тази функция, уведомете ме.

HTML за това:

<div class="panel-heading">
    {% if request.user == some.user %}
    <span class="edit_info" id="edit_stuff">Edit</span>
    <!-- Added Cancel button -->
    <span class="cancel_edit" id="cancel_stuff">Cancel</span>
    {% endif %}
    <div class="panel-title">STUFF</div>
    <hr class="info-card" />
</div>
<div class="panel-body" id="stuff">
    <div class="stuff_holder" id="stuff_holder">
        {% for stuff in some.stuff.all %}
            <div class="data_container">
                {% if request.user == some.user %}<i class="fa fa-remove" style="display: none; color: red; position: relative; top: 0px; float: right; cursor: pointer;" id="stuff_{{ stuff.id }}"></i>{% endif %}
                <div class="stuff-title data">{{ stuff.stuff }}</div>
                <div class="stuff-description data">{{ stuff.description }}</div>
                {% if not forloop.last %}

                {% endif %}
            </div>
        {%  endfor %}
    </div>
    {% if request.user == some.user %}
        <button class="btn btn-success" style="float: right;" id="add_stuff"><i class="fa fa-plus"></i></button>
    {% endif %}
</div>

Почти един модул се показва с бутон „Редактиране“ (бутонът „Отказ“ е скрит). Когато щракнете върху „Редактиране“, се предполага, че се инжектират две полета за въвеждане, едно за заглавие, едно за описание, в модула. Бутонът „Редактиране“ се заменя със „Запазване“ и бутонът „Отказ“ става видим. Всичко работи с изключение на инжектирането на двете полета за въвеждане, когато щракнете върху „Редактиране“. Това трябва да се случи в първата част на функцията за събитие .click. Опитах се да променя this на #edit_stuff, без разлика.

Аз съм доста нов в използването на програми за отстраняване на грешки в JavaScript, като този във Firefox, така че наистина не стигам доникъде. Така че, ако нечие предложение включва как мога да отстраня грешките си сам, това би било чудесно. Както можете да видите, това е част от уеб проект на Python и jQuery не е моят силен език. Благодаря предварително!

РЕДАКТИРАНЕ: Имам чувството, че някои от другите ми jQuery функции се забъркват с тази функция .click(), която имам за #edit_stuff ID. Не искам да публикувам целия си код точно сега, така че ако го разбера, преди някой да може да ме насочи към това, което пропускам, тогава ще го публикувам тук.


person Charles Williams    schedule 24.02.2015    source източник
comment
Дава ли ви ред, където възниква грешката?   -  person Ray Suelzer    schedule 24.02.2015
comment
Опитайте да промените този ред: ` input.value = contents;` на $(input).val(contents)   -  person Ray Suelzer    schedule 24.02.2015
comment
@RaySuelzer - Дебъгерът ми дава само script.js:3505:0 във файла script.js, който Firefox използва.   -  person Charles Williams    schedule 24.02.2015
comment
@RaySuelzer - Няма разлика. Мисля, че това наистина ще работи и в двата случая.   -  person Charles Williams    schedule 24.02.2015
comment
Съобщението за грешка не е по ваша вина   -  person Bergi    schedule 25.02.2015
comment
Е, прочетох нещо подобно, докато търсех, че грешката не е грешка в кода; това обаче не решава проблема ми. Все още не получавам полетата за въвеждане, когато щракна върху редактиране.   -  person Charles Williams    schedule 25.02.2015


Отговори (1)


Добре, това може да е наистина глупаво, но аз реших собствения си проблем и не беше това, което мислех, че ще бъде. Имам вграден JavaScript в моя HTML файл с шаблон на python и използвах PyCharm. Тъй като това е първият път, когато внедрявам jQuery в PyCharm, не разбрах, че автоматизираните кавички, които PyCharm използва за коментиране на код за Django, не са изключени във файловете на шаблона, особено в маркерите на скрипта. Така че, тъй като имах {# #} етикети за цитати в моя шаблонен файл, причинени от доверието на горещия клавиш за коментари на PyCharm, това не позволяваше на моя jQuery код да работи. В действителност PyCharm трябва да може да разпознае, че това е jQuery код и да използва подходящите блокове за коментари (// или /* */ за JavaScript), когато маркирате и щракнете върху CTRL+/.

Отново. Моя грешка там. Ето моя завършен код, който работи (в случай, че някой иска да знае):

$('#edit_stuff').click(function(){
        // Check to see if the user has any stuff already added
        if ($(this).html() == 'Edit') {
            // Check for flag to activate .mouseenter and .mouseleave events
            $('.data_container').mouseenter(function () {
                if(flag)
                    $(this).children('i').css('display', 'block');
            });
            $('.data_container').mouseleave(function () {
                if(flag)
                    $(this).children('i').css('display', 'none');
            });
            $('.fa-remove').click(function () {
                $(this).parent().remove();
            });
            // Set flag to allow stuff removal
            flag = true;
            // If the user does not have any stuff added, launch #add_stuff .click function
            if($('#stuff_holder').find('div.data_container').length == 0) {
                $(this).html('Save');
                // Show Cancel button and 'Save' button when 'Edit' is clicked
                $('#cancel_stuff').show();
                $('#add_stuff').click();
            } else {
                $('#stuff .data').each(function () {
                    var contents = $(this).html();
                    var input = document.createElement('input');
                    $(input).addClass('form-control');
                    // input.value = contents;
                    $(input).val(contents);
                    $(this).html('');
                    $(this).append(input);
                });
                $(this).html('Save');
                // Show Cancel button and 'Save' button when 'Edit' is clicked
                $('#cancel_stuff').show();
            }
        } else {
            var stuff_list = [];
            $('.user_info_display div.stuff_holder div.data_container').each(function(){
                console.log(this);
                var inputs = $(this).children('div').children('input');
                console.log(inputs);
                var history = {
                    'title': inputs[0].value,
                    'description': inputs[1].value
                };
                stuff_list.push(history);
            });

            $.ajax({
                url: '../save_user_data',
                data: {stuff: JSON.stringify(stuff_list)},
                success: function(data){
                    $('#stuff div.data').each(function () {
                        var contents = $(this).children('input')[0];
                        var val = contents.value;
                        $(this).html(val);
                    });

                    // Set flag
                    flag = false;
                    $('#edit_stuff').html('Edit');
                    // Hide the Cancel button and show 'Edit' when form has been saved
                    $('#cancel_stuff').hide();
                    // Fill the DIV with ID stuff_holder with the new data and save in stuffData
                    $('#stuff_holder').data('stuffData', $('#stuff_holder').html());
                },
                error: function(){
                    alert("Failed to save your stuff.  Please contact the system administrator.");
                }
            });
person Charles Williams    schedule 26.02.2015