jQuery достигает document.ready(), несмотря на вызов .holdReady(). Ошибка Slickgrid - ошибка Slick не определена (5 вне диапазона 4) - зависимости

В следующем скрипте, использующем jQuery и slickGrid, я продолжаю получать сообщение об ошибке Slick is not defined (5 out of range 4) или Slick is not defined (6 out of range 4) - как в FireBug, так и в Chrome я получаю:

Uncaught ReferenceError: Slick is not defined
$.ready.$.css.opacity
f.Callbacks.o jquery-1.7.2.min.js.php:2
f.Callbacks.p.add jquery-1.7.2.min.js.php:2
e.fn.e.ready jquery-1.7.2.min.js.php:2
(anonymous function)
e.extend.globalEval jquery-1.7.2.min.js.php:2
e.extend.globalEval jquery-1.7.2.min.js.php:2
f.fn.extend.domManip jquery-1.7.2.min.js.php:4
e.extend.each jquery-1.7.2.min.js.php:2
f.fn.extend.domManip jquery-1.7.2.min.js.php:4
f.fn.extend.append jquery-1.7.2.min.js.php:3
f.fn.extend.html jquery-1.7.2.min.js.php:4
e.extend.access jquery-1.7.2.min.js.php:2
f.fn.extend.html jquery-1.7.2.min.js.php:4
$.ajax.success AJAX.js:26
f.Callbacks.o jquery-1.7.2.min.js.php:2
f.Callbacks.p.fireWith jquery-1.7.2.min.js.php:2
w jquery-1.7.2.min.js.php:4
f.support.ajax.f.ajaxTransport.send.d jquery-1.7.2.min.js.php:4
FBL.ns.handleStateChange

Однако, если я закомментирую var grid = new Slick.Grid("#myGrid", data, columns, options);, скрипт будет работать нормально. Я подтвердил, что все сценарии загружаются, вплоть до срабатывания оповещений в каждом из них. Также в Firebug/Chrome я читаю загруженные скрипты, и они кажутся правильными. Есть ли что-то, что я мог упустить из виду? Код страницы выглядит следующим образом:

<link type="text/css" rel="stylesheet" href="css/slick.grid.css" />
<link type="text/css" rel="stylesheet" href="css/surge.slickGrid.css" /> 
<link type="text/css" rel="stylesheet" href="css/jquery.calendarPicker.css" />  
<link type="text/css" rel="stylesheet" href="css/cupertino/jquery-ui-1.8.20.custom.css" />

    <div style="position:relative; overflow:visible; margin:25px 0 0 0;">
        <div id="loader" style="position:absolute; z-index:997;top: 62px; left:200px;"><img src="images/loading.gif" border="0" /></div>

        <div id="dateInput" style="visibility:hidden;"><p><label for="datepicker">Date: </label><input type="text" id="datepicker" size="30"/></p>

    </div>
        <div id="myGrid" style="width:900px;height:200px;visibility:hidden;"></div> 
    </div>

      <div class="options-panel">
        <h2>Instructions:</h2>
        <ul>
          <li>Select the date by clicking the date image above the table</li>
          <li>Enter your event data (you can enter multiple events for that date)</li>
          <li>To add another event, hit your <em>TAB</em> key and a new row will be created</li>
          <li>When you're all done for this date, click the <em>Commit Changes</em> button to have your events saved to the site</li>
        </ul>

        <h2>Options:</h2>

<button>Commit Changes</button>
      </div>



<script type="text/javascript" src="js/jquery-ui-1.8.20.custom.min.js.php"></script>
<script>
$.getScript("js/slickGrid/slick.grid.js");
    $.getScript("js/slickGrid/surge.core.js");
        $.getScript("js/slickGrid/surge.slickGrid.js"); 
            $.getScript("js/jquery.calendarPicker.js"); 
                $.getScript("js/jquery.json-2.3.min.js");   


</script>

<? //Instantiate   slickGrid jQueryUI widget ?>
<script>
$(document).ready(function(){
    alert('Ready');
    //======== if I comment the following line out, the script completes without error =======
    var grid = new Slick.Grid("#myGrid", data, columns, options);


    $(function() {
        $( "#datepicker" ).datepicker();

            $( "#datepicker" ).datepicker( "option", "showAnim", "clip" );
    });
});

