2015-02-24 20 views
5

Tôi đang thực hiện nhiều dịch vụ web dựa trên cuộc gọi ajax. Tôi lắng nghe sự kiện đính kèm mọi yếu tố dom. Và mọi trình xử lý sự kiện đều yêu cầu cuộc gọi ajax trong đó. Nhân tiện, mã nguồn của tôi trở nên bẩn và phức tạp hơn. Tôi muốn giảm mã boilerplate và trông đơn giản hơn với các cuộc gọi ajax.Làm thế nào tôi có thể thực hiện nhiều cuộc gọi ajax jQuery trông đẹp mắt?

Tôi làm cách nào để thực hiện điều đó một cách hiệu quả?

Mẫu mã trông như thế này:

<a href="javascript:void(0);" class="button1">button1</a> 
<a href="javascript:void(0);" class="button2">button2</a> 
<a href="javascript:void(0);" class="button3">button3</a> 
<a href="javascript:void(0);" class="button4">button4</a> 

$('.button1').on('click', function() { 
    $.ajax({ 
     url: '/api/1/resource1', 
     data: { 
      value1: 'value1', 
      value2: 'value2' 
     }, 
     success: function (response) { 
      $('.some_dom1').html(Handlebars.resource({items:response.items})); 
     } 
    }); 
}); 

$('.button2').on('click', function() { 
    $.ajax({ 
     url: '/api/1/resource2', 
     data: { 
      value1: 'value1', 
      value2: 'value2' 
     }, 
     success: function (response) { 
      $('.some_dom2').html(Handlebars.resource({items:response.items})); 
     } 
    }); 
}); 

$('.button3').on('click', function() { 
    $.ajax({ 
     url: '/api/1/resource3', 
     data: { 
      value1: 'value1', 
      value2: 'value2' 
     }, 
     success: function (response) { 
      $('.some_dom3').html(Handlebars.resource({items:response.items})); 
     } 
    }); 
}); 

$('.button4').on('click', function() { 
    $.ajax({ 
     url: '/api/1/resource4', 
     data: { 
      value1: 'value1', 
      value2: 'value2' 
     }, 
     success: function (response) { 
      $('.some_dom4').html(Handlebars.resource({items:response.items})); 
     } 
    }); 
}); 

Cập nhật:

Mỗi tên lớp và xử lý phản ứng ajax là không giống nhau. Ví dụ mã chỉ cho thấy mã boilerplate và phức tạp. Đây không phải là vấn đề của tên lớp hoặc báo cáo if else.

Trả lời

5

Make chức năng phổ biến như thế này:

String.prototype.endsWith = function(suffix) { 
    return this.indexOf(suffix, this.length - suffix.length) !== -1; 
}; 

var doAjax_params_default = { 
    'url': null, 
    'requestType': "GET", 
    'contentType': 'application/x-www-form-urlencoded; charset=UTF-8', 
    'dataType': 'json', 
    'data': {}, 
    'beforeSendCallbackFunction': null, 
    'successCallbackFunction': null, 
    'completeCallbackFunction': null, 
    'errorCallBackFunction': null, 
}; 


function doAjax(doAjax_params) { 

    var url = doAjax_params['url']; 
    var requestType = doAjax_params['requestType']; 
    var contentType = doAjax_params['contentType']; 
    var dataType = doAjax_params['dataType']; 
    var data = doAjax_params['data']; 
    var beforeSendCallbackFunction = doAjax_params['beforeSendCallbackFunction']; 
    var successCallbackFunction = doAjax_params['successCallbackFunction']; 
    var completeCallbackFunction = doAjax_params['completeCallbackFunction']; 
    var errorCallBackFunction = doAjax_params['errorCallBackFunction']; 

    //make sure that url ends with '/' 
    /*if(!url.endsWith("/")){ 
    url = url + "/"; 
    }*/ 

    $.ajax({ 
     url: url, 
     crossDomain: true, 
     type: requestType, 
     contentType: contentType, 
     dataType: dataType, 
     data: data, 
     beforeSend: function(jqXHR, settings) { 
      if (typeof beforeSendCallbackFunction === "function") { 
       beforeSendCallbackFunction(); 
      } 
     }, 
     success: function(data, textStatus, jqXHR) {  
      if (typeof successCallbackFunction === "function") { 
       successCallbackFunction(data); 
      } 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      if (typeof errorCallBackFunction === "function") { 
       errorCallBackFunction(errorThrown); 
      } 

     }, 
     complete: function(jqXHR, textStatus) { 
      if (typeof completeCallbackFunction === "function") { 
       completeCallbackFunction(); 
      } 
     } 
    }); 
} 

sau đó trong mã của bạn:

$('.button').on('click', function() { 
    var params = $.extend({}, doAjax_params_default); 
    params['url'] = `your url`; 
    params['data'] = `your data`; 
    params['successCallbackFunction'] = `your success callback function` 
    doAjax(params); 
}); 
3

Sử dụng một lớp học phổ biến:

<a href="javascript:void(0);" class="button">button1</a> 
<a href="javascript:void(0);" class="button">button2</a> 
<a href="javascript:void(0);" class="button">button3</a> 
<a href="javascript:void(0);" class="button">button4</a> 

thêm nghe để lớp này:

$('.button').on('click', function() { 
//find the index of the element and use it 
    var btnNumber= $(".button").index(this)+1; 

    $.ajax({ 
     url: '/api/1/resource'+btnNumber, 
     data: { 
      value1: 'value1', 
      value2: 'value2' 
     }, 
     success: function (response) { 
      $('.some_dom'+btnNumber).html(Handlebars.resource({items:response.items})); 
     } 
    }); 
}); 

Bạn cũng có thể sử dụng bất kỳ loại thuộc tính và sử dụng nó sau này đối với bất kỳ dữ liệu hoặc thông số

