head js + jquery.validate.unobtrusive + пользовательские валидаторы - PullRequest
1 голос
/ 10 октября 2011

Я использую head.js (http://headjs.com) для асинхронной загрузки моих javascripts.

У меня проблема с jquery.validate.unobtrusive и пользовательскими валидаторами

Все пользовательские проверки должны быть загруженыпосле jquery.validate и jquery.validate.unobtrusive, и я делаю это следующим образом:

<head>
    <script src="@Url.Script("jquery")"></script>
    <script src="@Url.Script("head.load")"></script>
</head>
<body>
<!-- entire markup -->
    <script>
    head.js("@Url.Script("jquery.validate")", function () {
            head.js("@Url.Script("jquery.validate.unobtrusive")", function () {
                    head.js("@Url.Script("custom-validations")");
                });                
        });
    </script>
</body>

Проблема в том, что скрипт custom-validations должен быть загружен после jquery.validate.unobtrusive, но до события document.onready, потому что jquery.validate.unobtrusive использует document.onready для создания чёрной магии. Но когда я использую событие head.js document.onready, запускаемое до загрузки скриптов, и моя пользовательская проверка не работает.

Есть ли какие-либо общиерешения / обходные пути для решения проблем такого рода с загрузкой асинхронных скриптов?

Еще одна проблема, которую мой клиент не хочет видеть jquery.validate / jquery.validate.onubtrusive в теге <head>.


@Url.Script - вспомогательный метод для поиска js-файлов.

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Я нашел решение сам. Необходимо использовать jQuery.holdReady () для хранения «document.ready», в то время как все сценарии, зависящие от jquery.validate.unobtrusive, не будут загружаться.

<head>
    <script src="@Url.Script("jquery")"></script>
    <script src="@Url.Script("head.load")"></script>
</head>
<body>
<!-- entire markup -->
    <script>
        head.js("@Url.Script("jquery.validate")", function () {
            $.holdReady(true); // set semaphore for dom ready. 
            head.js("@Url.Script("jquery.validate.unobtrusive")", function () {
                    head.js("@Url.Script("custom-validations")", function () { //fires when all provided scripts are loaded
                        $.holdReady(false); // release semaphore and fire event
                    });
            });                
        });
    </script>
</body>
0 голосов
/ 17 октября 2011

Это должно работать:

head.ready("@Url.Script("jquery.validate")", function () {
    head.ready("@Url.Script("jquery.validate.unobtrusive")", function () {
        head.ready("@Url.Script("custom-validations")",function(){
            // your code here
        });
    });                
});

Если вы используете jquery, вы можете добавить сценарии с помощью метода getScript, который запускает обратный вызов при загрузке сценария, что может помочь:

$(document).ready(function(){
    $.getScript("@Url.Script("jquery.validate")",function(){
          $.getScript("@Url.Script("jquery.validate.unobtrusive")",function(){
              $.getScript("@Url.Script("custom-validations")",function(){
                  // do your stuff here
              });
          });
    });
});
0 голосов
/ 15 октября 2011

Попробуйте $ .validator.unobtrusive.parse ('# the_form_in_question') после загрузки.

...