2016-03-14 4 views
2

Как я могу переписать нижнюю функцию так, чтобы она возвращала true/false только после нажатия одной из кнопок?Функция возвращает значение в javascript

function something(param){ 
    var returnValue = false; 

    $('.btn-ok').on('click', function(){ 
    returnValue = false; 
    }); 

    $('.btn-cancel').on('click', function(){ 
    returnValue = true; 
    }) 

    return returnValue; 
} 

Проблема в настоящее время return returnValue; выполняет как только эта функция вызывается, но я хочу, чтобы ждать его, чтобы установить returnValue на основе кнопки.

UPDATE:

Извинения. Я думал, что приведенное выше объяснение того, что я пытаюсь сделать, было бы достаточно.

Я использую модуль Bootstrap modal с jQuery как front end и JSF/Java в бэкэнд. У меня есть событие с встроенным кликом, которое выглядит следующим образом:

onclick="if (!changeListner()) return false;" 

для связи. Это должно переопределить событие встроенного клика JSF. Так что это должно быть. changeListener() выглядит как таковой

function changeListener(){ 
    if(formChanged){ //formChanged is a variable that is set to true when an input value changes 
      return something(param);   
    } 
    return true; 
} 

something(param) фактически диалоговое окно сеттер, который показывает различные сообщения, основанные на параметре. Я пытаюсь передать true в событие online click, если пользователь решил нажать «Отменить» или заблокировать событие клика, если пользователь выбирает «Ok».

+1

Что вы ищете - это поле подтверждения –

+0

Когда есть функция Something Called. ? –

+0

Что вы пытаетесь достичь с этим? Похоже на диалог подтверждения, но что-то происходит после нажатия ok или отмены? – justinledouxweb

ответ

1

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

$('.btn-ok').on('click', function(){ 
    something(false) 
    }); 

    $('.btn-cancel').on('click', function(){ 
    something(true) 
    }) 

function something(value){ 
    var returnValue = value; 

    return returnValue; 
} 
+0

Кнопки отображаются только в том случае, если вызывается 'something()'. Я не могу иметь 'something()', вызываемый кнопками. Извините, но я уточнил свой вопрос для ясности. – ultimatecoder

+0

Проблема с выполнением '$ ('.btn-ok'). On ('click', funciton()' каждый раз когда-либо вызывается '' '' ', вы каждый раз применяете эти обработчики к кнопке, и они 'll fire once для каждого раза, когда они были прикреплены к кнопке каждый раз, когда нажимается кнопка, если я не ошибаюсь. – dgig

+0

Я хочу, чтобы кнопки просто позволяли 'something()' знать, если щелкнуть Ok или Cancel один раз – ultimatecoder

1

Вы можете использовать функцию обратного вызова:

function something(callback){ 
    var returnValue = false; 

    $('.btn-ok').on('click', function(){ 
    returnValue = false; 
    callback(returnValue); 
    }); 

    $('.btn-cancel').on('click', function(){ 
    returnValue = true; 
    callback(returnValue); 
    }) 

    //return returnValue; 
} 

Использование:

something(function(returnValue){ 
    console.log("return value called") 
}) 
0

вы имеете в виду это?

var returnValue = false; 
function something(){ 
    return returnValue; 
} 
    $('.btn-ok').on('click', returnValue(){ 
    returnValue = false; 
    something(); 
    }); 

    $('.btn-cancel').on('click', function(){ 
    returnValue = true; 
    something(); 
    }) 
0

попробовать этот код

$('.btn-ok').on('click', function(){ 
    something(false); 
}); 

$('.btn-cancel').on('click', function(){ 
    something(true); 
}); 

function something(someVal){ 
    return someVal; 
} 
0

UPDATE: Теперь с JSFiddle примера. (Может не работать в IE, так как обещание не включено там до Края.)

https://jsfiddle.net/h91yw778/

Вы должны использовать обещание API, который будет решать, когда кнопка нажата.

Ниже приведен пример использования обозначения обозначений ES6. Эта функция прикрепляет и удаляет обработчики событий с помощью jquery, которые будут удалены при нажатии одной из двух кнопок. Когда он нажимается, обещание разрешается с возвращаемым значением. Поскольку это обещание, у него есть метод «then», который передается в качестве первого аргумента (который можно использовать с помощью функции.)

function handleButtonsWithPromise() { 
    var button1 = $("#button1Id"); 
    var button2 = $("#button2Id"); 
    //ES6 Promise API; others exist, including jquery deferred. 
    return new Promise(function(resolve, reject) { 
     var onButton1Click = function (event) { 
      //...; 
      resolve(true); //resolves the promise with the value of true; 
      button1.off('click', '**', onButton1Click); //clean up event handlers if necessary 
      button2.off('click', '**', onButton2Click); //clean up event handlers if necessary 
     }; 

     var onButton2Click = function (event) { 
      //...; 
      resolve(false); //resolves the promise with false; 
      button1.off('click', '**', onButton1Click); //clean up event handlers if necessary 
      button2.off('click', '**', onButton2Click); //clean up event handlers if necessary 
     }; 

     button1.on('click', onButton1Click); 
     button2.on('click', onButton2Click); 
    }); 
} 

handleButtonsWithPromise().then(result => { 
    console.log(result); 
    //... 
) 
+0

Я пробовал это, но событие inline click, которое JSF вводит в рендеринг документа, не ждет, когда функция 'something()' вернет значение, если значение return false уже определено. Поэтому, когда я нажимаю на ссылку, я см. модальное окно для быстрой секунды, но он не дожидался, когда я нажму на кнопки. – ultimatecoder

+0

Это должно работать, даже если вы не вернете значение из-за чего-то(). Можете ли вы разместить свой код? –

0

Я хотел бы использовать тот же класс для обоих элементов и другого уникального имени класса/идентификатор для каждого один затем добавить этот код:

$('.common-class').click(function(){ 
return $(this).hasClass('unique-1'); 

})

0

, если нет необходимости в функцию сделайте что-нибудь еще, вы должны просто использовать следующее:

var returnValue = false; // or true depending on your default value 

$('.btn-ok').on('click', function(){ 
    returnValue = false; 
}); 

$('.btn-cancel').on('click', function(){ 
    returnValue = true; 
}); 

Затем используйте переменную retur nValue, когда вам это нужно.

Смежные вопросы