gpt4 book ai didi

javascript - 加载表单时,如何在 Jenkins jelly 脚本中获取对 Builder 配置的表单元素的引用?

转载 作者:行者123 更新时间:2023-11-30 17:01:08 48 4
gpt4 key购买 nike

我正在编写一个 Jenkins Builder,在构建配置页面中用于配置的 jelly 脚本中,我有一些 Javascript,我想在加载表单时运行它,以进行服务器查找并获取一些信息以帮助用户退出他们的配置,这也将在用户更改表单的值时执行。

以前,我通过将 this 传递给 onchangeonkeyup 属性中的函数来获得对表单元素的引用。但是,现在即使表单没有更改,我也想运行一些脚本。

我知道我可以在表单元素上设置 ID 属性,但是如果用户使用此构建器将两个构建步骤添加到构建中,那将不起作用。

我已经尝试在我的构建器类上生成一个随机 ID,然后使用它来为元素构造 ID,并将其写入 jelly 文件中的一些 Javascript,这样我就可以在那里找到这些元素,但那并没有得到初始化直到用户保存,因此如果用户在不保存作业的情况下添加此构建器的两个实例,它将不起作用:

<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<f:entry title="Entry 1">
<f:textbox field="field1" id="${instance.id}-field1" onchange="fieldChanged('${instance.id}-field1')"/>
</f:entry>
<script type="text/javascript">
function fieldChanged(elementId) {
...
}

fieldChanged('${instance.id}-field1');
</script>
</j:jelly>

有没有关于如何做这类事情的约定? Jenkins/jelly 内置任何东西来支持同一个 jelly 文件的多个实例能够引用它们自己的元素?

最佳答案

有一个使用 j:set 的解决方案,它比我的其他答案更简单。

com.example.MyBuilder.DescriptorImpl:

private int lastEditorId = 0;
...
@JavaScriptMethod
public synchronized String createEditorId() {
return String.valueOf(lastEditorId++);
}

com/example/MyBuilder/config.jelly:

...
<j:set var="editorId" value="${descriptor.createEditorId()}" />
<f:entry title="Field">
<f:textbox field="field" id="field-${editorId}"/>
<p id="message-${editorId}"></p>
</f:entry>
<script>
setTimeout(function(){
var field = document.getElementById('field-${editorId}');
var p = document.getElementById('message-${editorId}');
p.textContent = "Initial value: "+field.value;
}, 50);
</script>

(调用setTimeout仍然是因为在添加新的构建步骤时,元素在脚本执行时还没有添加到DOM中,所以脚本执行必须稍微推迟)。

关于javascript - 加载表单时,如何在 Jenkins jelly 脚本中获取对 Builder 配置的表单元素的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834365/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com