JAVASCRIPT与服务器端交互

时间:2022-12-02 10:04:17
各位好,现在小弟遇到一个问题,在Asp.net中运行一个函数,
运行到一半时需要跟客户端进行交互,
即是询问用户是否要继续执行,如果是就继续,否则就跳出。
小弟的想法是这样来的:
搞一个隐藏控件在源里,初始值为false,
用于客户端和服务器端传值。
在运行服务端的函数时,弹出一个JS的confirm框,
如果用户确定就把隐藏控件的值赋为true,否则为false。
然后根据隐藏控件的值去判断是否继续执行和退出。
思想就是这样子了,但问题来了。。。
调试跟踪的时候发现:在运行完弹出confirm框这一行时,
页面的confirm框还没有出来,
但是程序继续执行,并且根据隐藏控件的初始值进行判断,
结果程序就继续执行,直至这个函数运行完后,
才出现confirm框,等点击完确定后,隐藏控件的值才被改变,
而这个时候服务端的函数已经运行完了,
根本就做不到根据用户的判断来进行是否继续执行。
请问各位大虾,我应该怎么来才能实现根据用户的操作
来选择是否继续执行程序呢?

14 个解决方案

#1


在按钮上加
if(confirm("确认继续"))
return true
else
return false

#2


引用 1 楼 kkun_3yue3 的回复:
在按钮上加 
if(confirm("确认继续")) 
return true 
else 
return false


或者你弹出一个页面,然后用session保持用户选择的结果!

#3


楼上说的都是得等到那个函数执行完之后

才会弹出对话框啊,而不是程序运行到一半

就弹出对话框啊,而且这个事件不是由按钮来触发的,

也就是说不是等用户来确定运行整个函数,

而是运行到一半的时候要用户来确定是否要继续的问题。。

继续等待。。。。感谢楼上两位的帮助

#4


这个东西我把他叫做异步窗口

就是从服务端给浏览器端强行弹出个窗口

同时等待浏览器端的窗口返回一个结果之后,服务器端程序继续执行

也就是说,在弹出窗口的时候,服务器端的代码是中断运行的,待浏览器的新窗口关闭后,服务器端代码才继续执行

你说的对话框,其实用一个弹出窗口更合适更通用

然后窗口中可以包含指定的页面,来完成特定的工作,而不仅仅只要个yes or no

也可以传参,返回参数,窗口关闭倒计时,等。。

不知道你想要的是不是这样的效果

#5


同时需要跟楼主确认的是

你说的那个函数的运行,100%是由客户在浏览器上的动作触发的

按钮点击也好,页面浏览也好,反正是客户端动作触发服务端方法的执行

这样才有可能在浏览器端弹出一个窗口

否则,你无法跟页面交互

#6


楼主25%的结贴率比较显眼

#7


明白你的意思,把"程序运行到一半",这部分放到页面加载时搞定,能明白啵?
页面加载完毕就把"一半"的程序执行完,把结果输出到页面某控件里,如hidden控件里,
在扭钮事件里直接取hidden控件里的值弹出confirm,询问是否继续,如果不继续return false,否则继续执行,
在得到confirm的返回值后,如真或假,用JS把返回值放到HIDDEN控件里,后台CS文件读取该值以判断用户当时的选择,
如confirm用户选择了是,则document.getElementById("某hidden").value = 1否则写0,
后台CS文件里取
某hidden.value == "1" ?do something : do another thing;

#8


