1

以下のコードでは、ボタンをクリックして押したbid-upままにすると、コードが1回だけ実行され、機能するにはもう一度クリックする必要があります。それがすべきことは、mouseupまたはmouseleaveまでコードを繰り返すことです。私は何を間違えましたか?

$('.bid-up').live('mousedown',function() {

    var button = $(this);
    timeoutId = setTimeout(function(){

        var number = button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val();
        var newnumber = number.split('.');
        var on = button.attr('data-on');

        button.siblings('#bid-down').attr('data-on','1');

        if(newnumber[1]<9) {
            var first = newnumber[0];
            var second = parseInt(newnumber[1])+1;
        }

        if(newnumber[1]==9) {
            var first = parseInt(newnumber[0])+1;
            var second = 0;
        }

        var finalnumber = first+'.'+second;
        button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val(finalnumber);

    }, 20);

}).bind('mouseup mouseleave', function() {
    clearTimeout(timeoutId);
});
4

2 に答える 2

2

解決策:setTimeoutはクロージャ関数を1回だけ、またはクロージャ関数で実行するため、タイムアウトの代わりにsetIntervalandを使用します。clearIntervalsetTimeout

setTimeout関数自体で使用する例:

$('.bid-up').live('mousedown',function() {

    var button = $(this);


    function asd(){

        var number = button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val();
        var newnumber = number.split('.');
        var on = button.attr('data-on');

        button.siblings('#bid-down').attr('data-on','1');

        if(newnumber[1]<9) {
        var first = newnumber[0];
        var second = parseInt(newnumber[1])+1;
        }

        if(newnumber[1]==9) {
        var first = parseInt(newnumber[0])+1;
        var second = 0;
        }

        var finalnumber = first+'.'+second;
        button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val(finalnumber);

        timeoutId = setTimeout(asd, 20);
    }

    timeoutId = setTimeout(asd, 20);

}).bind('mouseup mouseleave', function() {
    clearTimeout(timeoutId);
});

とを使用setIntervaldataて間隔IDを保存する例。

$('.bid-up').live('mousedown',function() {

    var button = $(this);

    button.data('interval', setInterval(function (){

        var number = button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val();
        var newnumber = number.split('.');
        var on = button.attr('data-on');

        button.siblings('#bid-down').attr('data-on','1');

        if(newnumber[1]<9) {
        var first = newnumber[0];
        var second = parseInt(newnumber[1])+1;
        }

        if(newnumber[1]==9) {
        var first = parseInt(newnumber[0])+1;
        var second = 0;
        }

        var finalnumber = first+'.'+second;
        button.parent('div').siblings('#bid-child-container-2').find('#bid-price').val(finalnumber);
    }, 20));

}).bind('mouseup mouseleave', function() {
    clearInterval(button.data('interval'));
});
于 2012-05-27T08:52:19.267 に答える
1

これを試してください:http: //jsfiddle.net/R85Xb/

var timeoutId;
function x()
{
        $("#bids").append("x");
        timeoutId = setTimeout(x, 200);
}

$('.bid-up').live('mousedown', function() {

    var button = $(this);
    timeoutId = setTimeout(x, 200);

}).bind('mouseup mouseleave', function() {
    //alert('clear');
    clearTimeout(timeoutId);
});​


<div class="bid-up">here</div>
<div id="bids"></div>​
于 2012-05-27T08:59:36.983 に答える