2017-08-15 38 views
2

我試圖通過AJAX在選擇框更改時自動提交搜索過濾器表單。問題是在整個#filter表格div上使用.change。如果我在#address輸入中輸入文字,則不會顯示結果。一旦我改變了選擇值,結果就會顯示出來。它可以很好地使用.submit,但需要它自動發送。自動提交AJAX搜索表單上的選擇過濾器更改

JS

$('#filter').change(function(e){ 
    e.preventDefault(); 
    var filter = $('#filter'); 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 

     var place = autocomplete.getPlace(); 
     var elat = place.geometry.location.lat(); 
     var elng = place.geometry.location.lng(); 

     filter.append($('<input>',{type:'hidden', name:'elat'}).val(elat)); 
     filter.append($('<input>',{type:'hidden', name:'elng'}).val(elng)); 

    }); 

    $.ajax({ 
     url: filter.attr('action'), 
     data:filter.serialize(), 
     type: 'POST', // POST 
     dataType: 'json', 
     success: function(response) { 
      showCloseLocations(response); 
      $('#response').html(""); 
     } 
    }); 
    return false; 

}).change(); 

FORM(使用WordPress)

function search_form() 
{ 
    $address = $_GET['address']; 
    $widlat = $_GET['elat']; 
    $widlng = $_GET['elng']; ?> 

    <form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter"> 
    <input id="address" name="property_location" placeholder="Enter a city, country or postcode" type="text" value='<?php echo $address; ?>' required> 
    <input type="hidden" id="elat" name="elat" value='<?php echo $widlat; ?>'/> 
     <input type="hidden" id="elng" name="elng" value='<?php echo $widlng; ?>'/>  
     <select name="radius_miles" id="radius_km"> 
      <option value=1>+1 miles</option> 
      <option value=2>+2 miles</option> 
      <option value=5>+5 miles</option> 
      <option value=30 selected>+30 miles</option> 
     </select> 
     <input type="hidden" name="action" value="ek_search"> 
    </form> 

<?php 
} 
add_action('sco_search_form', 'search_form'); 
+0

還有一個'.keyup()'函數,你可以做的使用:https://api.jquery.com/keyup/ –

+0

文本框不執行「更改」事件。所以你需要使用別的東西來捕捉這些。 keyup是一個合理的選擇,雖然你可能想要阻止它自動發送,直到輸入了3個字符,所以你不要通過搜索「a」等來超載你的服務器。 – ADyson

回答

-2

在JQuery中的所有事件都稱爲與()方法。

在這裏,你有文件:http://api.jquery.com/on/

$(form).on('click', function(){}); 

$(form).on('focusin', function(){}); 

在這種情況下,它會像:

$("#filter").on('focusout', function(e){ 
    e.preventDefault(); 
    var filter = $('#filter'); 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 

     var place = autocomplete.getPlace(); 
     var elat = place.geometry.location.lat(); 
     var elng = place.geometry.location.lng(); 

     filter.append($('<input>',{type:'hidden', name:'elat'}).val(elat)); 
     filter.append($('<input>',{type:'hidden', name:'elng'}).val(elng)); 

    }); 

    $.ajax({ 
     url: filter.attr('action'), 
     data:filter.serialize(), 
     type: 'POST', // POST 
     dataType: 'json', 
     success: function(response) { 
      showCloseLocations(response); 
      $('#response').html(""); 
     } 
    }); 
    return false; 

}); 
+1

「使用on()方法調用JQuery中的所有事件。」這種說法本身是不正確的。當然可以用這種語法聲明所有事件處理程序,但並不總是必需的。有許多捷徑方法,例如http://api.jquery.com/click/和http://api.jquery.com/change/是更常用的一些。爲了解決具體問題,「專注」不會解決OP在用戶鍵入內容時搜索的要求。在這個例子中,他們必須等到焦點離開文本框。不是非常用戶友好恕我直言 – ADyson

2

您需要將事件處理程序附加到每個可見input字段中輸入您的形式和使用的情況下input而不是change事件:

$('#filter :input:visible') 

的完整代碼:

$('#filter :input:visible').on('input', function (e) { 
    var filter = $('#filter'); 
    google.maps.event.addListener(autocomplete, 'place_changed', function() { 

    var place = autocomplete.getPlace(); 
    var elat = place.geometry.location.lat(); 
    var elng = place.geometry.location.lng(); 

    filter.append($('<input>', {type: 'hidden', name: 'elat'}).val(elat)); 
    filter.append($('<input>', {type: 'hidden', name: 'elng'}).val(elng)); 

    $.ajax({ 
     url: filter.attr('action'), 
     data: filter.serialize(), 
     type: 'POST', // POST 
     dataType: 'json', 
     success: function (response) { 
      showCloseLocations(response); 
      $('#response').html(""); 
     } 
    }); 
}); 
<form action="xxx" method="POST" id="filter"> 
    <input id="address" name="property_location" placeholder="Enter a city, country or postcode" type="text" 
      value='<?php echo $address; ?>' required> 
    <input type="hidden" id="elat" name="elat" value='<?php echo $widlat; ?>'/> 
    <input type="hidden" id="elng" name="elng" value='<?php echo $widlng; ?>'/> 
    <select name="radius_miles" id="radius_km"> 
     <option value=1>+1 miles</option> 
     <option value=2>+2 miles</option> 
     <option value=5>+5 miles</option> 
     <option value=30 selected>+30 miles</option> 
    </select> 
    <input type="hidden" name="action" value="ek_search"> 
</form> 
+0

感謝,它的工作原理,但它現在循環查詢多次,而不是一次改變選擇/輸入。請參閱http://i.imgur.com/dyUCphP.png – scopeak

+0

@scopeak的確,每次更改select時都會執行處理函數。如果你只需要執行一次,你可以改變**。on('input',** to **。其中一個('輸入',** – gaetanoM

+0

)也可以工作,但會停止任何正在工作的選擇(理解原因),但響應會多次循環相同的結果,例如,設置爲選項值1的半徑應只輸出兩個帖子。它會輸出兩個額外的8倍?希望圖解釋更好! - http://i.imgur.com/CV0FvLp.jpg – scopeak

2

如果你想在每次輸入字段改變時發送一個請求,你應該使用keyup()

change()對於輸入和textarea只有當元素失去焦點時才更新。

看起來是這樣的:

var filter = $("#filter"), 
 
    listener = function (e) { 
 
     e.preventDefault(); 
 
     google.maps.event.addListener(autocomplete, 'place_changed', function() { 
 

 
      var place = autocomplete.getPlace(); 
 
      var elat = place.geometry.location.lat(); 
 
      var elng = place.geometry.location.lng(); 
 

 
      filter.append($('<input>',{type:'hidden', name:'elat'}).val(elat)); 
 
      filter.append($('<input>',{type:'hidden', name:'elng'}).val(elng)); 
 

 
     }); 
 

 
     $.ajax({ 
 
      url: filter.attr('action'), 
 
      data:filter.serialize(), 
 
      type: 'POST', // POST 
 
      dataType: 'json', 
 
      success: function(response) { 
 
       showCloseLocations(response); 
 
       $('#response').html(""); 
 
      } 
 
     }); 
 
     return false; 
 
    }; 
 

 

 
$('#address').keyup(listener); 
 
$('#radius_km').change(listener);