Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 10.07.2019, 11:55
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

Есть комбобоксы без ajax'а. Т.е. поведение как в демке меня устраивает.
А вот с ajax-ами я изначально сделал через параметры, теперь передал на передачу функции в виде параметра, как подсказал Rise, но опять же не уверен, что это правильно.

Много дублирующегося кода получается.
Ответить с цитированием
  #12 (permalink)  
Старый 10.07.2019, 12:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Misha_White,
вариант с data-url
два селекта, один с data-url, ввести несуществующее значение в оба, чтоб увидеть разницу
строки 54 и 266
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Autocomplete - Combobox</title>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <style>
        .custom-combobox {

            position: relative;

            display: inline-block;

        }

        .custom-combobox-toggle {

            position: absolute;

            top: 0;

            bottom: 0;

            margin-left: -1px;

            padding: 0;

        }

        .custom-combobox-input {

            margin: 0;

            padding: 5px 10px;

        }
  </style>
  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  <script>
        $(function() {

            $.widget("custom.combobox", {

                _create: function() {

                    this.wrapper = $("<span>")

                        .addClass("custom-combobox")

                        .insertAfter(this.element);

                    this.url = this.element.data("url");

                    this.element.hide();

                    this._createAutocomplete();

                    this._createShowAllButton();

                },



                _createAutocomplete: function() {

                    var selected = this.element.children(":selected"),

                        value = selected.val() ? selected.text() : "";



                    this.input = $("<input>")

                        .appendTo(this.wrapper)

                        .val(value)

                        .attr("title", "")

                        .addClass("custom-combobox-input ui-widget ui-widget-content ui-state-default ui-corner-left")

                        .autocomplete({

                            delay: 0,

                            minLength: 0,

                            source: $.proxy(this, "_source")

                        })

                        .tooltip({

                            classes: {

                                "ui-tooltip": "ui-state-highlight"

                            }

                        });



                    this._on(this.input, {

                        autocompleteselect: function(event, ui) {

                            ui.item.option.selected = true;

                            this._trigger("select", event, {

                                item: ui.item.option

                            });

                        },



                        autocompletechange: "_removeIfInvalid"

                    });

                },



                _createShowAllButton: function() {

                    var input = this.input,

                        wasOpen = false;



                    $("<a>")

                        .attr("tabIndex", -1)

                        .attr("title", "Show All Items")

                        .tooltip()

                        .appendTo(this.wrapper)

                        .button({

                            icons: {

                                primary: "ui-icon-triangle-1-s"

                            },

                            text: false

                        })

                        .removeClass("ui-corner-all")

                        .addClass("custom-combobox-toggle ui-corner-right")

                        .on("mousedown", function() {

                            wasOpen = input.autocomplete("widget").is(":visible");

                        })

                        .on("click", function() {

                            input.trigger("focus");



                            // Close if already visible

                            if (wasOpen) {

                                return;

                            }



                            // Pass empty string as value to search for, displaying all results

                            input.autocomplete("search", "");

                        });

                },



                _source: function(request, response) {

                    var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");

                    response(this.element.children("option").map(function() {

                        var text = $(this).text();

                        if (this.value && (!request.term || matcher.test(text)))

                            return {

                                label: text,

                                value: text,

                                option: this

                            };

                    }));

                },



                _removeIfInvalid: function(event, ui) {



                    // Selected an item, nothing to do

                    if (ui.item) {

                        return;

                    }
                    console.log(this.url)


                    // Search for a match (case-insensitive)

                    var value = this.input.val(),

                        valueLowerCase = value.toLowerCase(),

                        valid = false;

                    this.element.children("option").each(function() {

                        if ($(this).text().toLowerCase() === valueLowerCase) {

                            this.selected = valid = true;

                            return false;

                        }

                    });



                    // Found a match, nothing to do

                    if (valid) {

                        return;

                    }

                    if (this.url) {
                        alert("$.ajax(this.url)");
                    }

                    // Remove invalid value

                    this.input

                        .val("")

                        .attr("title", value + " didn't match any item")

                        .tooltip("open");

                    this.element.val("");

                    this._delay(function() {

                        this.input.tooltip("close").attr("title", "");

                    }, 2500);

                    this.input.autocomplete("instance").term = "";

                },



                _destroy: function() {

                    this.wrapper.remove();

                    this.element.show();

                }

            });



            $(".combobox").combobox();



        });
  </script>