引用 7 楼 kkun_3yue3 的回复:
明白你的意思,把"程序运行到一半",这部分放到页面加载时搞定,能明白啵?
页面加载完毕就把"一半"的程序执行完,把结果输出到页面某控件里,如hidden控件里,
在扭钮事件里直接取hidden控件里的值弹出confirm,询问是否继续,如果不继续return false,否则继续执行,
在得到confirm的返回值后,如真或假,用JS把返回值放到HIDDEN控件里,后台CS文件读取该值以判断用户当时的选择,
如confirm用户选择了是,则document.getElementById("某hi…


#9


引用 4 楼 bingdian37 的回复:
这个东西我把他叫做异步窗口 

就是从服务端给浏览器端强行弹出个窗口 

同时等待浏览器端的窗口返回一个结果之后,服务器端程序继续执行 

也就是说,在弹出窗口的时候,服务器端的代码是中断运行的,待浏览器的新窗口关闭后,服务器端代码才继续执行 

你说的对话框,其实用一个弹出窗口更合适更通用 

然后窗口中可以包含指定的页面,来完成特定的工作,而不仅仅只要个yes or no 

也可以传参,返回参数,窗口关闭…



呵。。。谢谢bingdian37的回答,确实是要这样的效果,

只不过小弟不知那种情况就叫做“异步窗口”,

现在是明白了,可是怎样来实现呢?

还有,我的结贴率这么小是因为只问过四个问题,

而且都是关于WebPart的。。。。

所以结贴比较少。。。哈哈。。。。。

只要有满意的答案我还是给分的。。。嘻。。。不要介意啊。。。。

还有,你在八楼哎了一下。。什么意思呢?


等会再结贴啊。。。。

#10


引用 5 楼 bingdian37 的回复:
同时需要跟楼主确认的是 

你说的那个函数的运行,100%是由客户在浏览器上的动作触发的 

按钮点击也好,页面浏览也好,反正是客户端动作触发服务端方法的执行 

这样才有可能在浏览器端弹出一个窗口 

否则,你无法跟页面交互



确实是这样,100%由客户端触发。。。

只不过事件运行到一半还是要客户端去确认一下而已。。。。

谢谢

#11


同时谢谢所有回答过的朋友。。。。

#12


楼主这次结贴也太快了,

名字是我自己起得,所以不知道很正常 JAVASCRIPT与服务器端交互,可能叫异步不合适,应该叫同步窗口才是,叫异步是因为使用了xmlhttprequest

实现方法大体描述下

不方便给你直接出源代码,请理解

第一.服务端要调用某个东西去弹出窗口,我们把这个类独立出来,称为异步窗口类
这个类要完成的任务就是:

向客户端发送一段脚本,并且强制服务端立即输出,然后开始断断续续的sleep,并检测时候有结果返回(如何检测下面会说)
该脚本将完成弹出窗口,将参数传递到弹出窗口,并等待弹出窗口关闭,接收返回结果
并将结果传递给服务端的任务

关键点在与如何将结果传递给服务端,这里就需要使用xmlhttprequest对象了,将结果提交到服务器
这个时候服务器正在断断续续的sleep,如何让服务器直到这个结果呢?

这里就要通过HttpModule了,在服务端由一个HttpModule去接收结果,并保存到application级别的一个哈希表中,服务端检测是否有结果返回的时候就是通过这个地方去查询

当然,为了能够确定一个准确的结果(不至于在多个用户弹出多个窗口时候混淆),你自己要去唯一的标识一个弹出窗口,并在提交结果的时候同时提交该标识

当然,服务端应该有超市机制,过了多长时间,没有应答的话,就有个默认的动作去继续

另外客户端浏览器那个弹出窗口,应该用模态窗口比较合适,但是不能让他一直在那里,可以再加上一个倒计时

基本思路就是如此

希望对你有所帮助

#13


嗯,bingdian37你说的思路我基本理清了,也知道大概怎样去实现。

等会就去试一下。。。

谢谢赐教!

结贴快是因为有满意的答案嘛。。哈哈

#14


楼主你好,我也遇到跟你同样的问题,你这个问题实现了吗?

#1


在按钮上加
if(confirm("确认继续"))
return true
else
return false

#2


引用 1 楼 kkun_3yue3 的回复:
在按钮上加 
if(confirm("确认继续")) 
return true 
else 
return false


或者你弹出一个页面,然后用session保持用户选择的结果!

#3


楼上说的都是得等到那个函数执行完之后

才会弹出对话框啊,而不是程序运行到一半

就弹出对话框啊,而且这个事件不是由按钮来触发的,

也就是说不是等用户来确定运行整个函数,

而是运行到一半的时候要用户来确定是否要继续的问题。。

继续等待。。。。感谢楼上两位的帮助

#4


这个东西我把他叫做异步窗口

就是从服务端给浏览器端强行弹出个窗口

同时等待浏览器端的窗口返回一个结果之后,服务器端程序继续执行

也就是说,在弹出窗口的时候,服务器端的代码是中断运行的,待浏览器的新窗口关闭后,服务器端代码才继续执行

你说的对话框,其实用一个弹出窗口更合适更通用

然后窗口中可以包含指定的页面,来完成特定的工作,而不仅仅只要个yes or no

也可以传参,返回参数,窗口关闭倒计时,等。。

不知道你想要的是不是这样的效果

#5


同时需要跟楼主确认的是

你说的那个函数的运行,100%是由客户在浏览器上的动作触发的

按钮点击也好,页面浏览也好,反正是客户端动作触发服务端方法的执行

这样才有可能在浏览器端弹出一个窗口

否则,你无法跟页面交互

#6


楼主25%的结贴率比较显眼

#7


明白你的意思,把"程序运行到一半",这部分放到页面加载时搞定,能明白啵?
页面加载完毕就把"一半"的程序执行完,把结果输出到页面某控件里,如hidden控件里,
在扭钮事件里直接取hidden控件里的值弹出confirm,询问是否继续,如果不继续return false,否则继续执行,
在得到confirm的返回值后,如真或假,用JS把返回值放到HIDDEN控件里,后台CS文件读取该值以判断用户当时的选择,
如confirm用户选择了是,则document.getElementById("某hidden").value = 1否则写0,
后台CS文件里取
某hidden.value == "1" ?do something : do another thing;

#8


引用 7 楼 kkun_3yue3 的回复:
明白你的意思,把"程序运行到一半",这部分放到页面加载时搞定,能明白啵?
页面加载完毕就把"一半"的程序执行完,把结果输出到页面某控件里,如hidden控件里,
在扭钮事件里直接取hidden控件里的值弹出confirm,询问是否继续,如果不继续return false,否则继续执行,
在得到confirm的返回值后,如真或假,用JS把返回值放到HIDDEN控件里,后台CS文件读取该值以判断用户当时的选择,
如confirm用户选择了是,则document.getElementById("某hi…


#9


引用 4 楼 bingdian37 的回复:
这个东西我把他叫做异步窗口 

就是从服务端给浏览器端强行弹出个窗口 

同时等待浏览器端的窗口返回一个结果之后,服务器端程序继续执行 

也就是说,在弹出窗口的时候,服务器端的代码是中断运行的,待浏览器的新窗口关闭后,服务器端代码才继续执行 

你说的对话框,其实用一个弹出窗口更合适更通用 

然后窗口中可以包含指定的页面,来完成特定的工作,而不仅仅只要个yes or no 

也可以传参,返回参数,窗口关闭…



呵。。。谢谢bingdian37的回答,确实是要这样的效果,

只不过小弟不知那种情况就叫做“异步窗口”,

现在是明白了,可是怎样来实现呢?

还有,我的结贴率这么小是因为只问过四个问题,

而且都是关于WebPart的。。。。

所以结贴比较少。。。哈哈。。。。。

只要有满意的答案我还是给分的。。。嘻。。。不要介意啊。。。。

还有,你在八楼哎了一下。。什么意思呢?


等会再结贴啊。。。。

#10


引用 5 楼 bingdian37 的回复:
同时需要跟楼主确认的是 

你说的那个函数的运行,100%是由客户在浏览器上的动作触发的 

按钮点击也好,页面浏览也好,反正是客户端动作触发服务端方法的执行 

这样才有可能在浏览器端弹出一个窗口 

否则,你无法跟页面交互



确实是这样,100%由客户端触发。。。

只不过事件运行到一半还是要客户端去确认一下而已。。。。

谢谢

#11


同时谢谢所有回答过的朋友。。。。

#12


楼主这次结贴也太快了,

名字是我自己起得,所以不知道很正常 JAVASCRIPT与服务器端交互,可能叫异步不合适,应该叫同步窗口才是,叫异步是因为使用了xmlhttprequest

实现方法大体描述下

不方便给你直接出源代码,请理解

第一.服务端要调用某个东西去弹出窗口,我们把这个类独立出来,称为异步窗口类
这个类要完成的任务就是:

向客户端发送一段脚本,并且强制服务端立即输出,然后开始断断续续的sleep,并检测时候有结果返回(如何检测下面会说)
该脚本将完成弹出窗口,将参数传递到弹出窗口,并等待弹出窗口关闭,接收返回结果
并将结果传递给服务端的任务

关键点在与如何将结果传递给服务端,这里就需要使用xmlhttprequest对象了,将结果提交到服务器
这个时候服务器正在断断续续的sleep,如何让服务器直到这个结果呢?

这里就要通过HttpModule了,在服务端由一个HttpModule去接收结果,并保存到application级别的一个哈希表中,服务端检测是否有结果返回的时候就是通过这个地方去查询

当然,为了能够确定一个准确的结果(不至于在多个用户弹出多个窗口时候混淆),你自己要去唯一的标识一个弹出窗口,并在提交结果的时候同时提交该标识

当然,服务端应该有超市机制,过了多长时间,没有应答的话,就有个默认的动作去继续

另外客户端浏览器那个弹出窗口,应该用模态窗口比较合适,但是不能让他一直在那里,可以再加上一个倒计时

基本思路就是如此

希望对你有所帮助

#13


嗯,bingdian37你说的思路我基本理清了,也知道大概怎样去实现。

等会就去试一下。。。

谢谢赐教!

结贴快是因为有满意的答案嘛。。哈哈

#14


楼主你好,我也遇到跟你同样的问题,你这个问题实现了吗?