Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .
nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data
:
function synchronousCode() {
var getURL = function(url) {
return window.fetch(url).data.text().data;
};
var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
console.log('received bytes:',getURL(url).length);
};
nsynjs.run(synchronousCode,{},function(){
console.log('synchronousCode done');
});
Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):
var ajaxGet = function (ctx,url) {
var res = {};
var ex;
$.ajax(url)
.done(function (data) {
res.data = data;
})
.fail(function(e) {
ex = e;
})
.always(function() {
ctx.resume(ex);
});
return res;
};
ajaxGet.nsynjsHasCallback = true;
Шаг 2. Вставить синхронную логику в функцию:
function process() {
console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}
Шаг 3. Выполнить функцию синхронно через nnsynjs:
nsynjs.run(process,this,function () {
console.log("synchronous function finished");
});
Nsynjs будет оценивать все операторы и выражения шаг за шагом, приостанавливая выполнение в случае, если результат некоторой медленной функции не готов.
Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples
Вы должны понимать, что jQuery работает с деревом HTML DOM на стороне клиента. jQuery не работает непосредственно с компонентами JSF, как вы писали в исходном коде JSF, но jQuery работает непосредственно с деревом HTML DOM, которое создается этими компонентами JSF. Вам нужно открыть страницу в webbrowser и rightclick, а затем View Source . Вы увидите, что JSF добавляет идентификатор сгенерированных входных элементов HTML с идентификаторами всех родительских компонентов NamingContainer
(таких как <h:form>
, <h:dataTable>
и т. Д.) С :
как разделитель по умолчанию. Так, например,
<h:form id="foo">
<p:selectManyCheckbox id="bar" />
...
закончится сгенерированным HTML как
<form id="foo" name="foo">
<input type="checkbox" id="foo:bar" name="foo:bar" />
...
. Вместо этого вам нужно выбрать элементы точно . Однако :
является особым символом в CSS-идентификаторах, представляющих псевдоселектор. Чтобы выбрать элемент с идентификатором :
в идентификаторе с помощью селекторов CSS в jQuery, вам нужно либо избежать его с помощью обратного слэша, либо использовать селектор атрибутов [id=...]
или просто использовать старый getElementById()
:
var $element1 = $("#foo\\:bar");
// or
var $element2 = $("[id='foo:bar']");
// or
var $element3 = $(document.getElementById("foo:bar"));
Если вы видите автогенерированную часть j_idXXX
в идентификаторе, где XXX
представляет инкрементное число, тогда вы должны указать конкретному компоненту фиксированный идентификатор, поскольку инкрементное число является динамическим и может быть изменено в зависимости от того, физическое положение в дереве.
. В качестве альтернативы вы также можете просто использовать имя класса:
<x:someInputComponent styleClass="someClassName" />
, которое заканчивается в HTML как
<input type="..." class="someClassName" />
, чтобы вы могли получить его как
var $elements = $(".someClassName");
Это позволяет лучше абстрагироваться и повторно использовать. Разумеется, эти элементы не уникальны . Только основные элементы макета, такие как заголовок, меню, содержимое и нижний колонтитул, действительно уникальны, но они, как правило, обычно не находятся в NamingContainer
.
Как еще одна альтернатива, вы могли бы просто пройти сам элемент HTML DOM в функцию:
<x:someComponent onclick="someFunction(this)" />
function someFunction(element) {
var $element = $(element);
// ...
}
Вы также можете использовать jQuery «Attribute Contains Selector» (здесь находится url http://api.jquery.com/attribute-contains-selector/ )
Например, если у вас есть
<p:spinner id="quantity" value="#{toBuyBean.quantityToAdd}" min="0"/>
, и вы хотите что-то сделать на его объекте, вы можете выбрать его с помощью
jQuery('input[id*="quantity"]')
, и если вы хотите распечатать его значение, вы можете сделайте это
alert(jQuery('input[id*="quantity"]').val());
. Чтобы узнать реальный тег html элемента, вы всегда можете посмотреть на реальный элемент html (в этом случае счетчик был переведен на вход) с использованием firebug или, например, инструментов разработчика или просмотра источник ...
Daniel.
Если вы используете RichFaces
, вы можете проверить rich:jQuery
comonent. Он позволяет указать идентификатор стороны сервера для компонента jQuery
. Например, у вас есть компонент с указанным идентификатором сервера, тогда вы можете применить любой материал, связанный с jQuery
, следующим образом: <rich:jQuery selector="#<server-side-component-id>" query="find('.some-child').removeProp('style')"/>
.
Для получения дополнительной информации, пожалуйста, проверьте doumentation .
Надеюсь, что это поможет.
Посмотрите, что это поможет вам, когда я выбираю опыт = Да, мой диалог, id которого является dlg3, является popup.and, если значение No, оно не откроется