.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 > )
{
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 > )
{
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 = value; }
}
}
public partial class jsonList
{
public string key { get; set; } public string value { get; set; }
}
.NET前后台-JS获取/设置iframe内对象元素并进行数据处理的更多相关文章
- JS获取/设置iframe内对象元素、文档的几种方法
1.IE专用(通过frames索引形象定位): document.frames[i].document.getElementById('元素的ID'); 2.IE专用(通过iframe名称形象定位): ...
- 【转】获取/设置IFRAME内对象元素的几种JS方法
1.IE专用(通过frames索引形象定位): document.frames[i].document.getElementById('元素的ID'); 2.IE专用(通过IFRAME名称形象定位): ...
- 设置iframe内表单target属性以兼容IE、Firefox【转载】
设置iframe内表单target属性以兼容IE.Firefox[转载] 2011年11月19日 haibor 今天有客户反应,在一产品网站的资源下载页面,用户登录提交后页面无反应! 经测 ...
- 获取子iframe框架的元素
我们常常遇到使用iframe框的时候,该iframe框不能根据自己内部的内容撑起来的这种问题 必要条件:不能在跨域的情况下...本地可以放到localhost下进行测试 //父页面index.html ...
- 获取iframe内的元素
$("#iframeID").contents().find("#index_p") 2获取父窗体的值 $('#father', parent.document ...
- js获取当前iframe的ID
self.frameElement.getAttribute('id');其他属性也可以通过这种方式获取. 也可以通过 window.frameElement.id 获取当前iframe的ID
- Js脚本选取iframe中的元素
遇到个小问题,需要用到原生Js处理页面中的元素,以往一个document.getElementById就完活的选取元素,这次却不好使了.. 仔细看代码发现要选取元素外面多了一个iframe标签 < ...
- js获取上、下级html元素 js删除html元素方法
js获取下级html元素:htmlEle.childNode; js获取上级html元素:htmlEle.parentNode; js删除当前html元素: htmlEle.removeNode(tr ...
- selenium-java,定位并操作frame和iframe内的元素
因为frame和iframe的原因,在frame里的元素不能直接定位需要切到相应的frame才可以对元素进行操作,下面是涉及的方法 webDriver.switchTo().defaultConten ...
随机推荐
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- THREE.js代码备份——canvas_ascii_effect(以AscII码显示图形)
<!DOCTYPE html> <html lang="en"> <head> <title>three.js - ASCII Ef ...
- Visual Studio 2015 开发 Linux 和树莓派 程序的 C++环境
可以创建 树莓派 和 linux控制台应用. 创建后的 readme , 有各个设置的说明 你需要输入你虚拟主机, 编译环境linux虚拟机 的简单配置,另外, 4月5日的版本 如果 你的linux ...
- BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...
- 【转载】Intellij IDEA的Hibernate简单应用
转载自: https://www.cnblogs.com/yangyquin/p/5438248.html 1.创建数据库及其表 create database demo; use demo ...
- scrapy-redis 之处理异常
今天心情不好 不想多打字 自己看注释吧 from scrapy.http import HtmlResponse from twisted.internet import defer from twi ...
- 莫烦大大keras学习Mnist识别(4)-----RNN
一.步骤: 导入包以及读取数据 设置参数 数据预处理 构建模型 编译模型 训练以及测试模型 二.代码: 1.导入包以及读取数据 #导入包 import numpy as np np.random.se ...
- 【剑指Offer】39、平衡二叉树
题目描述: 输入一棵二叉树,判断该二叉树是否是平衡二叉树.这里的定义是:如果某二叉树中任意结点的左.右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 解题思路: 首先对于本题我们要 ...
- request.getScheme()、 request.getServerName() 、 request.getServerPort() 、 request.getContextPath()
<% String basePath = request.getScheme() + "://" + request.getServerName() + ":&qu ...
- noip模板复习
自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...