-
Notifications
You must be signed in to change notification settings - Fork 511
disable_with doesn't work with link in Safari #306
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
Comments
testpage: https://gist.github.com/pekeler/4746738 (rendered without layout) |
I cannot reproduce this to save my life. I've tried on my own machine using Safari Version 6.0.2 (7536.26.17), and it works as expected. |
My version of Safari seems to be different: Version 6.0.2 (8536.26.17) |
My wife's laptop has the same Safari version as yours on OSX 10.7.5. I can't reproduce it there, either. So it looks like a Safari on Mountain Lion specific problem. |
That's really weird. I'll have to see if I can get anyone else in the office who can reproduce it. |
@pekeler if you can push this code to heroku and post a link here then that would make it easier to get more people to validate the result. Thanks. |
I've created a minimal testcase on http://jsbin.com/aveseh/1/ |
With safari version Version 6.0.2 (8536.26.17) it behaves fine for me . On Tue, Feb 19, 2013 at 12:41 PM, Christian Pekeler <
|
I just walked over to another computer with Mountain Lion, Safari 6.0.2. Exact same problem. |
FWIW we noticed an issue with disableFormElements: function(form) {
alert('hams')
form.find(rails.disableSelector).each(function() { and then click through the alert dialog, the button changes disabled text. Also, if we cancel the next page load before the screen changes, the button changes to the disable text. So this seems like a pretty classic example of javascript timing insanity. Frankly, the prospect of descending into the caves of madness to debug this is too much for us right now, and we iceboxed the issue. Hopefully this helps point someone in the right direction. |
Have just stumbled upon this exact issue. :( |
Same problem here, the text doesn't get changed by text in 'disable-with' on safari, worked fine on chrome. I am using safari "Version 6.1 (8537.43.58)" |
Can reproduce on Safari 6.0.5 (8536.30.1), OSX 10.8.4. |
Yup, still broken in Safari 6.0.5 (8536.30.1) still working in Firefox 23.0.1 |
Add Safari Version 7.0 (9537.71) (Mavericks GM) to the list of not working either. |
@pekeler your test case on jsbin isn't working for me as pulling the Are anyone else still facing this issue with a recent version of the |
I'm guessing this is still an issue, as we've never done anything to solve it. If someone could submit a patch, that'd be great. I'd be happy with a patch that solved the issue even without a test case (provided it doesn't break any existing tests). |
+1 to this not working with Safari 7.0 (9537.71). |
+1 doesn't work with safari. checked with 7.0 |
Hi, short question... |
In my test cases, the disabling functionality was totally borked. No state change, no text change. |
Actually Safari is not allowing to manipulate the form element (submit tag) after form submit. Tried first change the text and then submit but then the commit can not be accessed. |
Does it only break with a form submit field or also with a normal link? |
I haven't checked it for link but its breaking for submit field. |
Any progress on this issue, guys? It's a big one. |
I still can't reproduce this with Safari 7.0.1 (9537.73.11). Would be awesome to have a reproducible test case or example somewhere to try to get to the bottom or this. |
@pekeler A so it's a different one than the original post? Is there a post on this already I can check? |
Is someone working on this? Having the same issue and cannot find a working solution for it... |
The problem still exists in Safari 7. using
does not work in Safari either. Please let me know how I could fix this. |
disable_with works on Safari 8.0.2 for me |
@geetfun not for me Safari 8.0.2 broken |
If you press I tried removing |
Also having this issue. OS X 10.10.2 Anyone got a decent workaround? |
I have the same issue. data-disable-with works find in Chrome, but not in Safari. OS X 10.10.2 (14C109) It's really frustrating, since I prefer to develop locally using Safari. |
any idea how to fix this in Safari. |
This is simply a display problem in Safari. If you try clicking the submit button twice it doesn't submit twice. To verify this, inspect the element and then click the submit button, you'll see the HTML change (value is replaced and disabled attribute is added). Safari doesn't update the displayed page after the form submit is fired (even though the DOM changed). If we wanted to fix this visual bug we'd need to intercept the submit event, update the DOM, then submit the form ourself (carefully though as we don't want to double submit). See http://stackoverflow.com/a/28404683/282720 I think the main desire of this feature is to prevent double form submission and that is working correctly. Perhaps this should be closed in favor of a radar bug submitted to Apple. Edit: Just noticed this is regarding |
Using Safari 8.0.4 (10600.4.10.7) still doesn't work (in some cases). I tried the test pages from this thread and also created one myself, disable works in all those cases but still doesn't on my real form. I removed all other javascript from my app and just left jquery and ujs files, but no luck. Then I went and debugged a little bit and if I remove the timeout from this line it works perfectly. It seems like a UI blocking issue to me, once the timeout has returned the form is already submitting and safari doesn't care anymore to update it. But if we update it just before it submits, it does it correctly. Not sure what the timeout is for though? Comments say it's for the button to be serialized, but why do we need the button serialized? (Some may need it of course, but most forms don't). Would it be possible to add a setting for letting the timeout or remove it? |
I have a similar issue on Safari with a |
By the way - and that's even worse usability-wise - when you hit the back button the overlay is there... IMHO this issue should be closed since it doesn't seem to be jquery-ujs specific |
I had a similar issue on Safari 8.0.6 and here's my approach of solving this issue: %button{ class: 'btn btn-action js-submit', data: { method: :put, 'href' => '...', disable_with: "<i class='icon icon-spinner icon-spin'></i>".html_safe }} Submit $('.js-select-plan').click(function(event) {
event.preventDefault();
var $target = $(this),
href = $target.data('href'),
method = $target.data('method'),
formTarget = $target.attr('target'),
csrfToken = $('meta[name=csrf-token]').attr('content'),
csrfParam = $('meta[name=csrf-param]').attr('content'),
form = $('<form method="post" action="' + href + '"></form>'),
metaData = '<input name="_method" value="' + method + '" type="hidden" />';
if (csrfParam !== undefined && csrfToken !== undefined) {
metaData += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
}
if (formTarget) {
form.attr('target', formTarget);
}
// disable button/link element
var contentMethod = $target.is('button') ? 'html' : 'val';
var replacement = $target.data('disable-with');
$target.data('ujs:enable-with', $target[contentMethod]());
if (replacement !== undefined) {
$target[contentMethod](replacement);
}
$target.prop('disabled', true);
form.hide().append(metaData).appendTo('body');
setTimeout(function(){
form.submit();
}, 50);
}); This works like a charm in all browsers. For better flexibility you might want to wrap this in a helper. |
Still doesn't work in Safari 9.0 (El Capitan). Firefox + Chrome are OK. |
Yes. It isn't working with safari in ipad or iphone. :( |
Try this, it seems to be working here: https://gist.github.com/walterdavis/b6410bef6333d3487687#file-rails-js-L262 |
+1 does not work in Safari 8.0.8 |
We can hide the button and display same as link with disable with text in button style..just an idea |
This looks like a Safari bug/feature. The only way to make it work is to delay the form submission (Like prevent the first form submit and trigger a new one later on). This will give the render engine a little bit of time to catch up and display the disabled-text. For example, in Lines 493 to 494 in 1d8a0ad
if (!e.isTrigger) {
e.preventDefault();
rails.disableFormElements(form);
setTimeout(function(){ form.trigger('submit'); }, 13);
} I'm not 100% positive if jquery-ujs should handle this. I right now have it as a workaround that I load after jquery-ujs https://gist.github.com/orlando/bacff31757b80b86e062 |
Thanks @orlando! It worked but only for click on the button. If I press enter, it's not work! |
+1 Does not work in Safari 10 (tested with |
+1 only works for forms with Note: it appears to prevent double submission of the form, but does not replace the text |
@jpowell this is not a jquery-ujs bug since this works for the rest of the browsers, is how Safari handles forms submissions which is totally different than the rest. In my case I needed to support Safari so I added a workaround but is not like a final fix (since Safari doesn't even flush pending paints after the submit button is pressed and that's why you see the magic number 13 there). |
@orlando thanks for the response. I've done similar things before in the past, but was shooting in the dark to see if a wider solution had been come to without monkey patching something together myself. Thanks again. |
Here's a quick hack that leverages document.addEventListener(
'click',
event => {
let element = event.target;
if (element.dataset.disableWith) {
element.disabled = true;
element.innerHTML = element.dataset.disableWith;
let $form = $(element).closest('form');
if ($form.length) {
event.preventDefault();
setTimeout(() => $form.submit(), 300);
}
}
},
true
); |
Thanks for that @hopsoft, working like a charm! |
Hey @hopsoft when using your solution (which works), then jQuery callbacks don't work. For example
When I click Do you know how to fix that? |
@bengalamx You could try something like this. document.addEventListener(
'click',
event => {
let element = event.target;
if (element.dataset.disableWithSafari) return;
if (element.dataset.disableWith) {
element.disabled = true;
element.innerHTML = element.dataset.disableWith;
let $form = $(element).closest('form');
if ($form.length) {
event.preventDefault();
setTimeout(() => $form.submit(), 300);
element.dataset.disableWithSafari = true;
element.click();
}
}
},
true
); Disclaimer: It's a hack and I haven't tested it. |
link_to "do it", :data => {:disable_with => 'Please wait...'}
Please note that this is not a remote link.
It works as expected in latest Chrome and latest Firefox, IE8, IE9.
In Safari (6.0.2) however it never shows "Please wait..."
The text was updated successfully, but these errors were encountered: