Javascript代码似乎执行了很多次,为什么
Javascript code seems to execute many times, why?
我试图通过按钮在tinyMCE编辑器中插入Wordpress shortocde,但我遇到了一个小问题。脚本插入快捷代码多次。我很难解释清楚,所以我录制了一个短视频:
http://www.youtube.com/watch?v=bJJMkAXKNVM
以下是完整的javascript代码:
jQuery(document).ready(function($){
$("#wpwrap").append("<div class='"avgrund-cover'"></div>");
$("#close-modal").click(function(){
Avgrund.hide("#acf-popup");
});
(function() {
tinymce.create('tinymce.plugins.acfshortcode', {
init : function(ed, url) {
ed.addButton('acfshortcode', {
title : 'Ajax Contact Form',
image : url+'/../acf-button.png',
onclick : function() {
var showname = true;
var showsubject = true;
var showbox = true;
var formwidth = $("#form-width").val();
Avgrund.show("#acf-popup");
$("#disable_name").click(function(e){
if (showname) {
$("#name").parent().slideUp('200');
showname = false;
}else{
$("#name").parent().slideDown('200');
showname = true;
}
});
$("#close-modal").click(function(e){
Avgrund.hide("#default-popup");
});
$("#disable_subject").click(function(e){
if (showsubject) {
$("#subject").parent().slideUp('200');
showsubject = false;
}else{
$("#subject").parent().slideDown('200');
showsubject = true;
}
});
$("#disable_box").click(function(e){
if (showbox) {
$("#acf-contact-form").removeClass('acf-box');
showbox = false;
}else{
$("#acf-contact-form").addClass('acf-box');
showbox = true;
}
});
$("#form-width").keyup(function() {
formwidth = $("#form-width").val();
$("#acf-contact-form").css('width', formwidth+'px');
});
$("#insert-acf-form").click(function(e){
var showname2, showsubject2;
if (showname == true) showname2 = 'yes'; else showname2 = 'no';
if (showsubject == true) showsubject2 = 'yes'; else showsubject2 = 'no';
if (showbox == true) box2 = 'yes'; else box2 = 'no';
var name_label = $("#name").val();
var email_label = $("#email").val();
var subject_label = $("#subject").val();
var message_label = $("#message-form").val();
var button_label = $("#acf-send-button").text();
if (formwidth < 140 ) formwidth = 140;
if (formwidth > 1000 ) formwidth = 1000;
ed.execCommand('mceInsertContent', false, '<p>[acf_contact_form width="'+formwidth+'px" box="'+box2+'" name="'+showname2+'" subject="'+showsubject2+'" name_label="'+name_label+'" email_label="'+email_label+'" subject_label="'+subject_label+'" message_label="'+message_label+'" button_text="'+button_label+'"]</p>');
Avgrund.hide("#default-popup");
e.preventDefault();
});
}
});
},
createControl : function(n, cm) {
return null;
},
getInfo : function() {
return {
longname : "Ajax Contact Form Shortcode",
author : 'Jacek Jagiello',
version : "1.0"
};
}
});
tinymce.PluginManager.add('acfshortcode', tinymce.plugins.acfshortcode);
})();
});
下面是上面的函数表单代码,在编辑器中插入短代码:
(...) onclick : function() {
var showname = true;
var showsubject = true;
var showbox = true;
var formwidth = $("#form-width").val();
Avgrund.show("#acf-popup");
$("#disable_name").click(function(e){
if (showname) {
$("#name").parent().slideUp('200');
showname = false;
}else{
$("#name").parent().slideDown('200');
showname = true;
}
});
$("#close-modal").click(function(e){
Avgrund.hide("#default-popup");
});
$("#disable_subject").click(function(e){
if (showsubject) {
$("#subject").parent().slideUp('200');
showsubject = false;
}else{
$("#subject").parent().slideDown('200');
showsubject = true;
}
});
$("#disable_box").click(function(e){
if (showbox) {
$("#acf-contact-form").removeClass('acf-box');
showbox = false;
}else{
$("#acf-contact-form").addClass('acf-box');
showbox = true;
}
});
$("#form-width").keyup(function() {
formwidth = $("#form-width").val();
$("#acf-contact-form").css('width', formwidth+'px');
});
$("#insert-acf-form").click(function(e){
var showname2, showsubject2;
if (showname == true) showname2 = 'yes'; else showname2 = 'no';
if (showsubject == true) showsubject2 = 'yes'; else showsubject2 = 'no';
if (showbox == true) box2 = 'yes'; else box2 = 'no';
var name_label = $("#name").val();
var email_label = $("#email").val();
var subject_label = $("#subject").val();
var message_label = $("#message-form").val();
var button_label = $("#acf-send-button").text();
if (formwidth < 140 ) formwidth = 140;
if (formwidth > 1000 ) formwidth = 1000;
ed.execCommand('mceInsertContent', false, '<p>[acf_contact_form width="'+formwidth+'px" box="'+box2+'" name="'+showname2+'" subject="'+showsubject2+'" name_label="'+name_label+'" email_label="'+email_label+'" subject_label="'+subject_label+'" message_label="'+message_label+'" button_text="'+button_label+'"]</p>');
Avgrund.hide("#default-popup");
e.preventDefault();
});
}
您正在为按钮的onclick
处理程序中的弹出窗口添加事件处理程序。这意味着每次单击按钮时都会添加它们。
换句话说,第二次单击按钮打开弹出窗口时,#insert-acf-form
上有两个单击处理程序。第三次您将有三个,等等。您分配的所有其他事件处理程序也是如此,但只有单击处理程序会立即显示出来,因为mceInsertContent
将被调用两次。
一种解决方案:由于弹出窗口似乎在您第一次点击按钮之前就已经创建好了,您可以在onclick事件处理程序之外为其添加所有事件处理程序,即在初始化代码中(注意,代码只是为了演示这个想法,它是而不是测试的,可能包括语法错误等):
jQuery(document).ready(function($) {
$("#wpwrap").append("<div class='"avgrund-cover'"></div>");
$("#close-modal").click(function() {
Avgrund.hide("#acf-popup");
});
(function() {
var showname = true;
var showsubject = true;
var showbox = true;
var formwidth = $("#form-width").val();
// ********** MOVE REGISTRATION OF POPUP EVENT HANDLERS HERE **********
tinymce.create('tinymce.plugins.acfshortcode', {
init : function(ed, url) {
ed.addButton('acfshortcode', {
title : 'Ajax Contact Form',
image : url+'/../acf-button.png',
onclick : function() {
Avgrund.show("#acf-popup");
// ************* NOTE, NO EVENT HANDLERS HERE ***********
}
});
},
createControl : function(n, cm) {
return null;
},
// etc.
});
})();
}
或者,您可以在onclick
中添加一个检查,以查看onclick
以前是否被调用过,在这种情况下不需要再次添加事件处理程序。
相关文章:
- 为什么忽略了eval()代码中的语法错误
- 为什么indexOf在这个js代码中不起作用
- 为什么我在这个javaScript代码中使用NaN
- 为什么此验证代码不起作用
- 我的jquery代码不起作用.为什么?
- 为什么代码会指向window对象
- 为什么代码在jsfiddle上运行良好,但在我的dreamweaver上却不正常
- 为什么代码似乎有效,但结果中也包含未定义
- 无法理解为什么代码给出错误:类型错误:0 是只读的
- 为什么代码中添加的html与实际情况不同
- 为什么代码不起作用JS
- .每个循环都没有完全执行..为什么?(代码和日志可用)
- 为什么代码不能与名为jquery 19的脚本一起工作?
- 为什么代码部分中显示的javascript函数在Firefox和Chrome中不起作用?但在IE中工作良好
- 我的JSON有什么问题?解析并解释为什么代码没有按照出现的顺序执行
- javascript函数中的词法作用域,为什么代码返回undefined ?
- 为什么代码放在return语句之后,它会被执行吗?
- JavaScript -为什么代码不能工作
- 为什么代码没有应用于页面中的每个元素
- 为什么代码不起作用(使用 casperjs 提交表单)