当我写时alert('Hello')
,页面执行停止并等待批准继续。
我有一个使用 HTML 显示为假警报的 div设置 - 这div
有一个“确定”按钮。
我希望页面停止执行(就像警报一样),直到用户单击“确定”。
是否可以 ?
当我写时alert('Hello')
,页面执行停止并等待批准继续。
我有一个使用 HTML 显示为假警报的 div设置 - 这div
有一个“确定”按钮。
我希望页面停止执行(就像警报一样),直到用户单击“确定”。
是否可以 ?
你不能。只有特殊的内置插件才能做到这一点。有一段时间有一个showModalDialog
特殊的内置功能,可以让您为内容指定一个 URI 并因此对其进行自定义,但它从未得到广泛支持,现在甚至被曾经支持它的浏览器弃用。
相反,让您当前的警报功能使用div
接受回调关闭警报(或返回关闭时已解决的Promise),以允许您继续处理。
因此,例如,如果您的代码过去使用alert
和工作如下:
function foo() {
var x;
x = doSomething();
alert("Alert! Alert!");
doSomethingAfterTheAlertIsCleared(x);
doAnotherThingAfterward();
}
...你将其更改为:
function foo() {
var x;
x = doSomething();
fakeAlert("Alert! Alert!", function() {
doSomethingAfterTheAlertIsCleared(x);
doAnotherThingAfterward();
});
}
请注意,现在警报之后的所有代码都在一个函数中,我们将其引用传递到fakeAlert
. 该foo
函数在假警报仍在显示时返回,但最终用户解除假警报并调用我们的回调。请注意,我们的回调代码可以访问foo
我们正在处理的调用中的局部变量,因为我们的回调是一个闭包(不要担心这是一个相当新和/或神秘的术语,闭包并不复杂)。
当然,如果警报之后唯一的事情是不带任何参数的单个函数调用,我们可以直接传递该函数引用。例如,这个:
function foo() {
doSomething();
alert("Alert! Alert!");
doSomethingAfterTheAlertIsCleared();
}
变成:
function foo() {
doSomething();
fakeAlert("Alert! Alert!", doSomethingAfterTheAlertIsCleared);
}
(请注意,没有()
after doSomethingAfterTheAlertIsCleared
- 我们指的是函数对象,而不是调用函数;fakeAlert
将调用它。)
如果您不确定如何fakeAlert
调用回调,它将在用户“关闭”警报 div 的事件处理程序中,您只需调用回调的参数,就像对函数的任何其他引用一样. 因此,如果将fakeAlert
其作为接收callback
,则通过说来调用它callback();
。
是的,这是可能的,我做的这个演示不准确并且没有经过很好的测试。
主要概念:
什么被排除在范围之外:
演示:
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script>
Login.Try(); // START!! START!! START!!
var Login = {
Url: "http://xxxx",
Try: async(this, function (T) {
console.log('before login');
//var success = call(this, Login.Proceed); // normal call
var success = await(this, Login.Proceed); // that we want!
console.log('after login');
console.log('success ' + success);
}),
Proceed: function (callback) {
console.log('before ajax');
$.ajax({
url: this.Url,
context: document.body
}).done(function () {
console.log('after ajax');
callback("role=admin");
});
}
}
function async(T, method){
console.log('before async create');
return function () { return method.apply(T); };
console.log('after async create');
};
function await(T, method) {
var fn = arguments.callee.caller.toString();
var pos = fn.indexOf('await(');
var allBeforeAwait = fn.substring(0, pos);
var pos1 = fn.indexOf('await(');
pos1 = fn.indexOf(',', pos1) + 1;
var pos2 = fn.indexOf(')', pos1);
var cc = fn.substring(pos1, pos2);
pos = allBeforeAwait.lastIndexOf(';');
var allBeforeCall = allBeforeAwait.substring(0, pos + 1) + "}";
var callResult = allBeforeAwait.substring(pos + 1);
var result = 10;
var allAfterCall = "("+fn.substring(0, fn.indexOf(")")) + ",V){" + callResult + "V;";
pos = fn.indexOf(')', pos) + 2;
allAfterCall = allAfterCall + fn.substring(pos)+")";
//uncomment to see function's parts after split
//console.debug(allBeforeCall);
//console.debug(cc);
//console.debug(allAfterCall);
method.apply(T, [function (value) {
console.log('ajax response ' + value);
eval(allAfterCall).apply(T, [T, value]);
} ]);
throw "";
};
</script>
希望这个演示能激发你的一些想法。
您可以使用以下代码长时间暂停执行。
function PauseExecution() {
//做一些事情
sleep(1000);
//做一些事情...}
function sleep(milliseconds) { var start = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - start) > milliseconds){ break; } } }
不可能像警报那样,但您可以使事情看起来像警报。
例如,您创建了一个调用函数的函数。:) 然后你用一个巨大的 IF 创建一个函数。
window.callfunction = function (f, a, b) /* function name, arguments, boolean*/
{
var handler = window[f];
if (typeof handler === 'function') {
handler(a, b);
} else {
alert("No function like that mate, sry.");
}
}
function deleteAfterConfirm(a, b) /* arguments, boolean */
{
if (b == true) {
alert("i can delete, confirmed.");
alert(a);
return false;
}
magicConfirm(a);
}
function magicConfirm(a) {
/**
modals, popovers, etc, anything you want,
**/
$("#confirmModal").modal("show");
/**
and put the function's name to the binding element's data
**/
$("#returntrue").data("call", arguments.callee.caller.name);
$("#returntrue").data("arguments", a);
/**
the element like OK button in the alert
calls the magicConfirm function's caller function
with true, which is the deleteAfterConfirm, and
because the bool is true, it will alert i can delete...
**/
$("#returntrue").bind("click", function () {
callfunction($(this).data("call"), $(this).data("arguments"), true);
});
}
$(document).ready(function () {
$("#deleteAfterConfirm").on("click", function () {
deleteAfterConfirm("variable which is needed later.");
});
});
所以现在你可以像使用alert() 或confirm() 的函数一样使用deleteAfterConfirm 函数,因为它正在调用其他部分,如果它自己。
不是最好的方法,但这可以以某种方式替换确认和警报以获得更好看的版本。这是假警觉的一种方式:)
玩得开心-R
您可以使用 Promise API 来实现。这只是关于划分您的代码并在动作侦听器中放置一些行。这是示例代码:
在本例中,有两个按钮。单击第一个按钮启动代码,其余代码将放在promise.then
函数上。
html代码:
<body>
<button id='startButton' onclick='start();'>Start Button</button>
<button id='targetButton'>Target Button</button>
</body>
脚本代码:
<script>
function start(){
console.log('first log'); //put your div displayer code here
let promise = new Promise(function(resolve, reject) {
console.log('promise started');
let targetButton = document.getElementById('targetButton');
targetButton.addEventListener("click",function(){
resolve();
});
});
promise.then(function() {
console.log('second log'); //put the rest of your code
});
}
</script>
您将在触发开始按钮后看到first log
和promise started
。second log
单击目标按钮后将显示。
Promise API 的资源: