我有一個函數可以在對話框標題中創建按鈕元素。但是,click事件會附加到所有按鈕而不是當前按鈕。JQuery單擊事件附加到多個元素
_createTitlebarButtons : function(){
for (var each in this.options.titlebarButtons) {
var self = this,
props = this.options.titlebarButtons[each];
if (!props.icon){ props.icon = ""}
if (!props.name){ props.name = "button-"+each.toString()}
if (!props.click){ props.click = function(){} }
if (!props.text){ props.text = "" }
var curButton = $("<button type='button' id='btn-"+each+"' ></button>").button({
type: "button",
label: $("<a>").text(props.text).html(),
icon: props.icon,
showLabel: false
})
.attr("name", props.name)
.css("right", 3+22*(Number(each)+1))
.appendTo(this.uiDialogTitlebar)
.on("click", function(event) {
event.preventDefault();
props.click.apply(self.element[ 0 ], arguments);
});
this._addClass(curButton, "ui-dialog-titlebar-close");
}
},
所有圖標和類都可以工作。但是,click事件會附加到所有按鈕而不是一個按鈕。所以如果我有多個按鈕,點擊事件對所有按鈕都是一樣的。它將成爲最後一個按鈕的點擊事件。所以:
titlebarButtons : [
{
name: "button1",
text: "tooltip",
icon: "ui-icon-heart",
click:function(){
console.log("Button1 Clicked");
console.log(this);
}
},
{
name: "button2",
text: "tooltip",
icon: "ui-icon-close",
click:function(){
console.log("Button2 Clicked");
console.log(this);
}
}
]
將創建2個按鈕,但點擊時他們都將說:「Button2的被點擊的」,而第一個應該說「Button1的點擊」。
編輯:由於範圍問題,不得不使用$ .each而不是for循環。
$.each(this.options.titlebarButtons, function(index){
console.log(this);
var props = this;
if (!props.icon){ props.icon = ""}
if (!props.name){ props.name = "button-"+index}
if (!props.click){ props.click = function(){} }
if (!props.text){ props.text = "" }
var curButton = $("<button type='button' ></button>").button({
type: "button",
label: $("<a>").text(props.text).html(),
icon: props.icon,
showLabel: false
})
.attr("name", props.name)
.css("right", 3+22*(Number(index)+1))
.appendTo(self.uiDialogTitlebar)
.on("click", function(event) {
event.preventDefault();
props.click.apply(self.element[ 0 ], arguments);
});
self._addClass(curButton, "ui-dialog-titlebar-close");
})
在這種情況下,可以使用'。點擊()''對比。對( 「點擊」)'。我發現前者在這種情況下工作得更好。 – Twisty
作用域 - 你的'self'在循環之外,因此在調用click事件時變爲循環的最後一個元素。 「但它是在循環內部聲明的」,你說 - 也許,但範圍仍然在外面,因爲這是JS變量的工作原理。 –