Removing a JavaScript comment through commands? - comments

I am currently developing a website that relies heavily on large blocks of javascript for widgets. Some of these are demanding processes, such as running timers or clocks, so I only want these scripts to activate when their corresponding widget is activated. My proposed solution is to comment out each of these blocks of scripts, and "uncomment" them when the widget is active.
For example, if I have a countdown timer widget, I would like to have my code for the widget completely commented out until the user clicks the widget. When the user opens the widget, I would like the corresponding scripts to become "uncommented" and execute.
Is there any way I can programmatically add or remove comment marks to the Javascript code on the fly? I am looking for some method or command I could use; not something that requires me to physically alter the code.
I saw this in a Google I/O Conference Presentation, so I was just wondering if anyone knew how.

There is a better way to go about it. If you're worried about clogging the event loop: make sure widgets don't have access to the event loop but have to go through your framework to get to it. This allows you to 'sleep' a widget, stop all it's events.
Another thing to keep in mind that is that when widgets are removed you must also clean up any events they have scheduled or you will run into 'dead' code. All events must therefor be scheduled through your framework so you can clean them up if the widget is unloaded.
Code is read and loaded into the JavaScript engine, modifying the code after that point will do nothing.

Related

Is there a way to launch userscripts directly from browser (Firefox)?

