PC v MAC webdialog populate
-
Hmmm... I'll bet we also have differing behaviour in regard to the defaultChecked and defaultValue properties on the two platforms.
defaultChecked
http://msdn.microsoft.com/en-us/library/ms533715(v=VS.85).aspxdefaultValue
http://msdn.microsoft.com/en-us/library/ms533718(v=VS.85).aspx -
@tig said:
document.getElementById("myCheckBox").removeAttribute("checked"); >
On a PC the second alone works but the third alone fails [and is ignored].
Acording to:
http://msdn.microsoft.com/en-us/library/ms533556(v=VS.85).aspx
the above using "removeAttribute("checked")" is supposed to work on PC but in IE8 mode.You never said what PC browser ver that the tests were done on, and if you tried IE8 mode.
-
It has to be multi-browser and platform including IE7 etc ?
I think this latest fix works for everything so far... -
IE7(I haven't upgraded to IE8 yet.)
Results the same for both:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 STRICT//EN" "http://www.w3.org/TR/html4/strict.dtd">ID="myCheckBox"
Check the checkbox:
%(#408000)[WORKS]: myCheckBox.setAttribute('checked',**1**); %(#408000)[WORKS]: myCheckBox.setAttribute('checked',**'any string'**); %(#408000)[WORKS]: myCheckBox.setAttribute('checked',**true**); %(#408000)[WORKS]: myCheckBox.checked=**true**; %(#804000)[FAILS]: myCheckBox.defaultChecked=**true**;
Uncheck the checkbox:
%(#408000)[WORKS]: myCheckBox.setAttribute('checked',**0**); %(#408000)[WORKS]: myCheckBox.setAttribute('checked',**null**); %(#408000)[WORKS]: myCheckBox.setAttribute('checked',**false**); %(#408000)[WORKS]: myCheckBox.checked=**false**; %(#804000)[FAILS]: myCheckBox.defaultChecked=**false**; %(#804000)[FAILS]: myCheckBox.removeAttribute(**'checked'**);
-
This is as expected - the checking is easy just set the 'checked' attribute to something 'positive' for a PC [or 'anything at all' for say a MAC - which causes the MAC's 'unchecking' conundrum]...
So it's the 'unchecking' that is the pain...
ThemyCheckBox.setAttribute('checked',null);
will work on most platforms [like the PC] but themyCheckBox.('checked');
fails on the PC - however, but since that's after the '=null
' version has worked it's no matter...
The will work on some platforms after the precedingmyCheckBox.setAttribute('checked',null);
has just failed [e.g. a MAC where '=null
' actually checks the box ! then theremoveAttribute
successfully unchecks it].I haven't tried the exact
myCheckBox.checked=true;
/myCheckBox.checked=false
on a MAC test... but I suspect it'd fail asmyCheckBox.setAttribute('checked',false);
does fail...This is all too convoluted - but at least I seem to have a workaround that works on all tested platforms.
-
Have you tried the integers 0 | 1 on the Mac yet?
It's so weird.. checked is supposed to be a boolean.
I'd consider this a Webkit bug.
Does anyone know if there is a website specific to webkit? Forums, BugReports, etc? -
@dan rathbun said:
I'd consider this a Webkit bug.
Does anyone know if there is a website specific to webkit? Forums, BugReports, etc?To answer myself .. (to myself I says..)
WebKit
Open Source Web Browser Engine
WebKit (webkit.org)
[url=https://bugs.webkit.org/query.cgi?format=specific&product=WebKit:1174kw44]The Webkit Bugzilla[/url:1174kw44]
A search on "checkbox" gets 59 open hits. I did not see what had been closed.
-
I also noticed belatedly that the
disabled
attribute works fine on a PC when set astrue/'true'/'disabled'
and conversely is ignored when set tofalse/'false'
etc BUT on a MAC it must be set to 'disabled
' [or any other value includingfalse
!] and to ignore it you must useremoveAttribute('disabled')
rather like the fix for thecheckbox
attribute... BUT weirdly on a PC theremoveAttribute('disabled')
also works, when it didn't for thechecked
attribute -
To recap:
When using checkboxes and radio button toggles in your webdialog html code you can set an item's value attribute to 'true
' or 'false
' when they are clicked by using a callback e.g.
onclick="if(this.checked)(window.location='skp:itemx@true');else(window.location='skp:itemx@false')
and in the rubydef itemx(checked)
you sayif checked=="true" js=("document.getElementById(\"itemx\").setAttribute(\"value\",\"true\");") @dlg.execute_script(js) else js=("document.getElementById(\"itemx\").setAttribute(\"value\",\"false\");") @dlg.execute_script(js) end ### etc
then when you close the dialog/tool your
def deactivate()
gets all of the values for the items [usingvalues={} #loop through the list of items...# values[id]=@dlg.get_element_value(id)
- it's often better tohash
it for later use] and puts them into model [or SUp] asattributes
so they are used the next time you open the tool...
You can use the html'sonclick=
oronChange=
to save values from textboxes or the state of 'toggles' like this.
These toggles should beboolean
=true/false
BUT they behave oddly on different platforms/browsers
The problem arises when you want to auto-set checkboxes and radio buttons at launch, or when some other toggle is changed - e.g. some checkboxes are auto-checked if the parent one has been checked too etc.
Your html should start with all checkboxes unchecked - i.e NOcheckbox=
property at all in field.
Your code then adds something like
js=("document.getElementById(\"itemx\").setAttribute(\"checked\",\"checked\");") @dlg.execute_script(js)
if it's to be checked [this works on all platforms] BUT if it's to be unchecked then for a PC you should use
js=("document.getElementById(\"itemx\").setAttribute(\"checked\",null);") @dlg.execute_script(js)
unfortunately on a MAC this get read as true and it'll stay checked! So you need to add the extra line after this
[ruby:1pgs0rem]js=("document.getElementById("itemx").removeAttribute("checked");")
@dlg.execute_script(js)[/ruby:1pgs0rem] this will work on a MAC but fail on most PCs - this way you make it unchecked one way or another !!!
Similarly if you have fields that are disabledif certain toggles are met then you'd expect something similar - it's not quite the same [start with NO [ruby:1pgs0rem]disabled=[/ruby:1pgs0rem] property for any field]...
[ruby:1pgs0rem]js=("document.getElementById("itemx").setAttribute("disabled","disabled");")
@dlg.execute_script(js)[/ruby:1pgs0rem] if it's to be disabled [this works on ALL platforms] BUT if it's to be enabled then for a PC OR a MAC you should use
[ruby:1pgs0rem]js=("document.getElementById("itemx").removeAttribute("disabled");")
@dlg.execute_script(js)[/ruby:1pgs0rem] which works for both platforms this time
So to recap the recap - for toggled settings [ruby:1pgs0rem]checked/radio/disabled[/ruby:1pgs0rem] to become [ruby:1pgs0rem]inactive[/ruby:1pgs0rem] you should use
[ruby:1pgs0rem].setAttribute("checked",null)...[/ruby:1pgs0rem] then [ruby:1pgs0rem].removeAttribute("checked")[/ruby:1pgs0rem] for checkbox or radio
[ruby:1pgs0rem].removeAttribute("disabled")[/ruby:1pgs0rem] for any item - for cross-platform compatibility...
and to enable them [perversely 'disabled' needs to be 'enabled' !!] use
[ruby:1pgs0rem].setAttribute("checked","checked") or .setAttribute("disabled","disabled")[/ruby:1pgs0rem]
for all platforms - the values like "checked" or "disabled" ensure suitability on all platforms and for XHTML too.
-
Sounds like it's time for a revsion to the "Lost Manual"
@tig said:
To recap:
When using checkboxes and radio button toggles in your webdialog html code you can set an item's value attribute to 'true
' or 'false
' when they are clicked by using a callback e.g.onclick="if(this.checked)(window.location='skp:itemx@true');else(window.location='skp:itemx@false')"
why a callback?
I do this all in Js:
%(#8000BF)[onclick="if(this.checked){this.value='1'}else{this.value='0'};"]
or whatever values you want to set them to be (I like logic 0|1 myself.)I mean if your not going to poll all the control values until a user click's the OK or Close button, it seems to me that the callbacks are added work.
-
I appreciate that if the only thing you want to do is 'set' a value [or 'remove' it] you can do it directly in js, BUT I do the callback when it does lots of other things to do too, then the value setting is just part of it - the sample if/else code is a pared down version...
Also I've found that even using =1/=0 for true/false goes wrong in some setups, but "checked"/removing_the_attribute for true/false then works instead...
-
Yes - that is what I do as well - I use the JS onclick event to set the checkbox value to reflect the state of the checkbox.
And this is a great example for using frameworks - with jQuery I just make a
live
onclick event so all checkboxes created will behave like this. http://api.jquery.com/live/(untested - didn't have my reference code at hand)
$('input[type=checkbox]').live('click', function() { $( this ).val( $(this).is(':checked').toString() ); });
Not sure if that catches state change caused by keyboard though.
If you don't need continuous update of the checkbox values, but rather at a single event, this works as well:
// Set Checkbox values to reflect checked state so SU Ruby's $('input[type=checkbox]').val( function(index,value){ return $(this).is(':checked').toString() } );
-
The question is can you get it to have a checkbox that when it is
checked/unchecked
[true/false] controls 4 other checkboxes, so that they are all set to be unchecked and disabled if it is unchecked, and if it is checked then they all become enabled and the first one is also ticked by default. I got this working fine on a PC withtrue/false
etc but the MAC version refused to work when resetting from the SKP's attributes on a load etc - that is where I found thechecked=null PLUS a follow up remove_checked_attribute
andremove_disabled_attribute
worked across all platforms... -
A few Safari questions:
Does Safari automatically keep it's WebKit up to date?
Did you ask your testers what WebKit version their Safari was using?
Still wondering if this behaviour is a WebKit bug...
-
They are such a varied and clueless bunch they almost certainly won't know - I can't press it as they have helped above and beyond the call of duty already.
-
I'll have a look over the weekend. I have access to both PC and Mac.
-
Well, the next alternative is to post in the WebKit Bugzilla, and see if they fix it or tell you it's the way they want it to work.
-
@thomthom said:
I'll have a look over the weekend. I have access to both PC and Mac.
ThomThom do me a favour, please.
On the Mac.. check the console output of:
RUBY_VERSION
%(#BF0000)[RUBY_PATCHLEVEL
RUBY_RELEASE_DATE]
RUBY_DESCRIPTIONI wish to know what their output is for the "out-of-the-box" OSX Sketchup.
Also wonder if they changed between ver 6.x and 7.x SU ?? -
@dan rathbun said:
On the Mac.. check the console output of:
RUBY_VERSION
%(#BF0000)[RUBY_PATCHLEVEL
RUBY_RELEASE_DATE]
RUBY_DESCRIPTIONMac Mini Intel - OSX 10.5
` > PLATFORM
i686-darwin8.10.1RUBY_VERSION
1.8.5
RUBY_PATCHLEVEL
Error: #<NameError: (eval): uninitialized constant RUBY_PATCHLEVEL>
(eval)
RUBY_RELEASE_DATE
2006-08-25
RUBY_DESCRIPTION
Error: #<NameError: (eval): uninitialized constant RUBY_DESCRIPTION>
(eval)` -
TIG: I I tried with a simple sample file. This works on both Explorer and Webkit:
<html> <head> <title>Checkbox Test</title> <script type="text/javascript"> window.onload = init; function $(id) { return document.getElementById(id); } function init() { $('ch1').onclick = function() { $('ch2').checked = this.checked; $('ch3').checked = this.checked; $('ch4').checked = this.checked; $('ch2').disabled = !this.checked; $('ch3').disabled = !this.checked; $('ch4').disabled = !this.checked; }; } </script> </head> <body> <p> <label for="ch1">Checkbox 1</label> <input type="checkbox" id="ch1" /> </p> <fieldset> <p> <label for="ch2">Checkbox 2</label> <input type="checkbox" id="ch2" disabled="disabled" /> </p> <p> <label for="ch3">Checkbox 3</label> <input type="checkbox" id="ch3" disabled="disabled" /> </p> <p> <label for="ch4">Checkbox 4</label> <input type="checkbox" id="ch4" disabled="disabled" /> </p> </fieldset> </body> </html>
I tested on PC IE8 and OSX 10.5 SU7.1 Webkit
Advertisement