当js函数's已执行
Preventing a js function from executing when it's already been executed
如果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!");
}
}
相关文章:
- Meteor:插入集合后如何执行JS
- 如何在Odoo 9中执行JS文件中的函数
- 匿名自执行js函数内部的全局变量在外部仍然可用
- NumericTextBox-当用户键入数字时执行JS计算.能做到吗
- 引导:响应式设计-当窗口大小从980px调整到979px时执行JS
- 对页面上的所有ID执行JS功能
- 从浏览器访问页面时执行js函数's后退按钮
- 源代码未完全执行.(JS)
- 在执行JS脚本后监视对DOM的更改
- 在表单同步提交后执行 js 吗?
- 在 ubuntu 14.04 VPS 上执行.js文件错误
- 从PHP插入时在MongoDB上执行JS
- 在将ajax内容应用到元素后执行js函数
- Windows Phone浏览器控件执行JS函数来替换src属性
- 到达新页面后执行js
- 用C#在Win 8.1 Chakra中执行JS的一个失败的最小例子
- 在sharepoint显示模板中执行JS
- 在Bootstrap popover内部执行JS
- 从引导程序popover内容内部执行js
- 顺序执行js