$(document).ready(function() {
    //Hide loading image div and show loaded jQuery modules
   $('#loader').hide();
   $('#dateInput').css({opacity: 0.0, visibility: "visible"}).animate({opacity: 1.0},"slow");
   $('#myGrid').css({opacity: 0.0, visibility: "visible"}).animate({opacity: 1.0},"slow");

});
</script>   
    <hr />EOP

Обновлена ​​последовательность загрузки скрипта

$.holdReady(true);
$.getScript("js/slickGrid/jquery.event.drag-2.0.min.js",function(){
    $.getScript("js/slickGrid/slick.core.js",function(){
        $.getScript("js/slickGrid/slick.grid.js",function(){
            $.getScript("js/slickGrid/surge.core.js",function(){
                $.getScript("js/slickGrid/surge.slickGrid.js",function(){
                    $.holdReady(false);
                    alert('Done Loading slicks'); 
                        var grid = new Slick.Grid("#myGrid", data, columns, options);
                        alert('After Grid created');
                        $('#myGrid').slickGrid({
                            forceFitColumns: true,
                            columns: [
                                { id: "venue", name: "Venue", field: "f_venue"},
                                { id: "eventName", name: "Event Name", field: "f_eventName" },
                                { id: "time", name: "Time", field: "f_time" },
                                { id: "pricing", name: "Pricing", field: "f_price" },
                                { id: "visible", name: "Visible", field: "f_visible", width: 20 }
                            ],
                            data: [
                              { f_venue: "Finn's", f_eventName: "Roy Rogers", f_time: "9pm", f_price: "$10 before 10", f_visible: 1 },
                            ]
                        });
                        alert('after data population');

                        var json = $.toJSON( $('#myGrid').slickGrid('data'));

                    }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception); });
            }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception); });
        }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception); });
    }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception) });//console.log( textstatus );
}).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception) });//console.log( textstatus );

Я пытаюсь загрузить серию файлов .js, которые зависят от предшествующего ему скрипта, успешно завершившего загрузку. Таким образом, я использую .getScript() (я открыт для ЛЮБЫХ других идей, потому что это становится трудным для устранения неполадок) для загрузки сценария, в случае успеха он загружает следующий или выводит ошибку на экран, и это повторяется до последнего сценария, который затем должен отображать сетку и разрешать запуск события $(document).ready(). Проблема в том, что ни то, ни другое не происходит. Похоже, что $.holdReady() ничего не делает, и хотя предупреждение («загрузка сликов завершена») срабатывает правильно, а консоль веб-разработчика больше не сообщает об ошибках, а скрипты загружаются в нужной мне последовательности, сетка не отображается, и событие $(document).ready() горит так, как будто $.holdReady() вообще не было. Любое дальнейшее понимание этой реализации поможет. Я знаю, что requireJS создан именно для этого (зависимостей), но я действительно не могу понять, как правильно использовать его в этом контексте.

ОБНОВЛЕНИЕ. Теперь все работает, кроме $.holdReady()

Все работает, кроме .holdReady(). Я сделал это спорным, создав экземпляр сетки в центре гнезда, поэтому он запускается только после успешного завершения всех сценариев. Работает хорошо и легче, чем requireJS. Хотя .getScript() не будет кэшировать и ВСЕГДА будет перезагружать файл с сервера. Можно заменить эти вызовы вызовами $.ajax() и включить кэширование для довольно значительного повышения производительности файлов, которые вы не часто меняете.

Я публикую окончательный вложенный скрипт на случай, если у кого-то возникнут проблемы с запуском slickGrid (документация ОТСТОЙКА для такого замечательного продукта!).

<script>$.holdReady(true);</script>  
<script  type="text/javascript" language="javascript" src="js/slickGrid/lib/firebugx.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.20.custom.min.js.php"></script>
<script src="js/slickGrid/plugins/slick.cellrangedecorator.js"></script>
<script src="js/slickGrid/plugins/slick.cellrangeselector.js"></script>
<script src="js/slickGrid/plugins/slick.cellselectionmodel.js"></script>
<script src="js/slickGrid/slick.formatters.js"></script>
<script src="js/slickGrid/slick.editors.js"></script>

