的單擊事件我動態添加一個選擇按鈕,可以單擊以從列表中選擇一個給定的接觸被附加到表。動態添加按鈕(使用jQuery)必須被點擊了兩次火已經被綁定到按鈕
我要在文檔中的任意位置單擊之前,我可以點擊動態添加按鈕。顯然,動態按鈕的綁定事件在第一次單擊之後纔會綁定。
順便說一句,在當前版本的函數中,我將一個點擊事件綁定到每個動態按鈕的文檔正文,然後查看事件目標是否是相關的動態按鈕,此時我會觸發所需的功能傳回選定的聯繫人。我轉而採用這種方法,給予他人經歷我在這裏描述的同樣事情的建議。在實現之前,我有一個非常傳統的$ J(「#btnId」)。bind('click',{....},function(event){...});方法來綁定點擊事件,這導致了在點擊事件觸發動態按鈕之前必須點擊兩次的相同體驗。我也從其他角度出發,使用jQuery的.bind,.live,.delegate方法,在所有情況下,我必須點擊兩次,才能實際觸發按鈕的點擊事件。
function PickContacts() {
if ($J("#tblCp").length > 0) {
var broad = $J("#chkCpBroad").prop("checked");
var contactType = GetCheckBoxListValues("divCpContactType");
var contactId = "";
if ($J("#txtCpContactId").length > 0) {
contactId = $J("#txtCpContactId").val();
}
var contactName = $J("#txtCpContactName").val();
var firstName = $J("#txtCpFirstName").val();
var lastName = $J("#txtCpLastName").val();
var email = $J("#txtCpEmail").val();
var allMatches = $J("#chkCpAllMatches").prop("checked");
var rows = ParseInts($J("#txtCpRowsReturned").val(), 10);
if (rows === 0) {
rows = 15;
}
var crmSeatsOnly = false;
if (cpCrmSeatsOnly !== null && cpCrmSeatsOnly === "Y") {
crmSeatsOnly = true;
}
var tbl = $J("#tblCpResults");
tbl.empty();
if (contactId !== "" || contactName !== "" || firstName !== "" || lastName !== "" || email !== "") {
$J.ajax({
type: "POST",
url: "/ClientBin/Contact.asmx/ContactPicker",
data: "{'broad':" + broad + ",'contactType':'" + contactType + "','contactId':'" + contactId + "','contactName':'" + contactName + "','firstName':'" + firstName + "','lastName':'" + lastName + "','email':'" + email + "','allMatches':" + allMatches + ",'crmSeatsOnly':" + crmSeatsOnly + ",'rows':" + rows + "}",
contentType: "application/json; charset=utf-8",
context: tbl,
success: function (result) {
if (result.d !== "TIME OUT") {
var JObject = ParseJson(result.d);
if (JObject !== null) {
if (JObject.RESULT[0].SUCCESS) {
var alternatingRow = false;
var c = JObject.CONTACT;
for (i = 0; i < c.length; i++) {
var trStyle = "rowstyleNoBorder";
if (alternatingRow) {
trStyle = "alternatingrowstyleNoBorder";
alternatingRow = false;
}
else {
alternatingRow = true;
}
this.append('<tr class="' + trStyle + '"><td><span id="lblCpContactId' + i + '">' + c[i].CONTACT_ID + '</span></td><td><span id="lblCpContactName' + i + '">' + c[i].CONTACT_NAME + '</span></td><td><span id="lblCpFirstName' + i + '">' + c[i].FIRST_NAME + '</span></td><td><span id="lblCpLastName' + i + '">' + c[i].LAST_NAME + '</span></td><td valign="top"><input type="submit" id="btnCpSelect' + i + '" value="' + $J("#hdnCpTransSelect").val() + '" title="' + $J("#hdnCpTransSelectContact").val() + '" /></td></tr>');
$J("body").bind('click', { index: i, contactId: c[i].CONTACT_ID, contactName: c[i].CONTACT_NAME, firstName: c[i].FIRST_NAME, lastName: c[i].LAST_NAME }, function (event) {
if ($J(event.target).is("#btnCpSelect" + event.data.index)) {
SelectContact(event.data.contactId, event.data.contactName, event.data.firstName, event.data.lastName);
return false;
}
});
// Copy button css styling from an existing on page button by passing the IDs for both buttons to the CopyBtnStyle fn.
CopyBtnStyle("btnCpSelect" + i, "btnCpClose");
}
}
else {
this.append('<tr><td><span id="lblCpNoRows">' + JObject.RESULT[0].FEEDBACK + '</span></td></tr>');
}
}
}
else {
TimeOut();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
WsFail(XMLHttpRequest, textStatus, errorThrown);
}
});
}
}
}
牆上的文字警示!一個簡短的,簡潔的例子,用最少量的不相關的代碼加上點對點的問題通常會產生更快更好的答案。 – DarthJDG
Tks的建議DarthJDG ...我從來沒有張貼在堆棧流量,可能已經做了瓦特/我的第一個職位的問題。我縮短了相應的希望獲得更多的閱讀。 – marsh76
修正你的帖子+1,歡迎來到SO!這樣的綁定事件並不是很好的做法,你應該使用'。委託()',它做了一個非常類似的事情,利用事件冒泡和檢查原始選擇器對'event.target'。你也不應該爲每一行綁定一個單獨的事件,特別是如果你有分頁,你最終可能會有數百個未使用但綁定的事件觸發每次點擊。必須有其他事情發生,你確定你沒有任何事件有條件地在DOM樹上調用'event.stopPropagation()'? – DarthJDG