I would like to run some userscripts to backup data.
The same scripts could be used on a variety of websites.
Scripts are basically the same, only some configuration changes from one script to another (what to scrape on the page, and where to save it).
Scripts will not alter the page in any way, just read it then call some REST API with the data
I do not want these scripts to be loaded on every web page, as they won't alter them, and depending on the page there is only one I'd like to run anyway.
So is there a way to launch these scripts directly from the browser (Firefox) ? From a bookmark or something ? Basically I want to click a button and have the script run like if I was running it from the js console.
Best I found for now is the "#run-at context-menu" directive of Tampermonkey. My script appears in a TamperMonkey context menu and is run on click.
However this menu is loaded on every page (#run-at context-menu ignores the #include directive and is applied everywhere), I'm not sure of the performance consequences, and it might be inconvenient if I end up with lots of scripts.
I guess I could also modify my scripts to be run on specific pages so that they add a floating button or something. But I'd rather not modify the pages, and it would be inconvenient on pages where I'd like to have several possible scripts.
I remember using a Greasemonkey script that added options on the context menu a long while ago. Would that be possible with Tampermonkey, implementing an equivalent of the #run-at context-menu myself that would only work on some pages ?
A more native way would be best, but I'm open to options.
Basically I want to click a button and have the script run like if I was running it from the js console.
From above, I assume the userscript does not use any GM API or use #require since those are not available in JS console.
If that is the case, FireMonkey has a feature to inject script (or CSS) from the toolbar popup.
After saving a script and disabling it (so it doesn't run automatically) or enabling on sites that the script MUST run, users can select the script in the toolbar icon popup and click the button to inject the script in the active tab.
For temporary scripts, FireMonkey also has a Scratchpad that you can paste JS (or CSS) into and run on any webpage by clicking the button. FireMonkey remembers the last pasted data so that it can be reused.
Note: Except TM that alters the CSP of websites, other managers are bound by the webpage CSP.
Turns out there's a function for that: https://wiki.greasespot.net/GM.registerMenuCommand
Your script just needs to declare a function, call GM.registerMenuCommand("label", your_function), and it becomes available on click in the GM/TM menu.
Contrary to the other answer this means you can use #require.
Contrary to the #run-at context-menu this means you can use #match to only apply it to the intended websites
Notes:
GM_registerMenuCommand in TamperMonkey
Needs the #grant to use the function

My events are not being counted within Google Analytics

I will try to exemplify my problem in the best possible way.
I am not responsible for adding code to the site. Most of the events were added via code, not by GTM. The problem is that they do not fire and do not count within GA.
My doubts are:
1 - Why do events not appear in GA?
2 - Even if the events were implemented directly in the code, is it possible to see it in the GTM debug?
3 - How can I check if these events really exist inside the code?
Have you added the correct tracking ID as a Tag in Tag Manager?
Not sure here
Press F12 when you are on the page, where the code is supposed to be. You will open the Inspect tool. You will see a lot of code there, try pressing Ctrl+F and searching for your code.

! Simulating a button click - dealing with objects/classes/events

I have a python module abc.py which has numerous class and some class inherting from another classes. The entire file has classes that are connected to each other with objects/instantiation.
The function calls are all based off of GUI button clicks. So, functions get called in abc.py, when buttons are clicked.
I need to write a script which does exactly the same function of button clicking, but without me clicking on the actual GUI - you can imagine it automated.
The issue is, the button on the GUI, when clicked, an event is triggered and the button is associated with a function call "def button_press" which takes (self, event) as parameters.
How would I pass it self and event? I want to use the classes/functions in the module "abc.py" as is and also simulate the button click.. Could you give me some pointers on how I could do this?
Thanks
You can either:
Create an appropriate event, fill it with your test data and call self.button_press(your_test_event), from within your gui.
As above but from outside your gui call, app.topframe..button_press(your_test_event),
If your event handler does not use any data from the event then if you def button_press(self, evt=None) you can do a or b without creating an event first,
you can use any one of the excellent python GUI Test tools available - some are listed here.
You'll probably want to look at wx.PostEvent to send events to a button. Or if you're using wxPython 2.9.2 or better, then you can use the new UIActionSimulator, which you can read about here:
http://wxpython.org/Phoenix/docs/html/UIActionSimulator.html
I've heard a number of people who use sikuli for GUI testing. There's also COBRA, which I keep seeing listed on the Tested in Python user's group as a tool for GUI testing, although I'm not entirely sure if you can use it on a wxPython app.

GWT and MVC type calls

I have a GWT app that when launched it takes you to a page with just a menu. So as a shortcut type thing I would like the users to be able to go straight to the page they want. So if the default start page is x, the should be able to say x/add and it will take them to the add page. How would I get that in gwt? Do I need a bunch of different entry points?
To accomplish this, you should use the URL's "fragment", which is the part after the #. For example, if your app is at /x, you could have a different UI displayed when someone navigates to /x#add
If you don't want to write this logic yourself, you should look into the gwt-presenter project, which was written to make MVP apps easier, but also includes an EventBus (to publish events to all corners of your app), and a PlaceManager to facilitate events being fired when the fragment changes (and to change the fragment at will).
Seems like a discussion we already had so I'll just link to the related question. Please see the answers and comments there. Basically, it might be advantageous to just interact with the History class directly, instead of introducing MVP to your project, but YMMV (I'm a huge fan of MVP myself, but it's not for everyone. Besides, I like to know the stuff "under the hood" ;))

Static UI vs Dynamic UI [closed]

Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 4 years ago.
Improve this question
In some application with UI, what is better (easy, friendly, etc.) to a user:
UI is static (don't depends on user state). E.g user see some button, but it's grayed out or when it's clicked, a message, that this action is not applicable right now, is shown.
or
UI is dynamic (depend on user state). E.g. user don't see buttons, that are not applicable right now. But after some action, buttons may appear/disappear.
Sorry for my French:)
In my opinion, a static GUI with disabled controls is preferable.
When some options are not visible, the user will not know they exist.
Both of those styles have their uses. Remember that you should always use the right tool for the job and that there are (almost) no absolutes in creating software.
A static UI with grayed out elements is preferable in most cases. By providing a simple non-obtrusive message (don't show a modal message box for instance) when the user clicks or tries to interact with the grayed out elements, you can train your users.
What really happens in most cases is that there is a grayed out menu and your users are left wondering what they need to fix to be able to click on that element. This is bad UI design.
A dynamic UI is also relevant if you have an extensive administration section that the logged in user should NEVER be able to use. By hiding the administration section, you avoid confusion and interface "overload" for users who will NEVER interact with the hidden interface elements.
A dynamic UI is required in applications like Adobe Photoshop. There are literally thousands of commands and menu items possible in Adobe Photoshop. The only way that any user could comprehend the interface is by hiding and showing user interface elements depending on the state of the application.
I always recommended a UI that is as unchanging as possible:
Don't surprise users
I don't think there is a right or wrong answer to this question, I think it is just a matter of opinion/preference.
Personally, I would expose all functionality to the user and just grey it out when it is not accessible. However, there are some situations where I would consider removing the buttons from view e.g.
Administrative options (probably don't want to expose this to users with lower priveledges)
RunOnce functionality (activating product/registering)
Reasons for this is there is no point in exposing functionality when the user is not meant to access them or if the functionality is just going to sit there greyed out forever...
Hope that helps.
If an action is not available
because the profile of the user
forbids its use do not show it at
all
If an action is not available only
because another action must first be
completed either :
Grey it out or
Leave it activated but on execution display a
message with a clear explanation of
why it cannot be executed
Make the action unavailable (by hiding, disabling, or using an error message) only if the action is logically impossible for the current state of the task, or to encode organizational rules on the actions certain users are permitted to do (e.g., privileges/permissions). Whenever possible make the user actions always available:
Use status indicators to discourage unnecessary actions, but allow them anyway.
Use verification and undo to prevent permanent damage from unadvisable actions, rather than disallowing the actions. Users may need to do something some day that is usually “unadvisable.”
Alter app design to make actions always possible in some way. For example, if a field needs to be filled out before an action can be done, prompt the user for the field, rather than disallowing the action.
Control user behavior through organizational policy, not software. Policies are easier to change when the business rules change or when there’s an exception or emergency.
Use disabling when:
The user can do something in the app to make the action available.
Availability is achieved through controls in the same window or its parent.
The user can easily figure out which control does this.
Use toggling controls rather than disabling for turning processes on and off.
Use read-only text boxes rather than disabled text boxes for data that is applicable for the current state unchangeable by the user.
Use hiding (“dynamic UI”):
For actions that are never available to the user in his or her current job.
For indicating different virtual places or things (e.g,. pages on a tab control, where each “tab” is a different place or thing). Make sure visual design is compatible with this: if you are representing different places, then make it look like different places (e.g., the way tabs do)
For swapping large numbers of controls with alternative controls.
Use layout, symbols, and text to explain unavailability, especially disabling. For example, mark your required fields; use tooltips to say why a button is disabled.
Use error messages rather than disabling or hiding when there no other means to indicate graphically or textually how to make an action available.
Further details and rationale at http://www.zuschlogin.com/?p=40.
I nearly always keep the UI static and simply disable (grey out) components that aren't applicable at this moment in time. It can be jarring to the user and confusing if components move around as you show/hiden them as the state changes.
I have seen good examples of both, and bad examples of both.
Your primary goal should be in making sure that your UI design (whatever route you choose) makes the entire process logically sensible to your intended audience.
dynamic is better if you don't want to frustrate your users
Well, that's the idea behind the latest MS Office, right? Controls that are around based on context. That, versus older versions with lots of grayed-out menus and toolbar buttons.
I worked for a number of years on control systems and in those environments, we mimicked the hardware controls (toggles, dials, buttons) that were, of course, static though not always usable. This was a customer requirement and their position was that the operator using the system expected button X to always in the same place. But from the designer and developer standpoint, I was frustrated by the cluttered UI and didn't like it when 95% of the buttons on a screen were grayed out.
I think that it will depend on your audience and the domain and customer requirements. In my shop, I make things dynamic and offer controls that make sense based on context. Typically, we don't show grayed out buttons or menu options that aren't available in the current context. Once the users recognize that they follow certain workflows and those involve particular UI elements when appropriate, they have no problems with (and probably prefer) a dynamic UI.
Less is better.
Why not do both and let the A/B testing tell you what your users prefer?
I think it's better to focus on the user productivity and on the business the software is implementing.
To show operations that does not make sense for a specific user or in a specific moment will not help, disabled or not.
For example, if you have a software that is used in several departments of an organization, each user/department will only be interested in the part of the software that implements the part of the business he is involved to. Anything else is useless for him and only will make the software experience worst. The same applies for a screen that is usefull for a user but shows useless options.
I'd suggest prototyping both and asking your users (or a representative sample) which they prefer and why.
Just to re-iterate what Mitch Wheat said really.
If you make buttons disappear and reappear depending on user actions then there is the danger that the user might think that they've done something that's broken the application.
You are also hiding actions from the user, so it will be harder for them to discover what it can do.
Disabling buttons is a well known paradigm and users will be able to see everything that your application can do and will experiment to see how to enable them.
I think it depends on what users you want to hide design for but in general I would opt for the static version. Don't forget that a user interface doesn't only provide functionality but also information. If you grey out a button you inform the user about it's state (by what he can do and what not) more clearly than removing buttons.
The remove button aproach can work for users that in general have good understanding of the system like admins. But I think you should use this with causion
Grayed out buttons are better, because then the user will know that under some situation such a function is available (and depending on the context the user might be able to guess when it is enabled), and the visual cue of being grayed out will signal to the user that the button can not be clicked, so the user will not try to click it (the problem with a message after clicking is that it comes too late - the user already made a mistake).
Whatever you choose, use constant positions of the buttons. Users often are not read text on the buttons.
Depends. But a clear and compact GUI is a nice thing to have. Why bother with 10 fields/controls you cannot change or use at all. For example on stackoverflow you have a reduced UI if you only have a low reputation, because it doesn't matter at all to the user, that one day he might be able to use them. Another thing is that controls (with borders) usual take more space than just text. If you have information, that currently cannot be changed, I would present them in a very compact text field/label. Depending on the information it even could be placed outside or far way from the form.
According to Joel - neither :-)
Both can make sense, as long as you use paradigms the users are familiar with.
The tab control is basically a dynamic UI that changes depending on the state.
Consistency is probably the most important thing when designing an UI. If buttons pop in and out, they are seen as a visual stimulus, and the user will "spend" attention looking at them.
A subtle, but clearly disabled button (not disappearing) is my preffered choice for designing UI....
.. So I guess that's option 1 :)
A combination of the two.
If a function is not applicable in the current state, disable the button but also place an icon next to the button and associate a tooltip with the icon. The tooltip should explain why the user can't use the button right now.
Attaching the tooltip directly to the button doesn't work so well. Most users won't even hover over the button as they won't expect it to do anything.
And avoid exclamation mark icons. They suggest the user has entered an invalid value (unless they actually have.)
I'd like to say I always do this, but unfortunately it does take significantly more coding time, and clients aren't always willing to pay for that.
A modal UI introduces mode errors. Always.
You currently seem to want to choose between two different ways of presenting a modal UI. From those I'd say the first one is superior (unless you really have many possible commands, see the Office 2007 UI for a good example how to handle this, but it's not common to have that many).
If you have the space and you haven't too many controls then I'd really go with disabled controls as it shows th user what is possible. Furthermore you might want to make it really clear which mode the UI is in (not just from the buttons that are enabled). I've seen user interfaces where you had disabled buttons but the user couldn't figure out what he has to do to enable them.
In any event be sure to do usability testing to find out what way is less error-prone on behalf of your users.
I like to keep all advanced options hidden under a "More >>"/"Less <<" button, or "Advanced Mode" checkbox, depending on the context and application.
Once clicked/checked, the window expands to reveal more options.
In terms of action availability though (like a Wizard featuring Next/Previous buttons) I always show them, and enable/disable them according to what functionality is possible.
The dynamic UI is done like the UI may keep changing. The fields may keep changing. So depending upon that the information of the field fetched from internet the ui is designed.
Rembr! all the similar fields have same design so u can keep changing the UI design and hence the application. without uploading the newer version of the application to the cloud or play store you can change the design of the UI.
As a example the UI pattern and fields are filled in the excel sheet and uploaded to cloud and the app has the access to download the excel sheet.
the above explanation holds good for an android dynamic app development

Resources