<script>

    $.getScript("js/slickGrid/jquery.event.drag-2.0.min.js",function(){
        $.getScript("js/slickGrid/slick.core.js",function(){
            $.getScript("js/slickGrid/slick.grid.js",function(){

                        $.holdReady(false);
                        var grid;

                        var columns = [
                        { id: "VisitDate", name: "VisitDate", field: "VisitDate", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text },
                        { id: "VisitTime", name: "VisitTime", field: "VisitTime", width: 100, editor: Slick.Editors.Text },
                        { id: "PrimaryComplaint", name: "PrimaryComplaint", field: "PrimaryComplaint", width: 100, cssClass: "cell-right", editor: Slick.Editors.Text },
                        ];

                        var data = [
                            {
                            "VisitDate": "11/30/2009",
                            "VisitTime": "0117",
                            "PrimaryComplaint": "General malaise "
                            },
                            {
                            "VisitDate": "02/08/2010",
                            "VisitTime": "0930",
                            "PrimaryComplaint": "General malaise "
                            }
                        ];

                        var options = {
                        editable: true,
                        enableAddRow: true,
                        enableCellNavigation: true,
                        asyncEditorLoading: false,
                        forceFitColumns: true
                        };

                        // grid = new Slick.Grid($("#acs-work"), returnObj.source, columns, options);
                        //var $tabs = $('#tabset').tabs();
                        //var selected = $tabs.tabs('option', 'selected') + 1; // => 0[edit]
                        //var panelstr = "#panel" + selected;
                        //to load dynamic data
                        // PROTO: grid = new Slick.Grid($(panelstr), returnObj.source, columns, options); 
                        grid = new Slick.Grid("#myGrid", data, columns, options); 



                            $('#loader').hide();
                           $('#dateInput').css({opacity: 0.0, visibility: "visible"}).animate({opacity: 1.0},"slow");
                           $('#myGrid').css({opacity: 0.0, visibility: "visible"}).animate({opacity: 1.0},"slow");

            }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception); });
        }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception) });//console.log( textstatus );
    }).fail(function(jqxhr, settings, exception) {  document.write('FAILED: '+exception) });//console.log( textstatus );

person MaurerPower    schedule 01.06.2012    source источник


Ответы (1)


$.getScript запускает HTTP-запрос ajax, который не гарантирует разрешения и запуска до того, как документ будет «готов». Поэтому вполне вероятно (вероятно), что ваш $(document).ready(function(){...}); код запускается до того, как эти 5 $.getScript команд будут выполнены.

Я никогда не использовал $.getScript. Вместо того, чтобы ускорить загрузку сайта, просто переместите весь свой javascript в нижний колонтитул. Таким образом, страница будет загружаться до того, как она получит javascript. Это будет иметь тот же эффект, что и использование $.getScript, поскольку страница будет отображаться до загрузки javascript, но не будет выполняться асинхронно.

$.getScript Я бы предположил, что это когда вы хотите получить скрипт через ajax после действия пользователя или чего-то подобного, а не для ускорения загрузки страницы (именно для этого я предполагаю, что вы его используете).

