Index: typo3/js/livesearch.js =================================================================== --- typo3/js/livesearch.js (revision 10167) +++ typo3/js/livesearch.js (working copy) @@ -41,13 +41,12 @@ listClass: 'live-search-list', listEmptyText: null, listWidth: 315, + listHovered: false, loadingText: null, minChars: 2, resizable: false, title: null, width: 205, - hasIframeListeners: false, - triggerClass : 'x-form-clear-trigger', triggerConfig: ' ', onTriggerClick: function() { @@ -144,9 +143,12 @@ initList : function () { TYPO3.BackendLiveSearch.superclass.initList.apply(this, arguments); - var cls = 'x-combo-list'; + // Track whether the hovering over the results list or not, to aid in detecting iframe clicks. + this.mon(this.list, 'mouseover', function() {this.listHovered = true;}, this); + this.mon(this.list, 'mouseout', function() {this.listHovered = false; }, this); + /** * Create bottom Toolbar to the result layer */ @@ -194,6 +196,10 @@ constrain:false }); + // Track whether the hovering over the help list or not, to aid in detecting iframe clicks. + this.mon(this.helpList, 'mouseover', function() {this.listHovered = true;}, this); + this.mon(this.helpList, 'mouseout', function() {this.listHovered = false; }, this); + var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth); this.helpList.setSize(lw); this.helpList.swallowEvent('mousewheel'); @@ -243,10 +249,6 @@ onFocus : function() { TYPO3.BackendLiveSearch.superclass.onFocus.apply(this, arguments); - if (!this.hasIframeListeners) { - this.addIframeListeners(); - } - // If search is blank, show the help on focus. Otherwise, show last results if (this.getValue() == '') { this.initHelp(); @@ -255,6 +257,15 @@ } }, + /** + * Fired when search results are clicked. We do not want the search result + * appear so we always set doFocus = false + */ + onViewClick : function(doFocus){ + doFocus = false; + TYPO3.BackendLiveSearch.superclass.onViewClick.apply(this, arguments); + }, + postBlur : function() { TYPO3.BackendLiveSearch.superclass.postBlur.apply(this, arguments); this.removeHelp(); @@ -270,30 +281,16 @@ TYPO3.BackendLiveSearch.superclass.reset.apply(this, arguments); }, - addIframeListeners : function () { - // Add an event handler to each iframe, closing the search window when there's a click inside the iframe - // @todo Is there a cleaner way to handle this? - var iframes = Ext.query('iframe'); - Ext.each(iframes, function(item, index, allItems) { - item.contentWindow.document.body.onclick = function() { - if (parent.TYPO3LiveSearch && parent.TYPO3LiveSearch.hasFocus) { - if (parent.TYPO3LiveSearch.isExpanded()) { - parent.TYPO3LiveSearch.collapse(); - } + handleBlur : function(e) { - if (parent.TYPO3LiveSearch.getRawValue() == '') { - parent.TYPO3LiveSearch.originalValue = parent.TYPO3LiveSearch.emptyText; - parent.TYPO3LiveSearch.reset(this); - } + if (!this.listHovered) { + this.hasFocus = false; + if (this.getValue() == '') { + this.reset(); + } + this.postBlur(); + } - if (parent.TYPO3LiveSearch.helpList.isVisible()) { - parent.TYPO3LiveSearch.helpList.remove(); - } - } - }; - this.hasIframeListeners = true; - }, this); - } }); @@ -310,4 +307,7 @@ }); TYPO3LiveSearch.applyToMarkup(Ext.get('live-search-box')); + + // Add a blur event listener outside the ExtJS widget to handle clicks in iframes also. + Ext.get('live-search-box').on('blur', TYPO3LiveSearch.handleBlur, TYPO3LiveSearch); });