gpt4 book ai didi

javascript - 函数中的相同函数,保留变量/元素

转载 作者:行者123 更新时间:2023-11-28 17:24:07 25 4
gpt4 key购买 nike

我正在创建一个创建模式的 JavaScript 函数。函数如下:

    function createModal(options) {
var self = this;
modalHeaderText = options.header;
modalBodyText = options.body;
$modal = $('<div />').addClass('modal').appendTo('body');
$modalOverlay = $('<div />').addClass('modal-overlay').appendTo($modal);
$modalContainer = $('<div />').addClass('modal-container').appendTo($modal);
$modalHeader = $('<div />').addClass('modal-header').addClass(options.headerClass).html(modalHeaderText).appendTo($modalContainer);
$modalBody = $('<div />').addClass('modal-body').addClass(options.bodyClass).html(modalBodyText).appendTo($modalContainer);
if (options.buttons) {
$modalFooter = $('<div />').addClass('modal-footer').appendTo($modalContainer);
$.each(options.buttons, function(name, buttonOptions) {
$modalButton = $('<button />').addClass(buttonOptions.class).html(name).appendTo($modalFooter);
if(buttonOptions.callback) {
$modalButton.on('click', function() {
buttonOptions.callback();
});
} else {
$modalButton.on('click', function(e) {
$modal.remove();
});
};
});
};
$modal.addClass('active');
if (options.closeOnOverlayClick == true) {
$modalOverlay.on('click', function(e) {
$modal.remove();
});
};
};

这工作正常,但我希望能够在同一函数中调用该函数,如下所示:

    $('#modal').on('click', function(e){
e.preventDefault();
createModal({
header : 'Enter your name',
body : '<input type="text" class="name" />',
buttons : {
'OK' : {
class : 'btn btn-success',
callback : function() {
var name = self.$modalBody.find('.name').val();
if (!name) {
createModal({
header : 'Error',
body : 'You must provide a name',
buttons : {
'OK' : {
class : 'btn'
}
}
});
} else {
alert(name);
};
},
},
'Close' : {
class : 'btn btn-error'
}
}
});
});

我想要的是:当有人单击 ID 为“modal”(因此为“#modal”)的按钮时,将打开一个带有输入的模态。当按下“确定”按钮时,它会检查输入(“名称”)是否有值。如果是这样,该值将显示在警报中。如果没有,则会打开一个新模式(在当前模式之上),并显示文本“您必须提供名称”。

如果我输入一个名字,它就会起作用。该名称显示在警报中,并且关闭按钮也起作用。但是,如果我不输入名称,并且显示第二个模态,则函数中的所有变量都会被覆盖。

如何保留第一个模式中的变量/元素,以便在显示(并清除)第二个模式后,第一个模式中的按钮仍然有效。

我在这里创建了一个 JSFiddle:https://jsfiddle.net/6pq7ce0a/2/

你可以这样测试:

1) 点击“打开模式”2) 输入姓名3)点击“确定”4) 名称显示在警报中==> 这有效

问题出在这里:

1) 点击“打开模式”2) 不要输入姓名3)点击“确定”4) 显示新模态5)在新(错误)模式中单击“确定”6)第一个模式中的按钮(带有输入字段)不再起作用

提前致谢!

更新

如果我将函数更改为下面的函数,第一个模态将根本不起作用。

    function createModal(options) {
var self = this;
var modalHeaderText = options.header;
var modalBodyText = options.body;
var $modal = $('<div />').addClass('modal').appendTo('body');
var $modalOverlay = $('<div />').addClass('modal-overlay').appendTo($modal);
var $modalContainer = $('<div />').addClass('modal-container').appendTo($modal);
var $modalHeader = $('<div />').addClass('modal-header').addClass(options.headerClass).html(modalHeaderText).appendTo($modalContainer);
var $modalBody = $('<div />').addClass('modal-body').addClass(options.bodyClass).html(modalBodyText).appendTo($modalContainer);
if (options.buttons) {
var $modalFooter = $('<div />').addClass('modal-footer').appendTo($modalContainer);
$.each(options.buttons, function(name, buttonOptions) {
var $modalButton = $('<button />').addClass(buttonOptions.class).html(name).appendTo($modalFooter);
if(buttonOptions.callback) {
$modalButton.on('click', function() {
buttonOptions.callback();
});
} else {
$modalButton.on('click', function(e) {
$modal.remove();
});
};
});
};
$modal.addClass('active');
if (options.closeOnOverlayClick == true) {
$modalOverlay.on('click', function(e) {
$modal.remove();
});
};
};

问题出在这里:

var name = self.$modalBody.find('.name').val();

如果我向所有元素添加“var”,$modalBody 不会被定义。

最佳答案

因此,除了上面关于不声明 var 的注释之外,您还在 self 变量中存储对 window 的引用。为了避免所有这些,我沿着这条 fiddle 走下去:https://jsfiddle.net/10fanzw6/1/ .

快速解释。

  • 首先不要将 this 分配给 self,因为 this 是窗口
  • 第二次将所有内容分配给空的 self 对象以及本地变量(为了更好的可读性)
  • 第三次将 self 变量传递回任何按钮回调,让您可以访问您可能需要的模式的任何部分。

对于后代,包括此处的更新功能:

function createModal(options) {
var self = {};
var modalHeaderText = options.header;
var modalBodyText = options.body;
var $modal = self.$modal = $('<div />').addClass('modal').appendTo('body');
var $modalOverlay = self.$modalOverlay = $('<div />').addClass('modal-overlay').appendTo($modal);
var $modalContainer = self.$modalContainer = $('<div />').addClass('modal-container').appendTo(self.$modal);
self.$modalHeader = $('<div />').addClass('modal-header').addClass(options.headerClass).html(modalHeaderText).appendTo($modalContainer);
self.$modalBody = $('<div />').addClass('modal-body').addClass(options.bodyClass).html(modalBodyText).appendTo($modalContainer);
if (options.buttons) {
var $modalFooter = self.$modalFooter = $('<div />').addClass('modal-footer').appendTo($modalContainer);
$.each(options.buttons, function(name, buttonOptions) {
var $modalButton = $('<button />').addClass(buttonOptions.class).html(name).appendTo($modalFooter);
if (buttonOptions.callback) {
$modalButton.on('click', function() {
buttonOptions.callback(self);
});
} else {
$modalButton.on('click', function(e) {
$modal.remove();
});
};
});
};
$modal.addClass('active');
if (options.closeOnOverlayClick == true) {
$modalOverlay.on('click', function(e) {
$modal.remove();
});
};
};
$('#modal').on('click', function(e) {
e.preventDefault();
createModal({
header: 'Enter your name',
body: '<input type="text" class="name" />',
buttons: {
'OK': {
class: 'btn btn-success',
callback: function(modal) {
var name = modal.$modalBody.find('.name').val();
if (!name) {
createModal({
header: 'Error',
body: 'You must provide a name',
buttons: {
'OK': {
class: 'btn'
}
}
});
} else {
alert(name);
};
},
},
'Close': {
class: 'btn btn-error'
}
}
});
});

关于javascript - 函数中的相同函数,保留变量/元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51991346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com