当js函数's已执行

Preventing a js function from executing when it's already been executed

本文关键字:执行 js 函数      更新时间:2023-09-26

如果sendMessageAppendData()已在当前js会话中执行,我将如何防止sendMessageAppndData()被准备为'newMessageSpace'id。

function sendMessageAppendData() {
return '<table id="newMessageBox1" cellpadding="0" cellspacing="0" style="border-radius: 3pt; width: 267px; border: 1px solid #CCCCCC">'+
           '<tr>'+
           '<td valign="top" class="font1" style="text-align: center; padding: 3pt">You are messaging <?php echo $row->firstname." ".$row->lastname ?></td>'+
           '</tr>'+
           '<tr>'+
           '<td valign="top" style="text-align: center; width: 253px; padding: 3pt">'+
           '<input autofocus placeholder="Type your message" id="responseMessage" spellcheck="false" autocomplete="off" class="textbox1" type="text" style="width: 185pt; height: 17px" /></td>'+
           '</tr>'+
           '</table>';
}
$('#clickSendAMessage').live('click', function() {
    $('#newMessageSpace').prepend(sendMessageAppendData());
});

哦,这些很有趣-试试这个:

function sendMessageAppendData () {
   console.log("I ran!");
   sendMessageAppendData = function () {}
}

只是为了一个"超级干净"的建议。。

var clickSendAMessageHandler = function() {
    $('#newMessageSpace').prepend(sendMessageAppendData());
    $('#clickSendAMessage').die('click', clickSendAMessageHandler );
}
$('#clickSendAMessage').live('click', clickSendAMessageHandler);

本质上是一样的想法——你用一个自我参照来阻止它再次发生。

在使用javascript全局scoper变量的帮助下

var Isexcuted=0;
function sendMessageAppendData() {
Isexcuted=1;
return '<table id="newMessageBox1" cellpadding="0" cellspacing="0" style="border-radius: 3pt; width: 267px; border: 1px solid #CCCCCC">'+
           '<tr>'+
           '<td valign="top" class="font1" style="text-align: center; padding: 3pt">You are messaging <?php echo $row->firstname." ".$row->lastname ?></td>'+
           '</tr>'+
           '<tr>'+
           '<td valign="top" style="text-align: center; width: 253px; padding: 3pt">'+
           '<input autofocus placeholder="Type your message" id="responseMessage" spellcheck="false" autocomplete="off" class="textbox1" type="text" style="width: 185pt; height: 17px" /></td>'+
           '</tr>'+
           '</table>';
}
$('#clickSendAMessage').live('click', function() {
    if(Isexcuted==0)
    $('#newMessageSpace').prepend(sendMessageAppendData());
});

假设您不介意额外的依赖项,Undercore.js有一个once方法。

这里有一个小实用程序,可以用来让任何函数只运行一次:

 function onceOnly(fn) {
     var executed = false;
     return function() {
         if (!executed) {
             executed = true;
             fn.apply(this, arguments);
         }
     };
 }

然后,只需写入sendMessageAppendData=onceOnly(sendMessageAppndData);

您可以使用.data()来保存状态。

$('#clickSendAMessage').live('click', function() {
    var newMessageSpace = $('#newMessageSpace');
    if (!newMessageSpace.data('prepended')) {
        newMessageSpace.prepend(sendMessageAppendData()).data('prepended', true);
    } 
});

注意,.live已弃用,您可以使用.on

您可以检查元素是否不存在:

$('#clickSendAMessage').live('click', function() {
    if(!$('#newMessageBox1')) {
        $('#newMessageSpace').prepend(sendMessageAppendData());
    }
});

一个更好的解决方案是用取代live

$('#clickSendAMessage').one('click', function() {
   $('#newMessageSpace').prepend(sendMessageAppendData());
});

通过这种方式,jQuery确保它只执行一次。

我更喜欢通过将执行的变量附加到函数本身来在范围内完成这一切:

function testFunc() {
  if(!arguments.callee.hasOwnProperty("executed")) {
    arguments.callee.executed = true;
    //alert("First Run");
  }
  else {
    //alert("Too late!");
  }
}