ServiceNow - 从表单按钮单击事件调用客户端脚本以保存图像和标题

Posted

技术标签:

【中文标题】ServiceNow - 从表单按钮单击事件调用客户端脚本以保存图像和标题【英文标题】:ServiceNow - Call a client script from form button click event to save image and caption 【发布时间】:2021-03-18 10:22:55 【问题描述】:

我试图在 User(sys_user) 部分创建自定义功能以将照片和标题保存到自定义表中。我想保存照片和标题,并将所有上传的照片与标题一起显示为缩略图。但是当我尝试调用客户端脚本时,它甚至没有触发客户端脚本中的函数。以下是我遵循的步骤

    使用以下代码创建了一个 UI 宏
    <?xml version="1.0" encoding="utf-8" ?>
    <j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
    <div class="container">
        <g:ui_form>
        <h1>Choose an image file:</h1>
        <p>Supported file types: .jpg, .png, .bmp, .gif, .jpeg, .ico, .svg</p>
        <div class="row">
            <input name="site_photo_upload" id="site_photo_upload" type="file" class="upld-file" style="padding:20px;"></input>
        </div>
        <div class="form-group">
            <label class="control-label col-sm-2" for="fieldone" style="width:100px">Description</label>
            <div class="col-sm-10">
                <input type="text" name="site_photo_caption" id="site_photo_caption" class="form-control col-md-3" id="fieldone"
                    placeholder="Enter Description maximum 40 letters..." style="width:300px;height:75px;"></input>
            </div>
        </div>
    
    
    
        <div class="form-group" style="padding:20px;">
            <button id="btn_cancel">Cancel</button>
            <g:dialog_button id="btn_submit_site_photo" name="btn_submit_site_photo" onclick="saveValues()" type="button" class="btn">Upload</g:dialog_button>
        </div>
    </g:ui_form>
    
    </div>
    
    
    <div class="container" style="padding:30px 0;border-top:1px solid #ccc;">
        <div class="card-deck">
    
            <div class="col-xs-12 col-sm-6 col-md-6 col-lg-3 col-xl-3" style="padding:0;">
                <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
                    <img class="card-img-top" style="width:100%;" src="https://picsum.photos/309/200?image=1050"
                        ></img>
    
                    <p class="card-text" style="padding:10px 0;">caption placeholder</p>
    
                </div>
            </div>
    
            <div class="col-xs-12 col-sm-6 col-md-6 col-lg-3 col-xl-3" style="padding:0;">
                <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12">
                    <img class="card-img-top" style="width:100%;" src="https://picsum.photos/309/200?image=1050"
                        ></img>
    
                    <p class="card-text" style="padding:10px 0;">caption placeholder</p>
    
                </div>
            </div>
    
        </div>
    </div>
    </j:jelly>
    
    创建了一个格式化程序并通过“表单设计”在用户表单中添加了格式化程序。成功显示如下

    创建一个表“u_sitephoto”,其中包含site_photosite_photo_caption 列和一个引用列userid 到用户表

    创建一个'OnLoad'类型的客户端脚本

    function saveValues() 
        var site_photo = document.getElementById("site_photo_upload").value;
        var site_photo_caption = document.getElementById("site_photo_caption").value;
        var sitephoto_record = new GlideRecord('u_sitephoto');
        sitephoto_record.initialize();
        sitephoto_record.setValue('site_photo', site_photo);
        sitephoto_record.setValue('site_photo_caption', site_photo_caption);
        sitephoto_record.insert();
    
    

但点击上传按钮时出现以下错误

Uncaught ReferenceError: saveValues is not defined at htmlButtonElement.onclick

我想获得一些帮助来解决以下问题

    解决上述错误,并在按钮点击时触发客户端脚本

    使用该用户上传的所有照片重新加载图像缩略图(当前添加了一些占位符图像,如图所示)

    在取消按钮上单击删除所选照片以进行上传

提前感谢您的宝贵建议和帮助

【问题讨论】:

【参考方案1】:

尝试了解如何解决第一个问题。

UI 宏在服务器端呈现,因此它无法从客户端脚本中检索函数。 您可以直接在 UI 宏的&lt;script&gt; 标签中定义函数。 在函数内,使用GlideAjax调用后端Script Include,您可以在其中放置创建'u_sitephoto'表的新记录的代码。

顺便说一句,我使用的是巴黎版的 ServiceNow。

UI 宏中的示例函数:

function saveValues() 
    <!-- You could use $j to call JQuery in UI macro -->
    var site_photo = $j("#site_photo_upload").get(0).files[0];
    var site_photo_caption = $j("#site_photo_caption").val();
    
    var ajax = new GlideAjax('SitePhoneUtils');
    ajax.addParam('sysparm_name', 'savePhotos');
    ajax.addParam('sysparm_site_photo', site_photo);
    ajax.addParam('sysparm_photo_caption', site_photo_caption);
    ajax.getXML();

Script Include 中的示例函数 - SitePhoneUtils

savePhotos: function() 
    var site_photo = this.getParameter('sysparm_site_photo');
    var site_photo_caption = this.getParameter('sysparm_site_photo_caption');
    var gr = new GlideRecord('u_sitephoto');
    gr.initialize();
    gr.site_photo = site_photo;
    gr.site_photo_caption = site_photo_caption;
    gr.insert();

【讨论】:

以上是关于ServiceNow - 从表单按钮单击事件调用客户端脚本以保存图像和标题的主要内容,如果未能解决你的问题,请参考以下文章

C#如何将方法传递给基本的WinForm按钮单击事件

如何从 Jquery 对话框表单提交中调用父页面上的回发?

如何正确地将单击按钮属性值传递给表单提交事件?

如何使用 delay() 清除事件调用集

如何使用单击事件上的删除按钮从数据表中删除记录(通过鼠标选择)?

防止表单数据无效时单击多个(提交)按钮(vee-validate)