2012-02-08 5 views
2

Использование jQuery (1.7), а не jQueryUI - (как) можно было бы выполнить следующее?Возвращаемое значение на основе ввода пользователем

  • Вызов функции 1
  • В функции 1, переменная определяется и устанавливается на результата функции 2
  • При вызове функции 2 «на лету» создает 2 кнопки, если первом после чего возвращается значение «true», второе возвращает «false»
  • В функции 1 переменная, устанавливаемая на результат функции 2, должна ждать, пока не будет введен пользовательский ввод, и было возвращено значение.
  • Затем это значение должно быть оценено

Есть ли способ сделать это в jQuery без использования интервала/таймаута и т. Д., Чтобы искать промежуточное значение, заданное для ввода пользователей?

я изложил принцип ниже:

function function1(){ 

    var myVariable=function2; 
    // nothing should happen at this point until function2 has returned a response 
    if(myVariable){ 
     alert('true'); 
    }else{ 
     alert('false'); 
    } 
} 


function function2(){ 

    var yesbutton=$("<input type='submit' value='yes' />"); 
    var nobutton=$("<input type='submit' value='no' />"); 
    $('body').append(yesbutton) 
    $('body').append(nobutton) 
    nobutton.click(function(){ 
     return false; 
    }); 
    yesbutton.click(function(){ 
     return true; 
    }); 

} 


function1(); 

Как всегда, большое спасибо за любую помощь!

+0

пользовательский ввод является асинхронным, если вы не используете модальные диалоги, такие как 'prompt',' confirm' или 'showModalDialog'. В противном случае вам придется использовать обратный вызов. – zzzzBov

+0

Как можно реализовать обратный вызов? – SW4

+0

Решение @ErgoSummary Shankar использует обратный вызов. Ну, сорт. –

ответ

4

Возможно, возможно, не так, как вы ожидали.

function function1(){ 

    var myVariable=function2(); 
    // nothing should happen at this point until function2 has returned a response 
    myVariable.done(function(){ 
     alert('true'); 
    }).fail(function(){ 
     alert('false'); 
    }); 
} 


function function2(){ 
    var deferred = $.Deferred(); 

    var yesbutton=$("<input type='submit' value='yes' />"); 
    var nobutton=$("<input type='submit' value='no' />"); 
    $('body').append(yesbutton) 
    $('body').append(nobutton) 
    nobutton.click(deferred.reject); 
    yesbutton.click(deferred.resolve); 

    return deferred.promise().always(function(){ 
     yesbutton.add(nobutton).remove(); 
    }); 

} 


function1(); 
+0

+1 Убей меня :) –

2

Вы не можете этого сделать, поскольку функция2 выполнила, а возвращаемое значение из click обработчиков внутри function2 не будет его возвратным значением. Но вы можете достичь этого, используя только одну функцию.

function function1(){ 

    var yesbutton=$("<input type='submit' value='yes' />"); 
    var nobutton=$("<input type='submit' value='no' />"); 
    $('body').append(yesbutton) 
    $('body').append(nobutton) 
    nobutton.click(function(){ 
     alert('false'); 
    }); 
    yesbutton.click(function(){ 
     alert('true'); 
    }); 

} 

Альтернативно вы можете это сделать.

function function2(yesClickHandler, noClickHandler){ 
    var deferred = $.Deferred(); 

    var yesbutton=$("<input type='submit' value='yes' />"); 
    var nobutton=$("<input type='submit' value='no' />"); 
    $('body').append(yesbutton).append(nobutton); 

    nobutton.click(noClickHandler); 
    yesbutton.click(yesClickHandler); 

    return deferred.promise(); 

} 

function2(function(){ 
    alert('true'); 
}, function(){ 
    alert('false'); 
}); 
+0

Вы имели в виду «не может»? –

+0

Действительно, однако причина того, что функция 2 была выделена отдельно, была настолько, что ее можно было перепрофилировать в другом месте - могут быть и другие функции функций, подобные функции1 ... – SW4

+0

Да, спасибо за это @Kevin. – ShankarSangoli

0

Используйте эту функцию в 1:

var myVariable=function2(); 
3

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

function function1(){ 
    function2(function(myVariable){ 
     if(myVariable){ 
      alert('true'); 
     }else{ 
      alert('false'); 
     } 
    }; 
} 


function function2(callback){ 

    var yesbutton=$("<input type='submit' value='yes' />"); 
    var nobutton=$("<input type='submit' value='no' />"); 
    $('body').append(yesbutton) 
    $('body').append(nobutton) 
    nobutton.click(function(){ 
     callback(false); 
    }); 
    yesbutton.click(function(){ 
     callback(true); 
    }); 
} 

function1(); 
Смежные вопросы