2017-09-13 65 views
9

我正在使用Jquery的Selectize標記庫,它對我來說目前效果很好。Jquery Selectize在Ajax選項的頂部添加「全部清除」鏈接

下面是我用過的代碼。

JavaScript代碼:

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

PHP代碼:

/* API for autocomplete list of properties */ 
Route::post('/search-property-autocomplete', function() { 
    if (!empty(trim($_POST['q']))) { 
     $search_term = trim($_POST['q']); 


     // getting Suburb State and Postcode of the properties based on search 
     $query = Property::join('technobrave_suburbs_', function($join) { 

        $join->on('technobrave_properties_.suburb_id', '=', 'technobrave_suburbs_.id'); 
       }); 

     $query->join('technobrave_states_', function($join) { 
      $join->on('technobrave_properties_.state_id', '=', 'technobrave_states_.id'); 
     }); 


     $query->select('technobrave_properties_.*', 'technobrave_suburbs_.suburb', 'technobrave_states_.state_name'); 

     $query->where(function($query) use ($search_term) { 
      $query->where('technobrave_properties_.post_code', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_suburbs_.suburb', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_states_.state_name', 'LIKE', '%' . $search_term . '%'); 
     }); 
     $data = $query->take(8)->get(); // getting maximum 8 records only 

     if ($data) { 
      foreach ($data as $current_record) { 
       $result[] = array(
        'address' => $current_record->suburb . ' ' . $current_record->state_name . ' ' . $current_record->post_code 
       ); 
      } 
     } 
    } else { 
     $result = []; 
    } 
    echo json_encode(array('properties' => $result)); 
}); 

正如你可以看到在上面的代碼中,我使用Ajax來填充數據,並通過調用我的PHP越來越記錄功能工作得很好。

現在,我想在我的所有結果頂部添加一個項目作爲超鏈接,如全部清除每當我搜索或輸入我的輸入框時都會出現。

如果我點擊清除全部鏈接,應該清除下面附加的結果。

要使用由Selectize提供的clearoptions()事件,我已經更新了我的​​符合我的JavaScript代碼:

create: function(input, callback) { 

    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      callback(); 
     }, 
     success: function(res) { 

      return callback({ address: "<a href='javascript:void(0)'>Clear All</a>" }); 

     } 
    }); 


}, 

但它似乎沒有工作,因爲我看不到我的添加選項那裏。填充結果後,我無法看到我的超鏈接。

我已經知道使用下面的somethink代碼會在我搜索後刪除我填充的記錄。

$('.my-hyperlink-custom-class').on('click', function() { 
    control.clearOptions(); 
}); 

但我堅持追加或推新的項目,以我的代碼與我填充使用Ajax的結果。

有人可以指導我如何實現這一目標。

回答

1

非常感謝大家的幫助和支持。並特別感謝@afeique的提示來實現此功能。

這是我最終想出的解決方案。

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 

     // Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 


$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

我修改我的代碼位,並把下面的代碼在我load事件追加在我的建議標籤選擇「全部清除」錨標記。

// Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 

然後,我只是想清除緩存和選項,因此我把下面的代碼。

$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

希望這會有所幫助。

4

這是我寫的腳本。這會改變以上的所有href屬性與javascript:;,而下面的將保持不變。您可以根據您的需要修改此屬性。

$(".row").click(function(){ 
 
var present = $(this).index(); 
 
console.log("present"+present) 
 
$(this).closest('.container').find('.row').each(function(index,element){ 
 
    console.log("eachindex"+$(this).index()); 
 
    \t if($(this).index()>=present) { 
 
    \t 
 
    } 
 
    else { 
 
    \t $(this).attr("href","javascript:;"); 
 
    } 
 
}) 
 
$(".row").each(function(){ 
 
    \t $("#finalAttribute").append($(this).attr("href")); 
 
}) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="container"> 
 
    <a class="row row1" href="#1"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row2" href="#2"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row3" href="#3"> 
 
    R2 
 
    </a> 
 
    <br/> 
 
    <a class="row row4" href="#4"> 
 
    R3 
 
    </a> 
 
    <br/> 
 
      <a class="row row5" href="#5"> 
 
    R4 
 
    </a> 
 
    <br/> 
 
</div> 
 
<div id="finalAttribute"> 
 

 

 
</div>

3

原諒我,我沒有與Selectize經驗,但我可以用自己的examples掃描並發現了一些可能會有所幫助:

$('#input-tags3').selectize({ 
    plugins: ['remove_button'], 
    delimiter: ',', 
    persist: false, 
    create: function(input) { 
     return { 
      value: input, 
      text: input 
     } 
    } 
}); 

在這個例子中,​​函數原型function(input)只有一個參數,沒有回調函數。您的代碼使用以下原型:create: function(input, callback)。從Selectize示例中,我只看到load:使用function(input, callback)

我建議改變你​​的東西沿着線:

create: function(input) { 
    // append "clear all" anchor to top of search div 
    $("#searchDiv").append('<a href="#" class="clearAll">Clear All</a>') 

    // perform autocomplete AJAX 
    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      // add text 
      return input; 
     }, 
     success: function(res) { 
      // TODO: do something to display the autocomplete results 
      // e.g. create a dropdown with autcomplete suggestions 
      // TODO: handle user selecting one of the suggestions 

      // add text 
      return input; 
     } 
    }); 


}, 

,並填寫必要的TODO s到得到你想要的功能。

HTH

+1

你的答案以某種方式幫助我解決或實現我想要的。因此我選擇你的答案給予賞金獎勵。但是,如果有人堅持同樣的問題,我提供了我的答案作爲最終的代碼。謝謝。 –

+1

[這裏](https://stackoverflow.com/a/46398821/6829420)是我想出來的。 –

3

您試圖實現的內容可以做一點不同。 使用創建當您選擇頂部顯示的添加...選項時,回調會創建不在最初選項列表中的新項目。這不是你想要的。

試試看:

var $select = $('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: false, 
    score: function() { return function() { return 1; }; }, 
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 

     if(value == 'Clear All') { 
      var control = $select[0].selectize; 
      control.clearOptions(); 
     } 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       // add the clear All option on top. 
       res.properties.unshift({address: "Clear All" }); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

這增加了一個額外的選擇和使用onChange事件時選擇清除選項。

還要注意得分選項,以便禁用默認篩選。

4

你可以試試這個方法,我相信你的問題是用DOM渲染和綁定JS函數。由於該元素在加載時不可用,因此該元素不能通過與javascript綁定。下面的方法將起作用。

$('body').on('click', '.my-hyperlink-custom-class', function() { 
    control.clearOptions(); 
}); 

這裏我已經將函數綁定到body,但是我再次檢查目標元素是否是.my-hyperlink-custom-class。