person Thomas Clayson    schedule 01.06.2012
comment
Спасибо за ваш вклад, Томас. Хотя мне нужно разъяснение по паре вещей. Эта страница является центральным содержимым сайта, который использует статические страницы верхнего и нижнего колонтитула. Добавление в нижний колонтитул будет каскадным для всех моих других страниц, что на самом деле не то, что я хочу делать, поскольку эти скрипты довольно тяжелые для данных. Во-вторых, поместив его в нижний колонтитул, скрипты больше не загружаются асинхронно? Проблема их загрузки по порядку (или завершения их загрузки до создания объекта сетки) кажется критической. Я чувствовал, что .holdReady() звучит идеально, но я не могу заставить его работать... - person MaurerPower; 01.06.2012
comment
Под добавлением в нижний колонтитул я имею в виду размещение их как можно ниже. Чем больше контента перед сценариями, тем лучше. Если вы можете поместить некоторые сценарии в нижний колонтитул, сделайте это, в противном случае не беспокойтесь об этом. Предположительно, это не будут огромные сценарии. т. е. размер jquery составляет всего несколько килобайт, и наличие его в заголовке неплохо. Во всяком случае, суть в том, что я не совсем понимаю, почему вы пытаетесь загрузить скрипт асинхронно... как я уже сказал, $.getScript на самом деле используется только тогда, когда вы пытаетесь получить скрипт после действия пользователя или чего-то еще. - person Thomas Clayson; 01.06.2012
comment
Если вы просто загружаете скрипты при первой загрузке страницы, то нет причин, по которым вы не можете просто поместить их в теги скриптов в HTML и нормально загрузить. Если это огромные файлы, загрузка которых занимает много времени, поместите их в нижний колонтитул и добавьте оператор if, чтобы не загружать их на других страницах, кроме этой. - person Thomas Clayson; 01.06.2012
comment
когда я это делаю и просматриваю журнал NET в FireBug, он показывает, что все сценарии загружаются одновременно. Они НЕ загружаются в том порядке, в котором они перечислены, как файлы CSS. Я вложил их, так как мне нужен первый скрипт для ЗАВЕРШЕНИЯ загрузки, затем в функции успеха загрузите следующий, когда он успешно завершится, затем загрузите следующий. Обычно все эти сценарии можно было бы объединить в один, и код выполнялся бы последовательно. Однако на разных моих страницах используются разные модули, поэтому они разбиты. - person MaurerPower; 02.06.2012
comment
Причина, по которой я использую $.getScript(), заключается в следующем: $.getScript имеет обработчик событий, который срабатывает, когда скрипт успешно завершил загрузку, я использую его, чтобы начать следующую загрузку скрипта. Легче и не требует загрузки дополнительных скриптов (как использует RequireJS) для создания функциональных зависимостей. Очень хорошо могла бы быть лучшая функция для использования (на ум приходит $.ajax(), и она позволила бы мне кешировать), но я не знаю, что бы это было... Кроме того, функция $.getScript часть библиотеки jQuery, поэтому ни один из других скриптов не начнет загружаться, пока jQuery не завершится успешно. - person MaurerPower; 02.06.2012
comment
моя реализация getscript на самом деле ЗАМЕДЛЯЕТ загрузку страницы из-за отсутствия кэширования и принудительного завершения одного файла .js до того, как следующий даже начнет загрузку, это делается исключительно для решения проблем с зависимостями/порядком работы - person MaurerPower; 02.06.2012
comment
Я говорю НЕ ИСПОЛЬЗУЙТЕ $.getScript. Просто загрузите скрипты как обычно. Таким образом, они последовательны... и будут загружаться в порядке следования тегов <script>. Это лучший способ делать то, что вы хотите. НЕ ИСПОЛЬЗУЙТЕ $.getScript, вы используете его в неправильном контексте. - person Thomas Clayson; 02.06.2012
comment
см. 3 комментария выше. Мой журнал FireBug показывает, что все скрипты загружаются одновременно. Конечно, jquery больше остальных и загружается последним. Когда у меня были простые перечисленные теги <script>, они не загружались последовательно. Вот почему эта проблема возникла в первую очередь. Традиционно я всегда просто перечислял теги сценариев в порядке зависимости, и у меня редко возникали проблемы. Это один из очень немногих случаев, когда это представилось. И я не единственный, у кого есть эта проблема (поэтому и существует requireJS). - person MaurerPower; 03.06.2012
comment
Я очень ценю вашу помощь, Томас, и нашел рабочее решение, основанное на задокументированной проблеме с JavaScript. Все ресурсы jQuery/JavaScript, которые я нашел, перечисляют это как общую проблему для них и используют requirejS или метод, который я интегрировал в свой код выше. У меня просто были проблемы с его работой. Еще раз, я ценю время, которое вы уделили мне для помощи... - person MaurerPower; 03.06.2012
comment
Рад, что у вас есть ответ. :) - person Thomas Clayson; 06.06.2012