(耳鼻喉科){ //阻止单击事件的默认操作 event.preventDefault(); //从行中检索数据 var数据=$(此).tr.数据(“联系人”); //选择联系人 选择Contact(data.contactId、data.contactName、data.firstName、data.lastName); }); 函数PickContacts(){ 如果($J(“#tblCp”)。长度>0){ var broad=$J(“#chkCpBroad”).prop(“选中”); var contactType=GetCheckBoxListValues(“divCpContactType”); var contactId=“”; 如果($J(“#txtCpContactId”).length>0){ contactId=$J(“#txtCpContactId”).val(); } var contactName=$J(“#txtcpccontactname”).val(); var firstName=$J(“#txtcfirstname”).val(); var lastName=$J(“#txtclastname”).val(); var email=$J(“#txtCpEmail”).val(); var allMatches=$J(“#chkCpAllMatches”).prop(“选中”); var rows=ParseInts($J(“#txtCpRowsReturned”).val(),10); 如果(行===0){ 行数=15; } var crmSeatsOnly=假; if(cpCrmSeatsOnly!==null&&cpCrmSeatsOnly===Y){ crmSeatsOnly=真; } tblCpResults.empty(); 如果(contactId!==“contactName!”==“firstName!”==“lastName!”==“电子邮件!”){ $J.ajax({ 类型:“POST”, url:“/ClientBin/Contact.asmx/ContactPicker”, //在这里使用普通对象更容易维护 数据:{ "宽":宽,, “contactType”:contactType, “contactId”:contactId, “contactName”:contactName, “名字”:名字, “lastName”:lastName, “电子邮件”:电子邮件, “所有匹配”:所有匹配, “crmSeatsOnly”:crmSeatsOnly, “行”:行 }, contentType:“应用程序/json;字符集=utf-8”, 成功:功能(结果){ if(result.d==“超时”){ 超时(); 返回; } var JObject=ParseJson(result.d), //缓存这些选择器,这样我们就不必在for循环中重新选择它们 hdnCpTransSelect=$J(“#hdnCpTransSelect”), hdnCpTransSelectContact=$J(“#hdnCpTransSelectContact”); if(JObject!==null){ 如果(!JObject.RESULT[0]。成功){ tblCpResults.append(“”+JObject.RESULT[0]。反馈+“”); 返回; } var c=JObject.CONTACT; //创建一个空jQuery对象来填充所有行 var行=$(); 对于(i=0;i
好的。。。我把事情搞清楚了。我不确定这在技术上为什么会是个问题,也许这里有一位更有知识的贡献者可以为我解释一下,但是我不得不点击这些动态按钮两次来触发点击事件的问题是因为我已经连接了我的“PickContacts”要在表单中我的文本输入字段的keyup和blur事件上调用的JS函数 虽然显然有点多余,但我不确定这为什么会是一个问题,因为在调用WS方法检索联系人列表之前,我确实清空了显示WS方法返回的结果的表。因此,我假设随着表行及其元素从DOM中删除,键向上或模糊(以先到者为准)时绑定到动态按钮的click事件也将从DOM中删除 我可以肯定地说,我所能观察到的就是,在我从文本输入字段中删除其中一个事件后,将另一个事件保留在原位,我必须单击两次才能触发按钮的单击事件的问题就解决了 如果有人从技术上知道为什么绑定这两个事件来调用这个构建列表的函数会产生问题,我很想从根本上更好地理解它(耳鼻喉科){ //阻止单击事件的默认操作 event.preventDefault(); //从行中检索数据 var数据=$(此).tr.数据(“联系人”); //选择联系人 选择Contact(data.contactId、data.contactName、data.firstName、data.lastName); }); 函数PickContacts(){ 如果($J(“#tblCp”)。长度>0){ var broad=$J(“#chkCpBroad”).prop(“选中”); var contactType=GetCheckBoxListValues(“divCpContactType”); var contactId=“”; 如果($J(“#txtCpContactId”).length>0){ contactId=$J(“#txtCpContactId”).val(); } var contactName=$J(“#txtcpccontactname”).val(); var firstName=$J(“#txtcfirstname”).val(); var lastName=$J(“#txtclastname”).val(); var email=$J(“#txtCpEmail”).val(); var allMatches=$J(“#chkCpAllMatches”).prop(“选中”); var rows=ParseInts($J(“#txtCpRowsReturned”).val(),10); 如果(行===0){ 行数=15; } var crmSeatsOnly=假; if(cpCrmSeatsOnly!==null&&cpCrmSeatsOnly===Y){ crmSeatsOnly=真; } tblCpResults.empty(); 如果(contactId!==“contactName!”==“firstName!”==“lastName!”==“电子邮件!”){ $J.ajax({ 类型:“POST”, url:“/ClientBin/Contact.asmx/ContactPicker”, //在这里使用普通对象更容易维护 数据:{ "宽":宽,, “contactType”:contactType, “contactId”:contactId, “contactName”:contactName, “名字”:名字, “lastName”:lastName, “电子邮件”:电子邮件, “所有匹配”:所有匹配, “crmSeatsOnly”:crmSeatsOnly, “行”:行 }, contentType:“应用程序/json;字符集=utf-8”, 成功:功能(结果){ if(result.d==“超时”){ 超时(); 返回; } var JObject=ParseJson(result.d), //缓存这些选择器,这样我们就不必在for循环中重新选择它们 hdnCpTransSelect=$J(“#hdnCpTransSelect”), hdnCpTransSelectContact=$J(“#hdnCpTransSelectContact”); if(JObject!==null){ 如果(!JObject.RESULT[0]。成功){ tblCpResults.append(“”+JObject.RESULT[0]。反馈+“”); 返回; } var c=JObject.CONTACT; //创建一个空jQuery对象来填充所有行 var行=$(); 对于(i=0;i,jquery,button,click,Jquery,Button,Click,好的。。。我把事情搞清楚了。我不确定这在技术上为什么会是个问题,也许这里有一位更有知识的贡献者可以为我解释一下,但是我不得不点击这些动态按钮两次来触发点击事件的问题是因为我已经连接了我的“PickContacts”要在表单中我的文本输入字段的keyup和blur事件上调用的JS函数 虽然显然有点多余,但我不确定这为什么会是一个问题,因为在调用WS方法检索联系人列表之前,我确实清空了显示WS方法返回的结果的表。因此,我假设随着表行及其元素从DOM中删除,键向上或模糊(以先到者为准)时绑定到动态按钮
无论如何,我再次感谢PetersonDidIt和DarthJDG的关注。文本警报墙!一个漂亮、简短、简洁的例子,用最少的无关代码,再加上直截了当的问题,通常会得到更快更好的答案。。。我从来并没有在堆栈流上发布过帖子,可能是在我的第一篇文章中发布的
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);
}
});
}
}
}
// Create an easy to edit template for our row
var contactsRowtmpl = '<tr class="%trStyle%"><td><span id="lblCpContactId%index%">%CONTACT_ID%</span></td>'+
'<td><span id="lblCpContactName%index%">%CONTACT_NAME%</span></td>'+
'<td><span id="lblCpFirstName%index%">%FIRST_NAME%</span></td>'+
'<td><span id="lblCpLastName%index%">%LAST_NAME%</span></td>'+
'<td valign="top"><input type="submit" id="btnCpSelect%index%" class="CpSelect" value="%value%" title="%title%" /></td></tr>';
// Very simple templating function
function template( tmpl, data ) {
return tmpl.replace(/%(\w*)%/g,function(){ return data[ arguments[1] ] || "";});
}
// Cache the table selector
var tblCpResults = $J("#tblCpResults");
// Use delegate to bind the click event to for all input.CpSelet
tblCpResults.delegate("click", ".CpSelect", function (event) {
// prevent the default action of the click event
event.preventDefault();
// retrive the data from the row
var data = $( this ).closest("tr").data("contact");
// Select the contact
SelectContact(data.contactId, data.contactName, data.firstName, data.lastName);
});
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;
}
tblCpResults.empty();
if (contactId !== "" || contactName !== "" || firstName !== "" || lastName !== "" || email !== "") {
$J.ajax({
type: "POST",
url: "/ClientBin/Contact.asmx/ContactPicker",
// Use a normal object here much easier to maintain
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",
success: function (result) {
if (result.d === "TIME OUT") {
TimeOut();
return;
}
var JObject = ParseJson(result.d),
// Cache these selectors so we don't have to reselect them in the for loop
hdnCpTransSelect = $J("#hdnCpTransSelect"),
hdnCpTransSelectContact = $J("#hdnCpTransSelectContact");
if (JObject !== null) {
if (!JObject.RESULT[0].SUCCESS) {
tblCpResults.append('<tr><td><span id="lblCpNoRows">' + JObject.RESULT[0].FEEDBACK + '</span></td></tr>');
return;
}
var c = JObject.CONTACT;
// Create an empty jQuery object to stuff all of the rows in
var rows = $();
for (i = 0; i < c.length; i++) {
c[ i ].trStyle = ( i % 2 ) ? "alternatingrowstyleNoBorder" : "rowstyleNoBorder";
c[ i ].index = i;
c[ i ].value = hdnCpTransSelect.val();
c[ i ].title = hdnCpTransSelectContact.val();
// Use the template function to handle creating our row
var row = template( contactsRowtmpl, c[ i ] );
// Add the contacts data to the row so we can retrive it later
$.data( row, "contact", c[ i ] );
// add the row to the rows jQuery object
rows = rows.add( row );
// Why do you need to copy the btn style? seems like this could be improved on.
CopyBtnStyle("btnCpSelect" + i, "btnCpClose");
}
// Now that we are done looping add all the rows to the dom.
tblCpResults.append( rows );
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
WsFail(XMLHttpRequest, textStatus, errorThrown);
}
});
}
}
}