## page was copied from JavaScript
#format wiki
#language en
= JavaScript in Launchpad =
This page covers everything to do with JavaScript development in Launchpad.
Some useful links:
* JavaScriptReviewNotes
* TestingJavaScript
* [[JavascriptUnitTesting | JavaScript unit testing]]
* JavaScriptBuildSystem
* See [[CategoryJavaScript|all the JavaScript-related pages]] on the wiki
== Zope, JavaScript, and YUI3 Tips ==
Zope's TAL engine is clever, and helpfully breaks any " />
}}}
----
Zope3 forms have field names with dots in them, like this:
{{{
}}}
This makes it impossible to grab nodes with CSS3 selectors, or with YUI3's `Y.get()` function.
For example, this will return `null`:
{{{
Y.get('#field.action.visibility');
}}}
(Because it looks for an element with ID field` and with `action` and `visibility` in its classes.)
You can work around this by using the attribute selector:
{{{
Y.get("id='field.action.visibility']");
}}}
----
Sometimes you need to pass a raw DOM node into another JavaScript library, but YUI3's `Y.get()` function returns a YUI3 `Node` instance, which is incompatible.
You can unwrap the `Node` instance like this:
{{{
var yui_node = Y.get('#foo');
var raw_node = Y.Node.getDOMNode(yui_node);
}}}
----
By default the YUI3 test runner stops any JavaScript exceptions from propagating. This prevents the test suite from breaking on errors in the code under test, but it also stops Firebug from stopping on errors in the test case itself.
You can force the debugger to open on test-case programming errors by selecting both the `Break on All Errors` and `Track Throw/Catch` options under the Firebug `Script` tab's `Options` menu.
----
Here is a clean way to disable a YUI3 widget in a specific browser:
{{{
initializer: function() {
if (Y.UA.ie) {
// XXX mars 2009-03-30 bug=352022
// Disabled in IE due to weirdness.
this.disabled();
this.render = function();
}
}
}}}
This technique means the widget callsites remain the same, but perform null operations. However, the developer integrating the widget still has to work around the fact that the widget will not be publishing new values or events.
----
Every browser page has a collection of links and JSON available to Javascript. Server-side code can populate that collection by adapting the request to [[http://bazaar.launchpad.net/~lazr-developers/lazr.restful/trunk/view/head:/src/lazr/restful/interfaces/_rest.py|lazr.restful.interfaces]].IJSONRequestCache. The resulting object will allow you to put in objects to be marshalled to JSON in the "objects" mapping, and objects to be sent as links in the "links" mapping.
----
CategoryCategory