首页 > 代码库 > .NET前后台-JS获取/设置iframe内对象元素并进行数据处理

.NET前后台-JS获取/设置iframe内对象元素并进行数据处理

 

转载请注明出处:果冻栋吖

这个主要是修改H3BPM一个批量审批的功能时候做的。先看下图:
技术分享

H3自带了批量审批的功能,也就是按钮1,有审批意见3,但是如果3里边不填写内容点击1之后,效果就是表单里边没有任何内容。其次可以依次点击每个表单的提交按钮进行提交。会提交对应的审批意见。现在的需求是:增加一个按钮,但是需要提交所有流程的审批内容,因为他们并不可能完全一样。也就是这里的2。

前台HTML代码:

 

<asp:LinkButton ID="btnApproveone" runat="server" OnClientClick="btnAllsubmitted()">     <span class="fa fa-check toolImage"></span><span class="toolText">逐个审批</span></asp:LinkButton>

 

 主要是JavaScript代码,写了很长时间。第一版,效果是模拟每个任务的提交按钮,用JavaScript定位到对应按钮,然后点击他,这样有一个缺点,就是会默认提示是否提交表单。代码:

function btnAllsubmitted() {            console.log(idValues);            var strs = new Array(); //定义一数组             strs = idValues.split(";"); //字符分割             for (i = 0; i < strs.length; i++) {            //获取到每个流程的id            console.log(strs[i]);            var firstChild = $(‘#‘ + strs[i] + ‘ iframe‘)[0].contentWindow.$(‘#ctl00_divTopBars li:first‘);//用选择器的方式获取第一个子元素--这个当时卡住了            console.log(firstChild);            firstChild.click();            }        }

 这里使用了JS获取/设置iframe内对象元素、文档的几种方法---作为参照

这样如果批量审批n个就会提示n个窗口进行确认。

第二版,直接自己写代码进行提交操作,因为原来有一个审批通过全部的按钮,看他的逻辑。可以仿照写:JavaScript代码:

function btnAllsubmitted() {            console.log(idValues);            var idArr = new Array(); //定义一数组             var commentArr = new Array(); //定义一数组            idArr = idValues.split(";"); //字符分割            console.log(idArr);            for (i = 0; i < idArr.length; i++) {                var comment = ($($(‘#‘ + idArr[i] + ‘ iframe‘)[0].contentWindow.$(‘.panel-body textarea.inputMouseOut‘)[1]).val());                commentArr.push(comment);            }            console.log(commentArr);            console.log(idArr);            var jsonObj  = [];//创建json            for (var i = 0; i < idArr.length; i++) {                var id = idArr[i];                var comment = commentArr[i];                jsonObj.push({ "key": id, "value": comment });            }            submit(jsonObj);//提交操作            console.log(jsonObj);        }        function submit(jsonObj) {            console.log("submit");            console.log(JSON.stringify(jsonObj));            $.ajax({                url: ‘MyWorkItemByBatch.aspx?method=submit‘,                type: ‘POST‘,                data: JSON.stringify(jsonObj),                dataType: ‘json‘,                success: function (dataInfo) {                    if (dataInfo.status) {                        window.opener.location.reload();                        window.opener = null;                        window.open(‘‘, ‘_self‘);                        window.close();                    } else {                        alert(dataInfo.msg);                    }                },                async: false            });        }

 意思就是:获取每个任务的ID并且获取他iframe下的审批意见对应的内容,这里这个获取也是用到了JavaScript的DOM树操作。重点!

获取到任务的id和审批意见之后,利用Ajax提交到后台进行处理。后台对应的代码:

protected void Page_Load(object sender, EventArgs e)        {            string method = Request.QueryString["method"];            if (!string.IsNullOrEmpty(method))            {                if (method == "submit")                {                    bool isok = false;                    CommonModel msg = new CommonModel();                    var sr = new StreamReader(Request.InputStream);                    var stream = sr.ReadToEnd();                    JavaScriptSerializer js = new JavaScriptSerializer();                    var list = js.Deserialize<List<jsonList>>(stream);                    if (list != null && list.Count > 0)                    {                        foreach (var item in list)                        {                            isok = mySubmitWorkItems(item.key, item.value);                            if (!isok)                            {                                break;                            }                        }                        if (!isok)                        {                            msg.status = false;                            msg.msg = "出现异常,请重试!";                            object JSONObj = JsonConvert.SerializeObject(msg);                            Response.Write(JSONObj);                            //一定要加,不然前端接收失败                            Response.End();                        }                        else                        {                            msg.status = true;                            msg.msg = "OK!";                            object JSONObj = JsonConvert.SerializeObject(msg);                            Response.Write(JSONObj);                            //一定要加,不然前端接收失败                            Response.End();                        }                    }                }            }        }

重点也是自己不会的地方:这里参考了ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据

if (!string.IsNullOrEmpty(method))            {                if (method == "submit")                {                    //获取传输过来的data                    var sr = new StreamReader(Request.InputStream);                    var stream = sr.ReadToEnd();                    JavaScriptSerializer js = new JavaScriptSerializer();                    var list = js.Deserialize<List<jsonList>>(stream);                    if (list != null && list.Count > 0)                    {                        foreach (var item in list)                        {                            ...........                        }                    }                }            }

这里就是H3的代码了,看不看都行

        /// <summary>        /// 逐个提交已经选中的工作任务        /// </summary>        /// <param name="selectedItems"></param>        /// <param name="commentText"></param>        /// <returns></returns>        private bool mySubmitWorkItems(string id, string comment)        {            string errors = null;            OThinker.H3.WorkItem.WorkItem item = this.Engine.WorkItemManager.GetWorkItem(id);            if (item == null || !item.IsUnfinished)            {                return false;            }            if (item.BatchProcessing == false)            {                errors += item.DisplayName + ";";                return false;            }            // 添加意见            this.AppendComment(item, OThinker.Data.BoolMatchValue.True, comment);            // 结束工作项            this.Engine.WorkItemManager.FinishWorkItem(                id,                this.UserValidator.UserID,                WorkItem.AccessPoint.Batch,                null,                null,                OThinker.Data.BoolMatchValue.True,                comment,                null,                WorkItem.ActionEventType.Forward,                (int)OThinker.H3.WorkSheet.SheetButtonType.Submit);            // 需要通知实例事件管理器结束事件            Messages.AsyncEndMessage endMessage = new OThinker.H3.Messages.AsyncEndMessage(                    Messages.MessageEmergencyType.Normal,                    item.InstanceId,                    item.ActivityCode,                    item.TokenId,                    OThinker.Data.BoolMatchValue.True,                    false,                    OThinker.Data.BoolMatchValue.True,                    true,                    null);            this.Engine.InstanceManager.SendMessage(endMessage);            return true;        }

 类代码

    class CommonModel    {        //状态        private bool _statues;        public bool status        {            get { return _statues; }            set { _statues = value; }        }        //消息        private string _msg;        public string msg        {            get { return _msg; }            set { _msg = value; }        }        //数据        private object _data;        public object data        {            get { return _data; }            set { _data =http://www.mamicode.com/ value; }        }    }    public partial class jsonList    {        public string key { get; set; }        public string value { get; set; }    }

 

.NET前后台-JS获取/设置iframe内对象元素并进行数据处理