You should build a simple reproducible demo and post it to: http://dev.jquery.com/
Which is where jQuery bugs should be sent. --John On Nov 26, 2007 7:29 AM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > > Hi all. > > I've built an "auto search" plugin (or live search to give it another > name) using jQuery 1.2.1 which does an ajax call as letters are typed > into an input box. > > It works flawlessly in firefox, opera and safari, but in IE7 and IE6 > jQuery fails at line 906: > > if ( value != undefined ) elem[name] = value; > > the value of um, value is "NaNpx" > > I've done some digging around the web and a have found mention of this > problem ( here: http://dev.jquery.com/ticket/1861 ), but without any > fixes. As far as I can work it it stems from IE returning some border > measurements as non-integers ("medium" for example"). I am explicitly > setting my borders to pixel values so I'm not sure if this is relevant > to my problem. > > Here's my code: > > HTML: > > <html> > <head> > <title>Autosearch demo</title> > <script src='js/jquery-1.2.1.js'></script> > <script src='js/f8.jquery.autosearch.js'></script> > <link rel='stylesheet' type='text/css' href='css/ > f8.jquery.autosearch.css'> > > <script> > $(document).ready(function () { > > $("#search").autosearch("rpc.php"); > > }); > </script> > > <style> > * { > margin: 0; > padding: 0; > border: 0; > } > html { > font-family: verdana, sans-serif; > } > body { > margin: 1em; > } > > fieldset { > padding: .25em; > } > </style> > </head> > <body> > <h1>Autosearch demo</h1> > <form> > <fieldset> > <legend>search</legend> > <div><label for='search'>search for</label> <input > id='search' > name='search1' type='text' /></div> > </fieldset> > </form> > </body> > </html> > > > f8.jquery.autosearch.js: > > /** > * autosearch > * uses ajax to peform as you type search queries > * @usage: $("#input_box").autosearch(url); > */ > jQuery.fn.autosearch = function(url) { > > var timeout = undefined; // used to ensure queries are sent only when > typing has stopped > > var delay = 500; // delay (in ms) after the last keystroke to wait > before we do the ajax call > > var last_search = undefined; // stores last search query to cut down > on roundtrips > > var $input = $(this); // input element > > // append the hidden search results container to the dom after the > input element > var $result = $("<ul class='autosearch_result'></ > ul>").hide().css("position", "absolute").insertAfter($input); > > // switch off the browser auto complete for the input box > $input.attr("autocomplete", "off").addClass("autosearch_input"); > > $input.blur(function () { > > setTimeout(function() { > $result.hide()}, 200 > ); > > }); > > // bind the ajax call to the input box key up event > $input.keyup(function() { > > if(timeout != undefined) { > clearTimeout(timeout); > } > > if (last_search != $input.val()) { > > // new search is different to the last search > > timeout = setTimeout(function() { > > timeout = undefined; > ajax_search(); > last_search = $input.val(); // remember this > search so we don't do > it again next time > > }, delay); > > } > > }); > > function ajax_search() { > > $result.hide().empty(); > > if ($input.val() != "") { > > // only search if we have something to search for > > $input.addClass("autosearch_loading"); // adds the > ajax anim to the > input box > > // perform the ajax call > $.ajax({ > > url: url + "?q="+$input.val(), > > success: function(data) { > > if ($.trim(data) == "") { > > $result.hide(); > > } > else { > > // append the results to the > results container > $result.append(data); > > // re-position the results > container in case the dom has changed > > var pos = > findPos(document.getElementById($input.attr("id"))); > > $result.css({ > top: (pos.y + > $input.offsetHeight) + "px", > left: pos.x + "px" > }).show(); > > } > > }, > complete: function () { > // hide the ajax anim > > $input.removeClass("autosearch_loading"); > } > > }); > > } > > } > > /** > * works out the screen position of an element > */ > function findPos(obj) { > > var curleft = obj.offsetLeft || 0; > var curtop = obj.offsetTop || 0; > > // work our way back up the dom till we have no more parents > while (obj = obj.offsetParent) { > > curleft += obj.offsetLeft > curtop += obj.offsetTop > > } > > return { > x:curleft, > y:curtop > }; > > } > > } > > f8.jquery.autosearch.css: > > .autosearch_input { > border: 1px solid #CCC; > padding: 1px 18px 1px 1px; > } > .autosearch_result { > width: 20em; > border: 1px solid #CCC; > background: #FFF; > list-style: none; > font-size: .8em; > } > .autosearch_result li { > border-bottom: 1px solid #CCC; > padding: 2px; > } > .autosearch_result h2 { > font-size: 1em; > } > .autosearch_result p { > margin-left: 1em; > font-style: italic; > } > .autosearch_loading { > background: url(../img/indicator.gif) no-repeat top right; > } > > > I had a dig around in the jQuery source (great work by the way guys!) > and tried the following fix: > > if ( value != undefined && value != "NaNpx") > elem[name] = value; > > Which stops the error, but my popup window is now appearing over the > top of the input box. > > I've tried the latest nightly build and still get the same error. > > Any help resolving this would be greatly appreciated. > > Thanks in advance, > Richard. >