1

我在尝试让 jQuery UI 组合框在 drupal 实例上工作时遇到了一些问题。drupl 安装是开箱即用的 Drupal 7,安装并启用了 jQuery 更新和 jQuery 插件模块,以及在我正在使用的节点上启用和设置了 php 过滤器。jQuery 更新设置为使用 jQuery 1.8 和 CDN 到 google。

jQuery UI 组合框:http: //jqueryui.com/autocomplete/#combobox

我遇到的问题是组合框没有下拉选择箭头,因此无法使用选择功能。同样,当我开始输入组合框时,会显示自动完成弹出窗口,但它不在组合框下方,而是出现在视口的左上角。此外,切换按钮没有任何功能。

Firebug 报告以下错误:

在页面加载时:

TypeError: q.push is not a function at https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js (line 2)

组合框的焦点:

uncaught exception: Cannot find tooltip for [object Object]

按键时:

TypeError: b.curCSS is not a function at https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js (line 13)

相关代码:

<?php
    drupal_add_library('jquery_plugin', 'tooltip');

    drupal_add_library('system', 'ui.widget');
    drupal_add_library('system', 'ui.mouse');
    drupal_add_library('system', 'ui.button');
    drupal_add_library('system', 'ui.position');
    drupal_add_library('system', 'ui.autocomplete');
?>

 <script>
    (function( $ ) {
        $.widget( "custom.combobox", {
            _create: function() {
                this.wrapper = $( "<span>" )
                    .addClass( "custom-combobox" )
                    .insertAfter( this.element );

                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({
                        tooltipClass: "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" )
                .mousedown(function() {
                    wasOpen = input.autocomplete( "widget" ).is( ":visible" );
                })
                .click(function() {
                    input.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;
                }

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

                // 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.data( "ui-autocomplete" ).term = "";
            },

            _destroy: function() {
                this.wrapper.remove();
                this.element.show();
            }
        });
    })( jQuery );

    (function( $ ) {
        $(document).ready(function() {
            $( "#combobox" ).combobox();
            $( "#toggle" ).click(function() {
                $( "#combobox" ).toggle();
            });
        });
    })(jQuery);
</script>

<div class="ui-widget">
<label>Your preferred programming language: </label>
<select id="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>
<button id="toggle">Show underlying select</button>
4

2 回答 2

0

我认为您有一些 jquery 版本问题...请检查线程 Jquery ui combobox (autocomplete)消失

可能会帮助你。

于 2013-06-14T18:26:06.793 回答
0

我的问题的解决方案是综合考虑。首先,在 jQuery Update 中使用 CDN 和本地副本是有区别的。本地文件被分成不同的部分,其中 CDN 包含所有 jQuery UI 扩展。所以其次,文件顶部的 drupal_add_library 语句重复并导致问题。

我的最终配置不包含 drupal_add_library 语句。jQuery 更新设置为 1.8,生产且没有 CDN。通过复制和粘贴内容将站点/所有/模块/jquery_update/replace/ui/ui/minified/jquery.ui.core.min.js 文件从 1.8.11 手动更新到 1.10.3(不是最佳解决方案)。

于 2013-06-17T16:39:34.167 回答