0

sendMessageAppendData() が現在の js セッションで既に実行されている場合、sendMessageAppendData() が「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());

});
4

7 に答える 7

2

ああ、これらは楽しいです - これを試してください:

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

そして、「超きれい」な提案のために..

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

本質的に同じ考え方です。自己参照を使用して、それが二度と起こらないようにします。

于 2012-09-14T06:11:38.253 に答える
1

追加の依存関係を気にしないと仮定すると、Underscore.jsにはonceメソッドがあります。

于 2012-09-14T06:15:28.310 に答える
1

javascript グローバル scopr 変数を使用して

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());

});
于 2012-09-14T06:11:16.387 に答える
1

これは、任意の関数を 1 回だけ実行するために使用できる小さなユーティリティです。

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

次に、 sendMessageAppendData = onceOnly(sendMessageAppendData); と書くだけです。

于 2012-09-14T06:19:21.473 に答える
0

関数自体に実行変数を追加することで、すべてをスコープ内で行うことを好みます。

function testFunc() {
  if(!arguments.callee.hasOwnProperty("executed")) {
    arguments.callee.executed = true;
    //alert("First Run");
  }
  else {
    //alert("Too late!");
  }
}
于 2012-09-14T06:24:26.280 に答える
0

.data()状態を保存するために使用できます。

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

noteは非推奨です。代わりに.live使用できます。.on

于 2012-09-14T06:15:30.803 に答える
0

要素がまだ存在しないかどうかを確認できます。

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

liveさらに良い解決策は、1つに置き換えることです:

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

このようにして、jQuery は一度だけ実行されるようにします。

于 2012-09-14T06:11:23.483 に答える