1

In the following code, the confirm box shows before addClass has been rendered (i.e. Safari 6.0.5). Is it possible to make sure addClass() is rendered before showing confirm() box?

<style type="text/css">
.preview    { background-color: #eee;width:100;height:100;color:red; }
.preview_s  { border:3px solid blue;}
</style>

<script type="text/javascript">
function test(i) 
{
    $("#testdiv"+i).addClass('preview_s');
    if (confirm('border not blue and checkmark not visible on some browsers until after choice is made'))
    {
        // Do confirmed thing here
    } else {
        // Abort
    }
}
</script>

<form id="testform">
<div class="preview" id="testdiv1">test1</div>
<input type="checkbox" onclick="test(1);">
<div class="preview" id="testdiv2">test2</div>
<input type="checkbox" onclick="test(2);">
</form>
4

3 回答 3

2

不幸的是,我没有带 Safari 的 Mac,但这样的东西可以吗?

<script type="text/javascript">
function test(i) 
{
    $("#testdiv"+i).addClass('preview_s');

    // wait 20 milliseconds before launching confirmation box
    setTimeout(function(){
        if (confirm('border not blue and checkmark not visible on some browsers until after choice is made')) {
            // Do confirmed thing here
        } else {
            // Abort
        }
    }, 20);

}
</script>

在获得添加类的指令后,几乎听起来 DOM 无法足够快地触发。

你总是可以setTimeout通过小幅度增加,看看需要多长时间才能addClass通过

于 2013-10-04T19:28:27.427 回答
0

编辑以提供...开箱即用的方法。

function runConfirm($div){
    if($div.hasClass('preview_s')){
        if (confirm('border not blue and checkmark not visible on some browsers until after choice is made')) {
            // Do confirmed thing here
        } else {
            // Abort
        }
    } else {
        runConfirm($div);
    }
}

function test(i) {
    var $div = $("#testdiv"+i);        

    $div.addClass('preview_s');
    runConfirm($div);
}

这应该给你你想要的,因为被调用的函数将递归地调用自己,直到.hasClass()满足。

由于您提供了 jsFiddle,因此使用此答案对其进行了更新

于 2013-10-04T18:26:58.760 回答
0

我通过以下方式实现它,但我没有使用它。因为在确认框打开之前是否附加了类属性是模棱两可的,我不喜欢等待80毫秒。

const wrapper = button.closest('.js-item-row')
let needsSubmit = false
button.addEventListener('click', function(e){
  if(!needsSubmit) {
    e.preventDefault()
    const message = button.getAttribute('data-confirm-message')
    wrapper.classList.add('dynamicScaffold-destorying')
    setTimeout(function(){
      if(!confirm(message)){
        wrapper.classList.remove("dynamicScaffold-destorying");
      } else {
        needsSubmit = true
        button.click()
      }
    }, 80)
  }
})
于 2017-12-06T01:48:27.570 回答