như:

<a href="javascript:void(0);" abc="hello1" class="button">button1</a> 
<a href="javascript:void(0);" abc="hello2" class="button">button2</a> 
<a href="javascript:void(0);" abc="hello3" class="button">button3</a> 
<a href="javascript:void(0);" abc="hello4" class="button">button4</a> 

và sau đó sử dụng nó cho mục đích nào

$('.button').on('click', function() { 
    var dVal=$(this).attr('abc'); 
//use dVal any where you want. 
    alert(dVal); 

}); 
+0

Mỗi tên lớp và trình xử lý phản hồi ajax không giống nhau. – gentlejo

2

Bạn có thể làm theo sự thay đổi này:

<a href="javascript:void(0);" data-url="/api/1/resource1" class="button">button1</a> 
<a href="javascript:void(0);" data-url="/api/1/resource2" class="button">button2</a> 
<a href="javascript:void(0);" data-url="/api/1/resource3" class="button">button3</a> 
<a href="javascript:void(0);" data-url="/api/1/resource4" class="button">button4</a> 

Make sử dụng data-* thuộc tính để giữ url cụ thể cho mỗi liên kết đó sẽ được nhấp vào. Bây giờ chỉ cần một sự thay đổi và bạn sẽ có một sự kiện nhấp chuột phổ biến đối với tất cả các cuộc gọi ajax:

$('.button').on('click', function() { 
    var url = $(this).data('url'); 
    var index = $(this).index(); 
    $.ajax({ 
    url: url, 
    data: { 
     value1: 'value1', 
     value2: 'value2' 
    }, 
    success: function(response) { 
     $('.some_dom'+index).html(Handlebars.resource({items: response.items})); 
    } 
    }); 
}); 

Theo cập nhật của bạn trong câu hỏi của bạn, bạn có thể cố gắng làm điều này:

success: function(response) { 
     if(url.indexOf('1') != -1){ 
      $('.some_dom1').html(Handlebars.resource({items: response.items})); 
     }else if(url.indexOf('2') != -1){ 
      $('.some_dom2').html(Handlebars.resource({items: response.items})); 
     }else if(url.indexOf('3') != -1){ 
      $('.some_dom3').html(Handlebars.resource({items: response.items})); 
     } 
    } 

Trong thành công bạn phải kiểm tra nếu url hiện tại của cuộc gọi ajax có điều gì đó khác với các cuộc gọi khác, vì vậy nếu cuộc gọi đó khớp nhau thì bạn có thể phân biệt nó trong các điều kiện if/else if.

0

Bạn có thể cung cấp lớp nút chung cho tất cả các thẻ và bạn có thể có một trình xử lý sự kiện duy nhất. Sau đó, trên cơ sở tên lớp khác, bạn có thể thực hiện cuộc gọi bằng cách sử dụng url và dữ liệu khác nhau.

<a href="javascript:void(0);" class="button button1">button1</a> 
<a href="javascript:void(0);" class="button button2">button2</a> 
<a href="javascript:void(0);" class="button button3">button3</a> 
<a href="javascript:void(0);" class="button button4">button4</a> 


var ajaxFunc = function(url, data, successFun){ 
    $.ajax({ 
     url: url, 
     data:data, 
     success: successFun 
    }); 
} 

$('button').on('click', buttonClick); 


function buttonClick(){ 
    var elem = $(event.target), 
     url='', data; 
    if(elem.hasClass('button1')){ 
     url = '/api/1/resource1'; 
     data = { 
      value1: 'value1', 
      value2: 'value2' 
     } 
     ajaxFunc(url, data, successFun1); 
    } else if(elem.hasClass('button2')){ 
     url = '/api/1/resource2'; 
     data = { 
      value1: 'value1', 
      value2: 'value2' 
     } 
     ajaxFunc(url, data, successFun2) 
    } else if(elem.hasClass('button3')){ 
     url = '/api/1/resource3'; 
     data = { 
      value1: 'value1', 
      value2: 'value2' 
     } 
     ajaxFunc(url, data, successFun3) 
    } 
    else if(elem.hasClass('button4')){ 
     url = '/api/1/resource4'; 
     data = { 
      value1: 'value1', 
      value2: 'value2' 
     } 
     ajaxFunc(url, data, successFun4) 
    } 
} 

function successFun1(evt){ 

} 
function successFun2(evt){ 

} 

Nếu bạn không làm gì khác thì bạn chỉ có thể thực hiện một chức năng thành công.

0

Mẫu cho thẻ neo có thể như thế này

<a data-url="url" data-dataId="dataKey" data-success="functionName" onclick="ajax_call(this);">button</a> 

hoặc

<a href="javascript:void(0);" data-completeObj="completeObj" onclick="ajax_call(this);" class="button">button</a> 

Sau đó, phần javascript và jQuery. Lưu trữ tất cả các thông số cần thiết để chuyển cho mỗi yêu cầu bằng một khóa, khóa này phải khớp với thuộc tính dữ liệu html.

var myBigJsonObj = { 
    data1 : { "foo": "bar" }, 
    data2 : { "foo": "bar", "foo1": "bar1"}     
}; 

Chức năng thành công do người dùng xác định. Tương tự như vậy có thể có chức năng lỗi.

function success() { 
    // Do some stuff here 
    alert('Success'); 
} 

Cuối cùng, cuộc gọi yêu cầu ajax.

function ajax_call(obj) { 
    var url = obj.getAttribute('data-url'); 
    var data = myBigJsonObj[obj.getAttribute('data-dataID')]; 
    var success = obj.getAttribute('data-success'); 

    $.ajax({ 
     url: url, 
     data: data, 
     success: window[success].call(); 
    }); 
} 
Các vấn đề liên quan