jQuery .ready () для формы infopath? - PullRequest
3 голосов
/ 28 июля 2011

У меня есть форма infopath, которую я хочу изменить через jQuery.Единственная проблема заключается в том, что он загружается после загрузки DOM-страниц, поэтому стандарт jQuery $(document).ready(handler); здесь не будет работать.Мой вопрос заключается в том, есть ли какой-нибудь способ получить $(infopath).ready(handler); некоторого вида или способ, возможно, подождать, пока форма infopath завершит загрузку, без использования стандартного setTimeout().

РЕДАКТИРОВАТЬ 1 : Таким образом, у вас есть больше информации, jQuery находится в веб-части редактора контента (CEWP), а форма Infopath находится в веб-части средства просмотра форм Infopath.

Я знаю, используя jQuery или javascriptс infopath не является стандартной практикой, к сожалению, она необходима в этой ситуации из-за неидеальной функциональности из многократных элементов управления infopath, обсуждаемых далее в этом вопросе .

РЕДАКТИРОВАТЬ 2: Из того, что я могу сказать, и я вполне могу ошибаться, у sharepoint есть файл js с именем core.js, который, похоже, обладает функциональностью для загрузки через AJAX формы infopath на страницу.Можно ли как-нибудь настроить функцию jQuery на выполнение после завершения выполнения удаленного файла javascript?

Ответы [ 7 ]

3 голосов
/ 13 августа 2013

Есть лучший способ, в зависимости от вашего контекста. Мое требование - перехватить обработчик click в моей форме InfoPath Сохранить и выполнить дополнительную проверку, которую сложно выполнить в InfoPath. Как говорится в вопросе, невозможно использовать обычную функцию jQuery $() напрямую, потому что форма не загружается в этот момент.

Существует обходной путь . SharePoint предоставляет массив JavaScript _spBodyOnLoadFunctionNames, и в этот массив могут быть добавлены функции инициализации. Если поместить функцию в массив, она будет вызвана после загрузки формы InfoPath:

$(function(){
    if (window.location.pathname.match(/Item\/(new|edit)ifs\.aspx/i)){
        _spBodyOnLoadFunctionNames.push('CustomInfoPathInit');
    }
});

function CustomInfoPathInit(){
    $(document).on('focusin', 'input[value="Save"]', function(event){
        $(this).attr('onclick', null); // remove standard handler
        $(this).off('click').on('click', function(){
            alert('click');
        });
        return (Button.OnClick(this, event)); // original click handler
    });
}

Причина, по которой я использую $(document).on('focusin', function(event){..., заключается в том, что любые обратные передачи из формы (например, когда форма отображает Отправка данных на сервер ... ) приведут к обновлению формы и любым связанные обработчики будут удалены. Использование метода jQuery $(document).on('focusin',...) решает эту проблему, а использование события focusin позволяет удалить оригинальный обработчик нажатия кнопки, а новый повторно присоединить.

3 голосов
/ 24 января 2012

Попробуйте вот так: в FormServer.aspx, чуть выше , поместите это:

<script type="text/javascript">
    _InfoPath.OnLoad2 = function() {
        _InfoPath.OnLoad();
        //Here I will put my custom javascript code, which will be invoked after loading InfoPath form
    }
    window.onload = _InfoPath.OnLoad2;
</script>

Мой ответ также здесь: Как проверить, была ли загружена форма InfoPath (в javascript)

2 голосов
/ 30 октября 2013

Я использовал таймер, который проверяет, появилась ли метка в форме InfoPath в DOM:

var InfoPathCheck;

$(document).ready(function(){
    InfoPathCheck = setInterval(function() {  //Wait for InfoPath to finish loading
        HasInfoPathLoaded();
    }, 200);
});

function HasInfoPathLoaded() {
    var testDiv = $('h4 span:contains("Photo")').html();
    if (testDiv) {
        clearInterval(InfoPathCheck);
        // Do stuff with the InfoPath form here....
    }
}
0 голосов
/ 11 августа 2011

У меня есть идея, но нет времени ее попробовать.Как насчет обнаружения XDocument.OnLoad в jscript, а jscript помещает значение в скрытый ввод.И тогда JavaScript обнаруживает событие.Я думаю, что это будет работать в IE, но, возможно, не в других браузерах.

0 голосов
/ 10 августа 2011

Если поиск кода в коде infopath (каким бы он ни был) не удался, вы можете сами создать событие.Напишите функцию, которая каким-то образом проверяет состояние «выполнено» с помощью jQuery и либо запускает событие, либо перепланирует себя для повторного запуска через 200 мс.

Затем напишите свой обработчик событий обычным способом.Если вы когда-нибудь найдете лучший способ, вам просто нужно заменить первую часть.

0 голосов
/ 09 августа 2011

Вы смотрели на XDocument.Onload Событие?

Согласно документации API, это происходит "после загрузки формы Microsoft Office InfoPath 2007, но до инициализации любых представлений" .

Кроме того, взгляните на эту публикацию , в которой говорится о добавлении обработчика onLoad в процесс onLoad в SharePoint.

0 голосов
/ 05 августа 2011

Я не знаю, является ли это вашей проблемой или нет, но если после загрузки функции $ (document) .ready все еще загружается, попробуйте функцию $ (window) .load.Это срабатывает после того, как все ваши библиотеки, картинки, стили и другие вещи закончили загрузку.

...