Как запустить jQuery для отключения onclick перед вызовом Dajaxice? Текущее решение безобразно

Я пытаюсь заблокировать использование кнопки во время обработки Dajaxice/Dajax. Я должен гарантировать, что повторный вызов Dajaxice onclick не будет выполнен, если это займет много времени, прежде чем Dajax завершится.

Я проверил readthedocs Dajax / Dajaxice, stackru и Google не смог найти решение. И я начал взламывать....

Я начал использовать Dajaxice в базовой кнопке, которая может выглядеть так:

<button id="btn" onclick="Dajaxice.example.myexample(Dajax.process);">
    Click here!
</button>

Но я хочу удалить значение атрибута onclick во время обработки Dajax. Сначала я попытался удалить onclick в функции обратного вызова, но в этот момент уже слишком поздно, поскольку обратный вызов вызывается только после вызова Dajaxice:

<button id="btn" onclick="Dajaxice.example.myexample(my_js1_callback);">
    Click here!
</button>

<script>
    function my_js1_callback(data){
    $("#wkbtn").attr('onclick', ""); /* Too Late */
    Dajax.process(data);
    }
</script>

Проблема заключается в том, что функция Dajaxice myexample вызывается до того, как значение атрибута onclick станет ясным (как это должно быть, иначе они не будут вызываться). Я хочу очистить клик до выполнения функции Dajaxice.

В своей последней попытке я переместил вызов Dajaxice в jQuery, а не в onclick:

<button id="btn" onclick="my_dajaxice_myexample();">
    Click here!
</button>

<script>
    function my_js1_callback(data){
    Dajax.process(data); /* process callback */
    }
    function my_dajaxice_myexample(){
    $("#wkbtn").attr('onclick', ""); /* runs before Dajaxice */
        $(function(){Dajaxice.example.myexample(my_js1_callback);})
    }
</script>

Это работает, но кажется некрасивым. Кажется, должно быть что-то лучшее, чем этот подход с чрезмерным убийством в поясах и подтяжках.

Какие-либо предложения?

Изменить: Обновление на основе ответа Vash:

<button id="btn">
    Click here!
</button>

с кодом jQuery/Dajaxice:

<script>
$('#btn').click(function(){

    $('#btn').attr("disabled", "disabled");
    /* other pre-Dajaxice changes here */
    Dajaxice.example.myexample(Dajax.process);
}); 
</script>

Немного расширив это, мне нравится иметь возможность заменить использование "Dajax.process" в вышеприведенном примере вызовом функции, чтобы позволить запускать код JavaScript после вызова Dajaxice в этом пересмотренном коде jQuery/Dajaxice:

<script>
function my_callback(data){
    /* post-Dajaxice call, pre-Dajax execution changes here */
    Dajax.process(data); /* process callback */
    /* post-Dajax execution changes here */
}
$('#btn').click(function(){

    $('#btn').attr("disabled", "disabled");
    /* other pre-Dajaxice changes here */
    Dajaxice.example.myexample(my_callback);
});
</script>

1 ответ

Решение

Я считаю, что этого должно быть достаточно:

Оставьте свой HTML как есть:

<button id="btn">
    Click here!
</button>

И с помощью jQuery сделайте это:

$('#btn').click(function(){

    $('#btn').attr("disabled", "disabled");

    if($('#btn').attr("disabled")) {
        Dajaxice.example.myexample(Dajax.process);
    }
});

Простой jsfiddle демонстрирует это http://jsfiddle.net/37VTL/1/

Он отключает кнопку, затем проверяет, действительно ли кнопка отключена, и если она есть, то выполняет функцию. Даже если кажется, что избыточно проверять, отключена ли кнопка после того, как вы ее отключили, это просто способ убедиться, что ваша функция работает так, как вы этого хотите.

Другие вопросы по тегам