Side navigation
#14709 closed bug (notabug)
Opened January 20, 2014 05:53PM UTC
Closed January 23, 2014 04:11AM UTC
$(window).is(":visible") incorrectly returns false
Reported by: | frederic.hamidi@gmail.com | Owned by: | frederic.hamidi@gmail.com |
---|---|---|---|
Priority: | undecided | Milestone: | None |
Component: | unfiled | Version: | 1.10.2 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
From jQuery 1.10 onwards, the is()
method returns false
instead of the expected true
when applied to the window
object and the :visible
selector. This occurs on all the browsers I could test under (Internet Explorer, Firefox, Chrome).
Test case: http://jsfiddle.net/e4HzX/
Steps to reproduce: Print the value returned by $(window).is(":visible")
.
Expected behavior: is()
should return true
.
Observed behavior: is()
returns false
.
Reproduced on:
- 1.10.2
- 1.11.0pre (a3cd88f14bc99cbb80e6abe939576cbed093cb47)
- 2.0.2
- 2.1.0pre (38c122a73a843a0d117d4f962cc94fda6f553086)
Last known version with correct behavior:
- 1.9.1
Attachments (0)
Change History (5)
Changed January 20, 2014 08:22PM UTC by comment:1
owner: | → frederic.hamidi@gmail.com |
---|---|
status: | new → pending |
Changed January 20, 2014 08:53PM UTC by comment:2
status: | pending → new |
---|
I'm currently using the jquery.nicescroll plugin in our project. It can augment both the page itself and arbitrary containers, and maintains references to these elements -- or, in the page's case, to window
instead of say, the <body>
element. This leads to code in the plugin like:
self.jqbind(self.rail, "mouseenter", function() { if (!self.win.is(":visible")) return false; // Show scrollbar widget... });
Where self.win
is a jQuery object that can either contain a DOM element or window
. The visibility check fails for window
in jQuery 1.10+, so the plugin fails to show its scrollbar widget on mouseenter
for the main page only.
I can fix the plugin, and probably also special-case is()
for window
, but IMHO that would not beat the original (pre-1.10) behavior being restored. I suspect it might not be as easy as I think, though.
Changed January 20, 2014 09:20PM UTC by comment:3
I think the original behavior on window
has always been undefined, the docs say this:
:visible
Selects all elements that are visible in the document. ... Elements are considered visible if they consume space in the document.
Since window
is not an element and is also not "in the document" I don't think it fits the description of valid inputs. It's similar to saying $({visible:1}).is(":visible")
, we just don't guarantee what that will return. There are a lot of things you can do to elements that you can't do to a window.
I'd recommend changing the plugin logic. Is jquery.nicescroll abandoned? I've been trying to get some response to issues and even volunteered to help, but nothing seems to be going on with it. It's got a bunch of fragile browser sniffs that are causing problems in several environments including IE10/11 and Chrome >31. So jQuery's changed behavior on an invalid input is probably the least of our worries.
Changed January 20, 2014 09:40PM UTC by comment:4
You have a point, nothing was actually specified for window
in the first place. This probably is enough of an edge case that I can live with it.
Maybe the documentation for is()
could be updated to say its behavior is undefined for window
(and probably also document
)?
I'll try a pull request to the plugin once I get this fixed on my side, two months of inactivity are not that much after all.
Changed January 23, 2014 04:11AM UTC by comment:5
resolution: | → notabug |
---|---|
status: | new → closed |
Not sure this is a valid use of
.is()
, since awindow
is not a DOM element. What is your use case that leads you to call code like that?