</head>
<body>
  <div class="ui-widget">
    <label>Your preferred programming language:</label> <select class="combobox test" data-url=
    "http">
      <option value="">
        Select one...
      </option>
      <option value="ActionScript">
        ActionScript
      </option>
      <option value="AppleScript">
        AppleScript
      </option>
      <option value="Asp">
        Asp
      </option>
      <option value="BASIC">
        BASIC
      </option>
      <option value="C">
        C
      </option>
      <option value="C++">
        C++
      </option>
      <option value="Clojure">
        Clojure
      </option>
      <option value="COBOL">
        COBOL
      </option>
      <option value="ColdFusion">
        ColdFusion
      </option>
      <option value="Erlang">
        Erlang
      </option>
      <option value="Fortran">
        Fortran
      </option>
      <option value="Groovy">
        Groovy
      </option>
      <option value="Haskell">
        Haskell
      </option>
      <option value="Java">
        Java
      </option>
      <option value="JavaScript">
        JavaScript
      </option>
      <option value="Lisp">
        Lisp
      </option>
      <option value="Perl">
        Perl
      </option>
      <option value="PHP">
        PHP
      </option>
      <option value="Python">
        Python
      </option>
      <option value="Ruby">
        Ruby
      </option>
      <option value="Scala">
        Scala
      </option>
      <option value="Scheme">
        Scheme
      </option>
    </select>
  </div>
  <div class="ui-widget">
    <label>Your preferred programming language:</label> <select class="combobox">
      <option value="">
        Select one...
      </option>
      <option value="ActionScript">
        ActionScript
      </option>
      <option value="AppleScript">
        AppleScript
      </option>
      <option value="Asp">
        Asp
      </option>
      <option value="BASIC">
        BASIC
      </option>
      <option value="C">
        C
      </option>
      <option value="C++">
        C++
      </option>
      <option value="Clojure">
        Clojure
      </option>
      <option value="COBOL">
        COBOL
      </option>
      <option value="ColdFusion">
        ColdFusion
      </option>
      <option value="Erlang">
        Erlang
      </option>
      <option value="Fortran">
        Fortran
      </option>
      <option value="Groovy">
        Groovy
      </option>
      <option value="Haskell">
        Haskell
      </option>
      <option value="Java">
        Java
      </option>
      <option value="JavaScript">
        JavaScript
      </option>
      <option value="Lisp">
        Lisp
      </option>
      <option value="Perl">
        Perl
      </option>
      <option value="PHP">
        PHP
      </option>
      <option value="Python">
        Python
      </option>
      <option value="Ruby">
        Ruby
      </option>
      <option value="Scala">
        Scala
      </option>
      <option value="Scheme">
        Scheme
      </option>
    </select>
  </div>
</body>
</html>

Последний раз редактировалось рони, 10.07.2019 в 12:20.
Ответить с цитированием
  #13 (permalink)  
Старый 10.07.2019, 18:53
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

Спасибо. Принцип понятен. Только мне ещё несколько параметров нужно передавать. Я так понимаю, это делается таким же Макаром? data-param1= и т.д. А внутри обращаться: this.param1
Ответить с цитированием
  #14 (permalink)  
Старый 10.07.2019, 19:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Misha_White
data-param1= и т.д.
можно без и т.д., достаточно одной таблетки, кавычки важно.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var obj = $("#box").data("param");
    alert(obj.b);
});
  </script>
</head>

<body>
<div id="box" data-param = '{"a" : 10, "b" : "test"}'></div>

</body>
</html>
Ответить с цитированием
  #15 (permalink)  
Старый 11.07.2019, 03:06
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

Понял, словарь сразу передать можно. Круто. Я об этом что-то не подумал.
Спасибо. Сегодня попробую.
Ответить с цитированием
  #16 (permalink)  
Старый 11.07.2019, 09:31
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

Эх, у меня строкой передаются параметры... Возможно JSON получится использовать.
Ответить с цитированием
  #17 (permalink)  
Старый 11.07.2019, 09:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Misha_White
Эх, у меня строкой передаются параметры
в чём проблема?
Ответить с цитированием
  #18 (permalink)  
Старый 11.07.2019, 11:30
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

проблема из строки получить словарь.
<!DOCTYPE html>
 
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
 
  <script>
$(function() {
    var obj = $("#box").data("param");
    alert(obj.b);
});
  </script>
</head>
 
<body>
<div id="box" data-param = "{'a' : 10, 'b' : 'test'}"></div>
 
</body>
</html>

Последний раз редактировалось Misha_White, 11.07.2019 в 11:37.
Ответить с цитированием
  #19 (permalink)  
Старый 11.07.2019, 11:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Misha_White,
кавычки в data-param поменяйте и run добавьте
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #20 (permalink)  
Старый 11.07.2019, 11:36
Интересующийся
Отправить личное сообщение для Misha_White Посмотреть профиль Найти все сообщения от Misha_White
 
Регистрация: 17.02.2010
Сообщений: 16

я бы с радостью кавычки поменял, но это поведение Django, при передаче атрибутов в виджет... передаёт их строкой.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сайт приема заказов на создание виджетов и сайтов ) maximkr1 Ваши сайты и скрипты 0 09.04.2019 02:29
Конструкторы сайтов и виджетов для них wertklop Общие вопросы Javascript 11 10.08.2016 15:15
Фабрика виджетов jQuery UI FanAizu jQuery 4 22.01.2014 17:14
Создание виджетов. Выбор решения. m00 Общие вопросы Javascript 1 15.04.2010 04:27
Jquery IE6 autocomplite hp5741 Internet Explorer 8 31.08.2009 17:55