2016-02-28 31 views
1

我试图在bootstrap中创建类似按钮加载的内容。基本上创建一个按钮/链接中加载文本和防止运行,直到操作从被调用/子函数退出/打破主要功能

所以这里的结束按钮/链接是我的原型

function btnLoader(b){ 
    var txt = b.attr('data-text' , b.text()); 
    b.addClass('disabled').text('......'); 
} 

function btnunLoader(b){ 
    b.removeClass('disabled').text(b.attr('data-text')); 
} 

所以这工作得很好像

<a href="#" onclick="mainFunction(1);" id="btn-1"> send comment </a> 
<script> 
function mainFunction(id){ 
    btnLoader($('#btn-'+id)); 
    do stuff 
    btnunLoader($('#btn-'+id)); 
} 
</script> 

<a href="#" id="like-btn"> LIKE </a> 
<script> 
$('#like-btn').on('click' , function(){ 
    btnLoader($(this)); 
    do stuff   
}) 
</script> 

这是问题: 我想要按钮加载

我可以做这样的事情,以检查是否按钮已经disabled

function btnLoader(b){ 

    if(b.hasClass('disabled')) 
     return false; 

    var txt = b.attr('data-text' , b.text()); 
    b.addClass('disabled').text('......'); 
} 

后停止,但它对mainFunction没有效力的调用btnLoader功能或第二例如,我想打破点击事件btnLoader

有没有办法做到这一点?

普莱斯注意,点击的元素可能是<a>或其他任何标记,他们没有禁用的属性,所以这不是一个选项

+0

你为什么要打破的主要功能?你的代码中一切看起来都很好。你想要什么没有发生? –

+0

@Reddy让我们说它的一个按钮来发送评论,在主要功能我想发送一个ajax请求并将评论保存在数据库中......现在用户可以通过反复点击按钮多次保存评论,但如果我打破在第一次点击后不会发生的主要功能 – max

+0

在第一次点击按钮时解除点击事件,然后当过程完成时,可以将点击事件绑定回去。这将是简单的代码,没有太多头痛 –

回答

0

看起来像一个回调给我。我想jQuery函数就可以了。

$.fn.btnLoader = function(callback) { 
 
    this.on('click', function() { 
 
    btnLoader.call(this, callback); 
 
    }); 
 
}; 
 

 
function btnLoader(callback) { 
 

 

 
    if ($(this).is('.disabled')) 
 
    return; 
 
    
 
    console.log("doing btnLoader stuff"); 
 
    var txt = $(this).attr('data-text', $(this).text()); 
 
    $(this).addClass('disabled').text('......'); 
 
    callback.call($(this)); 
 
} 
 

 

 
function mainFunction() { 
 

 
    console.log("doing stuff"); 
 
    // do stuff 
 
    btnunLoader(this); 
 
} 
 

 

 
$('#like-btn').btnLoader(function() { 
 
    console.log("doing other stuff"); 
 
    // do stuff 
 
}); 
 

 
function btnunLoader() { 
 
    $(this).removeClass('disabled').text($(this).attr('data-text')); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<a href="#" onclick="btnunLoader.call(this,mainFunction)" id="btn-1"> send comment </a> 
 
<br> 
 
<a href="#" id="like-btn"> LIKE </a>

0

保持一个变量,该变量将设置一个标志,指出按钮当前是否正在加载。然后删除按钮卸载功能上的标志。因此,在此期间,如果有其他调用btnLoader()函数,它将不会处理它,直到该标志被设置为false。这里是一个让你更好理解的代码。

var btnBusy = false; 

function btnLoader(b){ 
    if(!btnBusy){ // if button is not busy, ie if its not in a loading state, then put to loading state. 
    var txt = b.attr('data-text' , b.text()); 
    b.addClass('disabled').text('......'); 
    } 
// else since the button is busy just don't do anything on consecutive calls to this function 
} 

function btnunLoader(b){ 
    if(btnBusy){ 
    b.removeClass('disabled').text(b.attr('data-text')); 
    btnBusy = false; // set back the busy status to false 
    } 
} 

编辑:如果突破其称为子功能的主要功能是你唯一的目标。然后你可以做下面的东西。

function mainFunction(id){ 
    var loaderStatus = btnLoader($('#btn-'+id)); 
    if (loaderStatus === 'break') { 
     return; // this will break your main function 
    } 
    do stuff 
    btnunLoader($('#btn-'+id)); 
} 

而且你可以让你在btnLoader功能,当以往任何时候都应该打破的主要功能,并返回一个字符串break回主功能逻辑。

function btnLoader(b){ 
    // to break the function which called this function 
    return 'break'; 
    ..... 
    ..... 
} 
+0

thanx,但它对整个点的主要功能没有影响,也将打破页面中的所有按钮/链接..我想禁用已经点击的按钮不是所有按钮在一起 – max

+0

'它也将打破页面中的所有按钮/链接..我想禁用已经点击的按钮不是所有的按钮'你甚至可以提到你在页面中有多个按钮。如果打破你的主要功能是你的唯一目标,那么看看我编辑的答案。 –

0

为什么不像以下那样简单化?只要btnLoader不应该继续,返回false,如果应该继续,则返回true。

function mainFunction(id){ 
    if(btnLoader($('#btn-'+id)) === false) { 
     return; 
    } 
    //do stuff 
    btnunLoader($('#btn-'+id)); 
} 

function btnLoader(b){ 

    if(b.hasClass('disabled')) 
     return false; 

    var txt = b.attr('data-text' , b.text()); 
    b.addClass('disabled').text('......'); 
    return true; 
} 

编辑

如果你不想修改一些不明原因的主要功能,那么你可以总是抛出一个错误(虽然这很可能会在被很多人瞧不起) 。

function btnLoader(b){ 
    if(b.hasClass('disabled')) 
     throw "disabled"; 
    var txt = b.attr('data-text' , b.text()); 
    b.addClass('disabled').text('......'); 
} 
+0

我知道我可能听起来很挑剔,但对于我会在代码中使用数百次的东西,我需要它尽可能简单......所以即使是一个简单的'if(!) - > return false'也太多了代码...这样的事情将是我的计划b – max

+0

@max我改变了我的答案。它会做你想做的,但我不会推荐这样做。 – honerlawd