Jquery Selectize添加"全部清除"链接在Ajax

时间:2017-09-13 12:03:33

标签: javascript php jquery ajax selectize.js

我正在使用Jquery的Selectize标记库,这对我来说效果很好。

以下是我使用的代码。

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:

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>" });

        }
    });


},

但似乎无法正常工作,因为我无法在那里看到我添加的选项。在我的结果填充后,我无法看到我的超链接。

我已经知道使用类似下面的代码会在搜索后删除我填充的记录。

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

但我坚持将这个新项目附加或推送到我的代码中,并使用Ajax填充结果。

有人可以指导我如何实现这一目标。

5 个答案:

答案 0 :(得分: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()); if($(this).index()>=present) { } else { $(this).attr("href","javascript:;"); } }) $(".row").each(function(){ $("#finalAttribute").append($(this).attr("href")); }) })属性,而下面的属性将保持不变。您可以根据需要对其进行修改。

&#13;
&#13;
<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>
&#13;
    private void button1_Click(object sender, EventArgs e)
    {

    }
&#13;
&#13;
&#13;

答案 1 :(得分:4)

你能尝试这个方法,我相信你的问题是DOM渲染和绑定JS函数。由于元素在加载时不可用,因此元素不能通过javascript绑定。以下方法将起作用。

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

这里我已将函数绑定到body,但我再次检查目标元素是否为.my-hyperlink-custom-class。

答案 2 :(得分:3)

原谅我,我没有Selectize的经验,但我确实扫描了他们的examples并注意到了一些可能有帮助的事情:

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

在这个例子中,create:有函数原型function(input),它只有一个参数而没有回调函数。您的代码使用以下原型:create: function(input, callback)。从Selectize示例中,我只看到load:使用function(input, callback)

我建议将create:改为:

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以获得您想要的功能。

HTH

答案 3 :(得分: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 :(得分:2)

非常感谢大家的帮助和支持。特别感谢@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事件中以追加&#34;全部清除&#34;我的建议标签选项中的锚标签。

// 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);
});

希望这有帮助。