h: commandLink не запускает событие form.submit - PullRequest
1 голос
/ 27 сентября 2011

Когда моя страница загружена, я выполняю следующий JS-скрипт, который я использую для отображения всплывающего сообщения (пожалуйста, подождите ...) при отправке любой формы.

jQuery(function(){
  jQuery("form").submit(function(){jQuery('#wait-link').trigger('click');return true;});
});

Это прекрасно работает при использовании h: commandButton , однако, когда я использую тег h: commandLink , он не работает, потому что форма отправляется с помощью java-скрипта (из файла jsf.js в jar jsf-impl.jar), как показано ниже

mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
  mojarra.apf(f, pvp);
  var ft = f.target;
  if (t) {
    f.target = t;
  }
  f.submit();
  f.target = ft;
  mojarra.dpf(f);
};

Чтобы решить эту проблему, я скопировал файл jsf.js в WEB-INF / resources / javax.faces / jsf.js и изменил его, чтобы вызвать метод отправки формы с использованием jQuery.Это прекрасно работает, но:

1) Мне не нравится тот факт, что я касаюсь файла jsf.js , поскольку он может измениться в более новых выпусках JSF.

2) Мне не нравится тот факт, что я использую jQuery внутри файла jsf.js .

Есть ли лучшее решение для решения этой проблемы?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Вы должны использовать jsf.ajax.*, так как это стандарт как часть спецификации JSF2. Там у вас есть, например, jsf.ajax.addOnEvent(callback), который делает то, что вы хотите.

После того, как вы подключите слушателя, вы можете использовать столько jQuery, сколько захотите.

Обновление:

Если вы хотите перехватить его у своего JS, не касаясь их вещей, вы можете сделать:

(function() {
    var oldjsfcljs = mojarra.jsfcljs;

    mojarra.jsfcljs = function() { 
        console.log('my stuff before');
        oldjsfcljs.apply(this, arguments);
        console.log('my stuff after');
    }
})();
1 голос
/ 27 сентября 2011

Поскольку Бодган предложил лучшее решение - выполнить следующий фрагмент кода при загрузке страницы, я не знаю, что такое термин в JS, но мне кажется, что это переопределение.

jQuery(function(){
  var oldjsfcljs = mojarra.jsfcljs; // save a pointer to the old function

  mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
    jQuery(jq(f.id)).trigger('submit');
    oldjsfcljs.apply(this, arguments);
  };
});

function jq(myid) {
  return '#' + myid.replace(/(:|\.)/g, '\\$1');
}

Примечание: метод jq () используется только для экранирования специальных символов в идентификаторе формы.

update: приведенный выше код работает, но если у вас есть параметры в форме, он не будетпоэтому мне пришлось переписать функцию mojarra.jsfcljs следующим образом:

jQuery(function(){
  mojarra.jsfcljs = function jsfcljs(f, pvp, t) {
    mojarra.apf(f, pvp);
    var ft = f.target;
    if (t) {
      f.target = t;
    }

    // trigger the submit event manually.
    jQuery(jq(f.id)).trigger('submit');

    f.submit();
    f.target = ft;
    mojarra.dpf(f);
  };
};
...