如何解决self 和top相同的问题?(self == top) parent.location='login.jsp' 服务器htmllocationself == top 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 本帖最后由 showbo 于 2014-07-11 11:24:26 编辑 我已经附带了会话对应的cookieid,但是页面的js中有“if(self == top) parent.location='login.jsp”这个的限制,self每次和top是一样的,每次都从这里返回了。self==top的原因,是因为我通过程序post数据,而不是通过浏览器已有的页面点击发送的。这个判断条件或许就是为了阻止我这种不通过页面直接post数据的情况。现在不知道有没有其他办法来解决。 http://bbs.csdn.net/topics/50209868问题和这个一样,但是没有给出解决方法 问题的完整描述:整个网站使用了框架使其便于导航和统一风格,它不希望框架中的子页面被用户单独浏览访问到~,当子页面在任何时间出现时都要处在一个本网站的框架页面中,不能单独被调用,要是单独调用,则自动跳转到login.js页面了 。针对这种问题,有解决办法么?我想到的方法:C#调用超链接的js回调(相当于模拟鼠标点击的过程),将子页面生成在框架页面中,然后针对子页面的超链接进行同样的鼠标模拟点击,最后提交订单。不知是否可行? C#调用超链接的js,将子页面生成在框架页面中document.getElementById('子页面id').src = '子页面链接';关于子页面提交订单,参考: 用iframe进行表单提交时的若干问题总结 在webbrowser中,鼠标移到超链接上,会显示“javascript:parent.beder("ft","hrou","gid=1700350&strong=&rtype=&gnum=60004"”,后来我执行webBrowser1.Navigate(code),子页面会生成,和人工点击超链接生成的位置一模一样,本来以为已经可以了,但是在提交订单的时候,还是提示(self == top) parent.location='login.jsp'。这样说明,通过webBrowser1.Navigate(code)生成的子页面还没有在对应框架里面。有什么办法可以生成在框架页面中吗? 你的判断本身就有问题self == top 表示的是页面不在框架中,也就是单独显示了既然是单独的页面,当然也就没有 parent 了。你对 parent 赋值,自然就错了if(self == top) location='login.jsp'这样就可以了 (self == top) parent.location='login.jsp'是网站页面的代码,我是用C#来提交订单,由于生成的页面是单独显示的,就执行了这句代码,它本身没有问题的。现在问题是我怎样才能使得我生成的页面放到对应的框架中。 该怎么指定表单的target?string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。 首先,如果你需要子页面转到新的地址,那么使用this.webBrowser1.Document.Window.Frames["子页名"].Navigate("需要转到的地址");但是新地址必须是合法的url,直接Navigate到javascript可能不行,自己试一下。其次,你可以模拟鼠标点击超链接//获取子页面的Document对象HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;//获取超链接节点HtmlElement el = doc.GetElementById ("超链接ID");//模拟点击el.InvokeMember("click");第三,你可以直接模拟执行子页面的javascript代码string scriptstr = "parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"";string result = sendJS(webBrowser1, scriptstr);其中sendJS函数为private string sendJS(WebBrowser sender, string JScript) { object[] args = {JScript}; return sender.Document.Window.Frames["子页名"].Document.InvokeScript("eval",args).ToString();}以为你提到使用WebBrowser控件,所以提供上面的方法。如果你是想自动化的话,也可以看看使用HttpWebRequest。该怎么指定表单的target?string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。 <frameset rows="71,*" cols="*" border="0" frameBorder="NO" frameSpacing="0"> <frame name="header" src="header.jsp" scrolling="no" noresize="noresize"> <frameset cols="241,*" border="0" frameBorder="NO" frameSpacing="0" > <frame name="mem_order" src="select.jsp" scrolling="no" noresize="noresize"> <frame name="body" src="browser.jsp" scrolling="no" noresize="noresize"> </frameset></frameset>主页的三个frame,子页面归属于mem_order,我尝试第一种方法,虽然页面出现了,但是提交订单时,还提示和上面说的一样的报错:string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;this.webBrowser1.Document.Window.Frames["mem_order"].Navigate(scriptstr );不知道scriptstr 是不是要用子页面的url(这个url可以通过抓包工具获得)。 如果使用url,还是有问题,frame都被子页面占据了,其他的页面都不见了,而这个子页面只是frame的中的一部分。 HttpWebRequest最早就尝试过了,也是在最后提交订单的时候,子页面是单独存在的,导致失败了。通过webbrowser来操作,这种情况应该会比较常见吧,该怎么解决啊 关于设置target="_self"强制在自身窗体打开的方法,请参考: http://hi.baidu.com/tjdnzishzdgtuxe/item/fe09ff17d188297b7b5f25e1C# WebBrowser强制使新窗口网页只在WebBrowser打开 其实我也很奇怪的,因为httpwebrequest不会触发javascript,而你的说子页面是单独存在的导致失败了。你把self==top去掉,看看有没有其他的代码影响在webbrowser或httpwebrequst提交。 self==top 是在网页里面的js代码,我还改不了。尝试了另一种方法就可以了,也就是你之前说的,即分析网页模拟鼠标点击//获取子页面的Document对象HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;//获取超链接节点HtmlElement el = doc.GetElementById ("超链接ID");//模拟点击el.InvokeMember("click");最早这样试了不成功,是因为这个网页是多层嵌套,代码只用了一层,而且是个动态网页,我以为动态网页是获取不到页面内容的(新手的观点)。其实只要在客户端页面上能够显示的内容,基本上都是可以获取的。谢谢大家的回帖和帮助。 iframe src 重定向问题 JS快速表格封装完成,瞬间展示万条数据,散分。。。。 EXTJS中动态添加checkbox 定时刷新页面问题 急急急,javascript中ie生成空格问题? 怎么显示当前的元素 高手指点一下:为什么回出现“automation服务器不能创建对象”这样的错误啊?? 谁能做到这样的效果! help!!!! 帮忙写个菜单 关于js路径问题... 鼠标禁止移出浏览器当前页面,用JS能否实现
我已经附带了会话对应的cookieid,但是页面的js中有“if(self == top) parent.location='login.jsp”这个的限制,self每次和top是一样的,每次都从这里返回了。self==top的原因,是因为我通过程序post数据,而不是通过浏览器已有的页面点击发送的。这个判断条件或许就是为了阻止我这种不通过页面直接post数据的情况。
现在不知道有没有其他办法来解决。
问题和这个一样,但是没有给出解决方法
整个网站使用了框架使其便于导航和统一风格,它不希望框架中的子页面被用户单独浏览访问到~,当子页面在任何时间出现时都要处在一个本网站的框架页面中,不能单独被调用,要是单独调用,则自动跳转到login.js页面了 。针对这种问题,有解决办法么?我想到的方法:
C#调用超链接的js回调(相当于模拟鼠标点击的过程),将子页面生成在框架页面中,然后针对子页面的超链接进行同样的鼠标模拟点击,最后提交订单。不知是否可行?
后来我执行webBrowser1.Navigate(code),子页面会生成,和人工点击超链接生成的位置一模一样,本来以为已经可以了,但是在提交订单的时候,还是提示(self == top) parent.location='login.jsp'。
这样说明,通过webBrowser1.Navigate(code)生成的子页面还没有在对应框架里面。
有什么办法可以生成在框架页面中吗?
self == top 表示的是页面不在框架中,也就是单独显示了
既然是单独的页面,当然也就没有 parent 了。你对 parent 赋值,自然就错了
if(self == top) location='login.jsp'
这样就可以了
(self == top) parent.location='login.jsp'是网站页面的代码,我是用C#来提交订单,由于生成的页面是单独显示的,就执行了这句代码,它本身没有问题的。
现在问题是我怎样才能使得我生成的页面放到对应的框架中。
该怎么指定表单的target?
string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。
其次,你可以模拟鼠标点击超链接//获取子页面的Document对象
HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;
//获取超链接节点
HtmlElement el = doc.GetElementById ("超链接ID");
//模拟点击
el.InvokeMember("click");第三,你可以直接模拟执行子页面的javascript代码string scriptstr = "parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"";
string result = sendJS(webBrowser1, scriptstr);其中sendJS函数为private string sendJS(WebBrowser sender, string JScript) {
object[] args = {JScript};
return sender.Document.Window.Frames["子页名"].Document.InvokeScript("eval",args).ToString();
}以为你提到使用WebBrowser控件,所以提供上面的方法。
如果你是想自动化的话,也可以看看使用HttpWebRequest。该怎么指定表单的target?
string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
webBrowser1.Navigate(scriptstr );我的代码只有这两句,生成了页面,而且这个页面也在框架中对应的位置(这个位置和手动点击生成页面的位置是一样的)。
<frameset rows="71,*" cols="*" border="0" frameBorder="NO" frameSpacing="0">
<frame name="header" src="header.jsp" scrolling="no" noresize="noresize">
<frameset cols="241,*" border="0" frameBorder="NO" frameSpacing="0" >
<frame name="mem_order" src="select.jsp" scrolling="no" noresize="noresize">
<frame name="body" src="browser.jsp" scrolling="no" noresize="noresize">
</frameset>
</frameset>主页的三个frame,子页面归属于mem_order,
我尝试第一种方法,虽然页面出现了,但是提交订单时,还提示和上面说的一样的报错:
string scriptstr = “javascript:parent.beder(\"ft\",\"hrou\",\"gid=1700350&strong=&rtype=&gnum=60004\"”;
this.webBrowser1.Document.Window.Frames["mem_order"].Navigate(scriptstr );不知道scriptstr 是不是要用子页面的url(这个url可以通过抓包工具获得)。
如果使用url,还是有问题,frame都被子页面占据了,其他的页面都不见了,而这个子页面只是frame的中的一部分。
你把self==top去掉,看看有没有其他的代码影响在webbrowser或httpwebrequst提交。
self==top 是在网页里面的js代码,我还改不了。尝试了另一种方法就可以了,也就是你之前说的,即分析网页模拟鼠标点击//获取子页面的Document对象
HtmlDocument doc = this.webBrowser1.Document.Window.Frames["子页名"].Document;
//获取超链接节点
HtmlElement el = doc.GetElementById ("超链接ID");
//模拟点击
el.InvokeMember("click");最早这样试了不成功,是因为这个网页是多层嵌套,代码只用了一层,而且是个动态网页,我以为动态网页是获取不到页面内容的(新手的观点)。其实只要在客户端页面上能够显示的内容,基本上都是可以获取的。谢谢大家的回帖和帮助。