Asp.net 要解决的JavaScript难题:window.confirm=divConfirm(strMessage)
场景是:已经编写了很多JS代码的旧站点。如果用户希望将所有警报消息更改为基于新时代jazzy Div的警报,这在使用JQuery、YUI、Prototype时非常常见。。。等等Asp.net 要解决的JavaScript难题:window.confirm=divConfirm(strMessage),asp.net,javascript,jquery,ajax,Asp.net,Javascript,Jquery,Ajax,场景是:已经编写了很多JS代码的旧站点。如果用户希望将所有警报消息更改为基于新时代jazzy Div的警报,这在使用JQuery、YUI、Prototype时非常常见。。。等等 主要有树JS对话框 1.警觉的 要改变这一点很简单,我们只需编写新函数,显示div弹出窗口并显示消息,然后覆盖窗口。alert 函数showDivAlert(strMessage){ //div弹出逻辑和代码 } window.alert=showDivAlert 二,。提示 这看起来也很容易编写函数来接受字符串
主要有树JS对话框
1.警觉的 要改变这一点很简单,我们只需编写新函数,显示div弹出窗口并显示消息,然后覆盖窗口。alert
函数showDivAlert(strMessage){
//div弹出逻辑和代码
}
window.alert=showDivAlert
二,。提示
这看起来也很容易编写函数来接受字符串并显示输入值的文本框。现在,由于返回操作是基于点击“确定”按钮,这里的生活很简单
函数shoDivPromp(strMessage){
//弹出div以显示文本框并接受用户的输入
}
window.prompt=shoDivPromp
三,。证实 现在,上述两个对话框很容易覆盖和修改默认对话框,但确认对话框存在复杂性。
但是,默认的JS确认对话框会停止JS执行,当用户单击OK或Cancel时,会通过确定返回值(true/false)恢复执行。但是,如果我们使用用户div弹出窗口,则执行不会停止,这是一个问题。
我们仍然可以实现确认,但在这种情况下,我们必须为OK和CANCEL case绑定方法,该方法将附加到OK和CANCEL按钮。使用此函数,签名将类似于。
函数newConfirm(msg,fun-OkAction(),fun-CancelAction)
现在的问题是,这不能帮助我改变整个站点的确认对话框,就像我们在alert()中所做的那样; 问题
我不确定这是否可能实现,但我认为可以使用一些JS模式。如果可能的话,请告诉我。函数签名将是:
function newConfirm(msg, okAction, cancelAction);
并将用作:
function newConfirm(msg, okAction, cancelAction){
var ok = doWhateverPromptIsNecessary();
if (ok) {
okAction();
} else {
cancelAction();
}
}
也就是说,要将函数“指针”作为参数传递给函数,只需传入函数名而不使用()。函数签名是相同的。所有3个方法实际上都停止了js执行,而不仅仅是确认,因为它们都是模态对话框。就我个人而言,我会尽可能使所有内容保持异步,因为模态对话框会阻止与当前文档的交互 您最好按照自己的建议使用新确认弹出窗口中的回调函数 我很难准确地理解你想要实现的目标。听起来您希望执行以下操作:
- 运行一些javascript代码
- 显示“确认”框
- 等待,直到单击“确定”按钮或“取消”按钮
- 当用户单击“确定”时继续代码,当用户单击“取消”时返回
您希望这样做的原因是,使用使用回调函数重写函数需要重写使用confirm函数的每一段代码。如果您需要我的建议,我会继续重写代码,使其异步执行。如果不锁定包含对话框的“确定”和“取消”操作的文档,则无法延迟脚本执行。如果更改了角色,请发出警报/提示/确认。减慢执行挂起的用户交互以运行以下代码 重写这些函数后,代码将继续执行 要实现这一点,您必须修改代码的每个部分,并像使用异步函数一样工作 然后,您可以使用windows as的任何插件,并覆盖警报/提示/确认 现在的问题是,这不能帮助我改变整个站点的确认对话框,就像我们在alert()中所做的那样 没错。不可能在本机JavaScript中重现警报/确认/提示函数的同步性质。有一种非标准的方法
showmodaldialdialog
,它可以使用单独的弹出文档来实现,但并非所有浏览器都支持这种方法,而且通常认为这种方法非常不可取
因此,插件替换策略不起作用。您必须更改脚本其余部分中调用这些方法的每个位置
通常的模式是使用内联匿名函数,使用闭包保留局部变量,例如替换:
function buttonclick() {
var id= this.id;
if (confirm('Are you sure you want to frob '+id+'?'))
frob(id);
wipe(id);
}
与:
如果需要保留此
,则需要查看进一步的嵌套闭包或function.bind。如果在循环中调用确认
,事情会变得相当困难
显然,您还必须确保在“确认”框打开时,关键全局状态不会改变。通常情况下,通过用覆盖层覆盖页面的其余部分以防止点击通过,可以将这种风险降至最低。但是,如果您有超时,他们仍然可以开火。我不明白如何解决“提示”而不是“确认”。如何获得提示调用的输入值?我想你是对的,我没有抓住要点,提示对话框也存在确认同步的问题。。。。。。很抱歉,我在思考时错过了这个。是的,你是对的,但我正在寻找一些可以在功能体内部实现这一点的神奇图案。这只能帮助我覆盖window.confirm=confirm(str)对话框。上面唯一的问题是,我必须更改代码中已经使用的所有confim的调用。不幸的是,正如其他人所指出的那样,这是不可能的。+1,我认为更新像这样的旧站点的一部分是删除模式框的同步性,并尽可能多地异步工作。没有人喜欢网页上的模式弹出窗口。
function buttonclick() {
var id= this.id;
myConfirm('Are you sure you want to frob '+id+'?', function(confirmed) {
if (confirmed)
frob(id);
wipe(id);
});
}