-
Notifications
You must be signed in to change notification settings - Fork 5.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
The zoom property of css changed by brower/W3C and JqueryUI component is affected #2292
Comments
I moved the issue to the jQuery UI repo as that's where jQuery UI issues should be reported. Thanks for the report. Does the issue you describe exist when jQuery UI 1.12.1 is used or only with jQuery UI 1.13.0 or newer? |
OK, I checked myself in the template, it's reproducible in jQuery UI 1.12.1 as well. Since the issue is already in 1.12, given limited team resources it's not likely to be fixed by the UI team; see the project status at https://blog.jqueryui.com/2021/10/jquery-maintainers-update-and-transition-jquery-ui-as-part-of-overall-modernization-efforts/. PRs are welcome if they're not too complex and contain tests. |
Thank you very much for your response! However, this issue isn't confined to the datetimepicker; other jQuery UI controls like autocomplete also exhibit similar problems. Additionally, other UI frameworks built on jQuery, such as jQuery Bootstrap Datetimepicker JA, face the same issue. The root cause appears to be the use of jQuery's offset() method. The coordinates returned by this method now include zoom attributes in the latest browsers, which wasn't previously the case. Therefore, I believe the problem doesn't lie with the UI framework itself but with the jQuery offset() method. I suggest we move away from using getBoundingClientRect() for HTML controls and instead use the offsetTop attribute. We have temporarily corrected this in our web application. I welcome further discussion on this approach. |
@wesoft2020 can you prepare an isolated test case that just uses jQuery, without jQuery UI or other libraries? Then it will be clearer what the issue with jQuery is and we’ll be able to open a new jQuery issue about it. |
When i zoom the browser with ctrl-scroll it works fine. But the javascript zoom does something strange. I created this fiddle: https://jsfiddle.net/geovd7L6/ |
@mgol I created a page that displays the offset length using jQuery and the browser. The browser has updated its API for the W3C zoom property, while jQuery continues to use the same API as before, I think. Install old chrome version: @markvantilburg Thanks for the discussion! This issue is only affected by the Computed Style APIs, so the browser's zoom works fine. |
@jacekzwroclawia var isNewRectAPI = false; // for old browser versions // Set isNewRectAPI based on a specific value, not according to multiple browser versions. |
I submitted a jQuery issue based on the discussion above: jquery/jquery#5561. |
you can fix the code in jquery.min.js / jquery.js offset: function (t)
} |
Based on the comments of @wesoft2020 and @DanielP1976 I created a workaround for this error. (Because I needed a short-term solution for my project) Maybe it will also help others until the adjustment is officially available. //Workaround JQuery Issue 2292
//https://github.com/jquery/jquery-ui/issues/2292
$.fn.offset = (function (_super) {
return function () {
// Call base function
var originalResult = _super.apply(this, arguments);
//Define default value
var zoom = 1;
try {
//Use `currentCSSZoom` of HTML element
//https://caniuse.com/?search=currentCSSZoom
//https://developer.mozilla.org/de/docs/Web/API/Element/currentCSSZoom
if (this && this[0] && this[0].currentCSSZoom) {
zoom = this[0].currentCSSZoom;
}
} catch {
//Fallback for unexpected errors
zoom = 1;
}
//Modify result
originalResult.top = originalResult.top / zoom;
originalResult.left = originalResult.left / zoom;
//Return result
return originalResult;
};
})($.fn.offset); |
Is there a plan to merge this? I've been noting this warning as well. |
It is only a workaround (redefinition) which cannot be merged as it does not modify the original JQuery source. The code can be simply added as a separate JavaScript file after the include of JQuery. |
Description
Steps to reproduce the problem
testJquery.zip
1.write the code like "document.body.style.zoom=1.2" in javascript.
2.create a date component of jqueryUI like $( "#datepicker" ).datepicker({});
3.open the html and focus in the date component, the popup is Misplaced
Cause estimation
https://drafts.csswg.org/css-viewport/#zoom-om
The W3C standard for the Zoom attribute has been changed so that the getBoundingClientRect, getClientRects, and IntersectionObserver APIs return rects with scaled lengths by browser, which returned rects with unscaled lengths before.
So the offset() method developed on getBoundingClientRect also changed, return rects with scaled lengths now.
Please let us know will jquery or jqueryUI Do some correspondence.
We did this temporarily.
var originalOffset = $.fn.offset;
$.fn.offset = function() {
var originalResult = originalOffset.apply(this, arguments);
originalResult.top = originalResult.top / document.body.style.zoom;
originalResult.left = originalResult.left / document.body.style.zoom;
return originalResult;
}
The text was updated successfully, but these errors were encountered: