Перемещение рабочего кода автозаполнения jQuery в центральный файл нарушает код

#jquery #jquery-ui

#jquery #jquery-ui

Вопрос:

Я работал и тестировал функциональность автозаполнения jQuery здесь, на моей тестовой странице, где она работает: http://www.problemio.com/test.php (просто введите «ho», чтобы увидеть, как это работает).

Когда я заставил его работать, я скопировал код в центральный JS-файл, который я импортирую. Затем он перестал работать, и вы можете видеть, что он перестал работать здесь, в 3-м поле формы: http://www.problemio.com/add_problem.php

Вот код, который я скопировал:

 function log( message ) 
{
    $( "<div/>" ).text( message ).prependTo( "#log" );
    $( "#log" ).scrollTop( 0 );
}

$( "#category_field" ).autocomplete({
    source: "/problems/get_categories_ajax.php",
    minLength: 2,
    select: function( event, ui ) 
    {
            log( ui.item ?
                ui.item.value :
                    "Nothing selected, input was "   this.value );
    }
});

$('#add_category').click(function() 
{
        alert ("in add category");
        // Now have to get value of the text entry area
        var category = $("#category_field").val(); // Works

        var text_area = $("#log").val();        
        alert ("text_area: "   text_area);

        // Should append to value of textarea what is in the category
        if ( text_area )
        {
            alert ("text area NOT EMPTY: "   text_area   " and category: "   category );
            text_area = text_area   " , "   category;    
        }
        else
        {
            //alert ("text area EMPTY: "   text_area   " and category: "   category );
            text_area = category;           
        }    

        // Now replace old text_area with new one
        $("#log").val(text_area); 

        // Now reset the text field
        $("#category_field").val("");
});

$('#category_form').bind('submit',function()
{
        // Get the variables
        var problem_id = 1;
        //var categories = $("#log").text();    
        var categories = $("#log").val();

        var dataString = 'problem_id='  problem_id   'amp;categories='   categories;
        alert ("Data string: "   dataString);

        // Now check if the problem_id or solution are empty
        if( !categories )
        {
            $('#categories_success').fadeIn(200).hide();
            $('#categories_error').fadeOut(200).show();         
        }   
        else
        {
            // Now check if the user is logged in
            $.ajax({
                    type: "POST",
                    url: "/auth/check_login.php",
                    dataType: "json",
                    success: function(data)
                    {
                        // If we are logged in, now can make a call to add the categories
                        $.ajax({
                            type: "POST",
                            url: "/problems/add_categories_ajax.php",
                            data: dataString ,
                            success: function(data)
                            {
                                $('#categories_success').fadeIn(200).show();
                                $('#categories_error').fadeOut(200).hide();     

                                $("#log").val("");
                            },
                            error: function(data)
                            {
                                alert ("error");
                                //if ( data.status == 200 )
                                //{
                                //       $('.add_message_success').fadeIn(200).show();
                                //       $('.add_message_error').fadeOut(200).hide();   

                                //       $('#comments').html(data);                     
                            //  }
                                //alert ("could not add attempted solution to the database");
                            }
                        });                     

                    } ,
                    error: function(data)   
                    {
                        // Error case for checking if user is not logged in
                        $("#loginpopup").dialog();

                        return false;
                    }   // End of error
            }); // End of the first AJAX call.                  
        }  // End of else in this AJAX jQuery call.     

        return false;
    }); 
 

Есть идеи, почему код сломался, когда я его скопировал? Консоль JavaScript показывает ошибку с некоторым css-файлом из библиотеки TinyMCE, который он не может найти, но в остальном все кажется нормальным.

Ответ №1:

Что происходит, так это то, что отсутствующий файл CSS, похоже, выдает ошибку при загрузке JS. Вероятно, TinyMCE нужен этот файл для работы, поэтому он может выдавать ошибку. Поскольку ошибка не обрабатывается, остальная часть вашего JS не выполняется, поэтому ваше автозаполнение никогда не подключается.

Вы можете подтвердить это, запустив свой код автозаполнения вручную в консоли браузера

 $( "#category_field" ).autocomplete({
    source: "/problems/get_categories_ajax.php",
    minLength: 2,
    select: function( event, ui ) 
    {alert ("1");
            log( ui.item ?
                ui.item.value :
                    "Nothing selected, input was "   this.value );
    }
});
 

Выполнение вышеуказанного в консоли активировало автозаполнение.

Вы можете исправить ошибку, убедившись, что файл CSS присутствует, или окружив вызов ошибки с помощью try / catch и восстановления.

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

1. Спасибо. Могу ли я окружить вызов импорта библиотеки блоком try / catch? Это типично? Кроме того, на тестовой странице отсутствует сообщение об ошибке, касающееся css, и если я поменяю код оттуда на problemio.js файл, который тоже разрывает эту страницу, хотя там нет библиотек TinyMCE.

2. Хммм, я просто предположил, что это TinyMCE выдает ошибку, потому что вы упомянули об этом. Похоже, что это может быть не так. Вы пробовали переносить вызовы пользовательского интерфейса jquery в document.ready()?

3. не совсем. Я новичок в jQuery, поэтому я не был уверен, как воспроизвести document.ready в том библиотечном файле, в который я помещаю код. Изначально у меня был код в оболочке document.ready.

4. Убедитесь, что все ваши пользовательские интерфейсы jquery и любые вызовы привязки событий завернуты в document.ready() . Либо это, либо переместите ваш скрипт в нижнюю часть страницы, чтобы убедиться, что страница загружается до активации скриптов.

5. как мне обернуть эти вызовы document.ready(), если они являются функциями в этой внешней библиотеке problemio.js — Я понимаю, что вы можете обернуть вещи только в document.ready на уровне страницы, не так ли?